947 lines
		
	
	
		
			51 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			947 lines
		
	
	
		
			51 KiB
		
	
	
	
		
			C#
		
	
	
using IRaCIS.Application.Contracts;
 | 
						||
using IRaCIS.Core.Application.Contracts;
 | 
						||
using IRaCIS.Core.Domain.Models;
 | 
						||
using IRaCIS.Core.Domain.Share;
 | 
						||
using IRaCIS.Core.Infrastructure.Extention;
 | 
						||
using Microsoft.AspNetCore.Mvc;
 | 
						||
 | 
						||
namespace IRaCIS.Core.Application
 | 
						||
{
 | 
						||
    [ApiExplorerSettings(GroupName = "Trial")]
 | 
						||
    public class PersonalWorkstation : BaseService
 | 
						||
    {
 | 
						||
        private readonly IRepository<Trial> _trialRepository;
 | 
						||
        private readonly IRepository<TrialUser> _trialUserRepository;
 | 
						||
        private readonly IRepository<TrialDocument> _trialDocumentRepository;
 | 
						||
        private readonly IRepository<SystemDocument> _systemDocumentRepository;
 | 
						||
        private readonly IRepository<SystemNotice> _systemNoticeRepository;
 | 
						||
 | 
						||
        public PersonalWorkstation(IRepository<Trial> trialRepository, IRepository<TrialUser> trialUserRepository, IRepository<TrialDocument> trialDocumentRepository,
 | 
						||
            IRepository<SystemDocument> systemDocumentRepository, IRepository<SystemNotice> systemNoticeRepository)
 | 
						||
        {
 | 
						||
            _trialRepository = trialRepository;
 | 
						||
            _trialUserRepository = trialUserRepository;
 | 
						||
            _trialDocumentRepository = trialDocumentRepository;
 | 
						||
            _systemDocumentRepository = systemDocumentRepository;
 | 
						||
            _systemNoticeRepository = systemNoticeRepository;
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 个人面板 统计值
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        public async Task<PersonalStataDTO> GetBasicStat()
 | 
						||
        {
 | 
						||
 | 
						||
            return new PersonalStataDTO()
 | 
						||
            {
 | 
						||
                //正参与的数量
 | 
						||
                TrialCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin
 | 
						||
                    ? await _trialRepository.CountAsync()
 | 
						||
                    : await _trialUserRepository.Where(t => t.UserId == _userInfo.Id).CountAsync(),
 | 
						||
 | 
						||
                DeletedCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin
 | 
						||
                    ? await _trialRepository.AsQueryable(true).CountAsync(t => t.IsDeleted)
 | 
						||
                    : await _trialUserRepository.AsQueryable(true).Where(t => t.UserId == _userInfo.Id && t.IsDeleted)
 | 
						||
                        .CountAsync(),
 | 
						||
 | 
						||
 | 
						||
                TotalNeedSignTrialDocCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin
 | 
						||
                    ? 0
 | 
						||
                    : await _trialDocumentRepository.AsQueryable(true).Where(t => t.Trial.TrialStatusStr != StaticData.TrialState.TrialStopped)
 | 
						||
                        .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                        .Where(t => t.IsDeleted == false || (t.IsDeleted == true && t.TrialDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime != null)))
 | 
						||
 | 
						||
                        .SelectMany(t => t.NeedConfirmedUserTypeList)
 | 
						||
                        .CountAsync(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId),
 | 
						||
 | 
						||
                HaveSignedTrialDocCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin
 | 
						||
                    ? 0
 | 
						||
                    //废除了 已经签署了也要算进去
 | 
						||
                    : await _trialDocumentRepository.AsQueryable(true).Where(t => t.Trial.TrialStatusStr != StaticData.TrialState.TrialStopped)
 | 
						||
                        .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                        .Where(t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId))
 | 
						||
                        .SelectMany(t => t.TrialDocConfirmedUserList)
 | 
						||
                        .CountAsync(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime != null),
 | 
						||
 | 
						||
                TotalNeedSignSystemDocCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin
 | 
						||
                    ? 0
 | 
						||
                    : await _systemDocumentRepository
 | 
						||
                        .Where(t => t.IsDeleted == false || (t.IsDeleted == true && t.SystemDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime != null)))
 | 
						||
                        .SelectMany(t => t.NeedConfirmedUserTypeList)
 | 
						||
                        .CountAsync(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId),
 | 
						||
 | 
						||
 | 
						||
                HaveSignedSystemDocCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin
 | 
						||
                    ? 0
 | 
						||
                    : await _systemDocumentRepository
 | 
						||
                        .Where(t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId))
 | 
						||
                        .SelectMany(t => t.SystemDocConfirmedUserList)
 | 
						||
                        .CountAsync(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime != null),
 | 
						||
 | 
						||
                TotalApprovalRequiredCount =
 | 
						||
                    _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM ?
 | 
						||
                    _trialRepository.Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)).SelectMany(t => t.TrialSiteSurveyList).Where(t => t.State == TrialSiteSurveyEnum.SPMApproved).Count()
 | 
						||
                    : _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM
 | 
						||
                    ? _trialRepository.Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)).SelectMany(t => t.TrialSiteSurveyList).Where(t => t.State == TrialSiteSurveyEnum.CRCSubmitted).Count()
 | 
						||
                    : 0,
 | 
						||
 | 
						||
 | 
						||
                TotalSystemNoticeCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin
 | 
						||
                    ? 0 : await _systemNoticeRepository.Where(t => t.NoticeUserTypeList.Any(t => t.UserTypeId == _userInfo.UserTypeId) && t.NoticeStateEnum == Domain.Share.Management.SystemNotice_NoticeStateEnum.HavePublished)
 | 
						||
 | 
						||
                    .CountAsync(),
 | 
						||
 | 
						||
                NeedReadSystemNoticeCount = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin
 | 
						||
                    ? 0 : await _systemNoticeRepository.Where(t => t.NoticeUserTypeList.Any(t => t.UserTypeId == _userInfo.UserTypeId) && t.NoticeStateEnum == Domain.Share.Management.SystemNotice_NoticeStateEnum.HavePublished
 | 
						||
                     && !t.NoticeUserReadList.Any(t => t.CreateUserId == _userInfo.Id))
 | 
						||
                    .Where(t => t.EndDate == null || t.EndDate != null && t.EndDate > DateTime.Now)
 | 
						||
                    .CountAsync(),
 | 
						||
 | 
						||
 | 
						||
            };
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 中心调研    每个项目 需要处理的审批统计
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="query"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<PageOutput<TrialSiteSurveyStat>> GetSiteSurveyApprovalList(TrialSiteSurveyStatQuery query)
 | 
						||
        {
 | 
						||
 | 
						||
 | 
						||
            if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager ||
 | 
						||
                _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM ||
 | 
						||
                _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM ||
 | 
						||
                _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM)
 | 
						||
            {
 | 
						||
                return await _trialRepository
 | 
						||
                    .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                    .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM, c => c.TrialSiteSurveyList.Where(t => t.State == TrialSiteSurveyEnum.SPMApproved).Count() > 0)
 | 
						||
                    .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM, c => c.TrialSiteSurveyList.Where(t => t.State == TrialSiteSurveyEnum.CRCSubmitted).Count() > 0)
 | 
						||
                    .ProjectTo<TrialSiteSurveyStat>(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id })
 | 
						||
                    .OrderByDescending(t => t.ApprovalRequiredCount).ToPagedListAsync(query.PageIndex, query.PageSize, query.SortField, query.Asc);
 | 
						||
            }
 | 
						||
 | 
						||
            else
 | 
						||
            {
 | 
						||
                return new PageOutput<TrialSiteSurveyStat>(query.PageIndex, query.PageSize, 0, new List<TrialSiteSurveyStat>());
 | 
						||
 | 
						||
            }
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        ///   待签署的项目文件      需要签署文件数量  系统级别的在第一行
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="query"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<PageOutput<DocSignStat>> GetTrialDocStatList(TrialSiteSurveyStatQuery query)
 | 
						||
        {
 | 
						||
            if (_userInfo.IsAdmin)
 | 
						||
            {
 | 
						||
                return new PageOutput<DocSignStat>(query.PageIndex, query.PageSize, 0, new List<DocSignStat>());
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                var trialDocStat = await _trialRepository/*.AsQueryable(true)*/.Where(t => t.TrialStatusStr != StaticData.TrialState.TrialStopped)
 | 
						||
                    .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                    .WhereIf(!_userInfo.IsAdmin, c => c.TrialDocumentList.Where(t => t.IsDeleted == false && t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId) && !t.TrialDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id && t.ConfirmTime != null))
 | 
						||
                            .Count() > 0)
 | 
						||
                    .ProjectTo<DocSignStat>(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id, userTypeId = _userInfo.UserTypeId })
 | 
						||
                    .OrderByDescending(t => t.WaitSignCount)
 | 
						||
                    .ToPagedListAsync(query.PageIndex, query.PageSize, query.SortField, query.Asc);
 | 
						||
 | 
						||
 | 
						||
                return trialDocStat;
 | 
						||
            }
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        #region PM  APM 待办
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 一致性核查待处理
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <param name="_subjectVisitRepository"></param>
 | 
						||
        /// <param name="_trialRepository"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<CheckToBeDoneDto>>> GetCheckToBeDoneList(CheckToBeDoneQuery inQuery,
 | 
						||
            [FromServices] IRepository<SubjectVisit> _subjectVisitRepository,
 | 
						||
              [FromServices] IRepository<Trial> _trialRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var query = _trialRepository
 | 
						||
                .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Select(t => new CheckToBeDoneDto()
 | 
						||
                {
 | 
						||
                    TrialId = t.Id,
 | 
						||
                    ResearchProgramNo = t.ResearchProgramNo,
 | 
						||
                    ExperimentName = t.ExperimentName,
 | 
						||
                    TrialCode = t.TrialCode,
 | 
						||
                    UrgentCount = t.SubjectVisitList.Where(u => (u.CheckState == CheckStateEnum.ToCheck || u.CheckState == CheckStateEnum.CVIng) && u.IsUrgent).Count(),
 | 
						||
 | 
						||
                    ToBeCheckedCount = t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.ToCheck).Count(),
 | 
						||
 | 
						||
                    ToBeRepliedCount = t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.CVIng &&
 | 
						||
                    u.CheckChallengeDialogList.OrderByDescending(t=>t.CreateTime).First().UserTypeEnum== UserTypeEnum.ClinicalResearchCoordinator).Count(),
 | 
						||
                });
 | 
						||
 | 
						||
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            var totalToBeCheckedCount = await _subjectVisitRepository.Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(u => u.CheckState == CheckStateEnum.ToCheck).CountAsync();
 | 
						||
 | 
						||
            var totalToBeRepliedCount = await _subjectVisitRepository.Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(u => u.CheckState == CheckStateEnum.CVIng &&
 | 
						||
                    u.CheckChallengeDialogList.OrderByDescending(t => t.CreateTime).First().UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).CountAsync();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeCheckedCount = totalToBeCheckedCount, TotalToBeRepliedCount = totalToBeRepliedCount });
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 重阅申请待审核
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <param name="_visitTaskReReadingRepository"></param>
 | 
						||
        /// <param name="_trialRepository"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<ReReadingApplyToBeDoneDto>>> GetReReadingApplyToBeDoneList(ReReadingApplyToBeDoneQuery inQuery,
 | 
						||
            [FromServices] IRepository<VisitTaskReReading> _visitTaskReReadingRepository,
 | 
						||
              [FromServices] IRepository<Trial> _trialRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var query = _visitTaskReReadingRepository
 | 
						||
                .Where(t => t.OriginalReReadingTask.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed)
 | 
						||
                .GroupBy(t => new { t.OriginalReReadingTask.Trial.ExperimentName, t.OriginalReReadingTask.Trial.ResearchProgramNo, t.OriginalReReadingTask.Trial.TrialCode, t.OriginalReReadingTask.TrialId })
 | 
						||
                 .Select(g => new ReReadingApplyToBeDoneDto()
 | 
						||
                 {
 | 
						||
                     TrialId = g.Key.TrialId,
 | 
						||
                     ResearchProgramNo = g.Key.ResearchProgramNo,
 | 
						||
                     ExperimentName = g.Key.ExperimentName,
 | 
						||
                     TrialCode = g.Key.TrialCode,
 | 
						||
                     UrgentCount = g.Where(u => u.OriginalReReadingTask.IsUrgent == true).Count(),
 | 
						||
                     ToBeApprovalCount = g.Count(),
 | 
						||
 | 
						||
                 });
 | 
						||
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
 | 
						||
            var toBeApprovalCount = _visitTaskReReadingRepository
 | 
						||
                 .Where(t => t.OriginalReReadingTask.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed).Count();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeApprovalCount = toBeApprovalCount });
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
 | 
						||
        #region SPM  CPM 待办
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 阅片人筛选 
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <param name="_enrollRepository"></param>
 | 
						||
        /// <param name="_trialRepository"></param>
 | 
						||
        /// <returns></returns>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              vvv
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<ReviewerSelectToBeDoneDto>>> GetReviewerSelectToBeDoneList(ReviewerSelectToBeDoneQuery inQuery
 | 
						||
            , [FromServices] IRepository<Enroll> _enrollRepository,
 | 
						||
             [FromServices] IRepository<Trial> _trialRepository)
 | 
						||
        {
 | 
						||
            var query = _trialRepository
 | 
						||
                .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                    .Select(t => new ReviewerSelectToBeDoneDto()
 | 
						||
                    {
 | 
						||
                        TrialId = t.Id,
 | 
						||
                        ResearchProgramNo = t.ResearchProgramNo,
 | 
						||
                        ExperimentName = t.ExperimentName,
 | 
						||
                        TrialCode = t.TrialCode,
 | 
						||
 | 
						||
                        IsUrgent = t.IsUrgent || t.IsSubjectExpeditedView,
 | 
						||
                        ToBeApprovalCount = t.EnrollList.Where(u => u.EnrollStatus == EnrollStatus.HasCommittedToCRO).Count()
 | 
						||
                    });
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            var toBeApprovalCount = await _enrollRepository.Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(u => u.EnrollStatus == EnrollStatus.HasCommittedToCRO).CountAsync();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { ToBeApprovalCount = toBeApprovalCount }); ;
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 重阅审批
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <param name="_visitTaskReReadingRepository"></param>
 | 
						||
        /// <param name="_trialRepository"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<ReReadingApprovalToBeDoneDto>>> GetReReadingApprovalToBeDoneToBeDoneList(ReReadingApprovalToBeDoneQuery inQuery,
 | 
						||
           [FromServices] IRepository<VisitTaskReReading> _visitTaskReReadingRepository,
 | 
						||
              [FromServices] IRepository<Trial> _trialRepository)
 | 
						||
 | 
						||
        {
 | 
						||
            var query = _visitTaskReReadingRepository
 | 
						||
                .Where(t => t.OriginalReReadingTask.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed)
 | 
						||
               .GroupBy(t => new { t.OriginalReReadingTask.Trial.ExperimentName, t.OriginalReReadingTask.Trial.ResearchProgramNo, t.OriginalReReadingTask.Trial.TrialCode, t.OriginalReReadingTask.TrialId })
 | 
						||
                .Select(g => new ReReadingApprovalToBeDoneDto()
 | 
						||
                {
 | 
						||
                    TrialId = g.Key.TrialId,
 | 
						||
                    ResearchProgramNo = g.Key.ResearchProgramNo,
 | 
						||
                    ExperimentName = g.Key.ExperimentName,
 | 
						||
                    TrialCode = g.Key.TrialCode,
 | 
						||
                    UrgentCount = g.Where(u => u.OriginalReReadingTask.IsUrgent == true).Count(),
 | 
						||
                    ToBeApprovalCount = g.Count(),
 | 
						||
 | 
						||
                });
 | 
						||
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            var toBeApprovalCount = _visitTaskReReadingRepository
 | 
						||
                 .Where(t => t.OriginalReReadingTask.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed).Count();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeApprovalCount = toBeApprovalCount });
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
 | 
						||
        #region CRC 待办
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 临床数据
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <param name="_subjectVisitRepository"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<ImageClinicalDataToBeDoneDto>>> GetImageClinicalDataToBeDoneList(ImageClinicalDataToBeDoneQuery inQuery,
 | 
						||
            [FromServices] IRepository<SubjectVisit> _subjectVisitRepository,
 | 
						||
              [FromServices] IRepository<Trial> _trialRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var query = _trialRepository
 | 
						||
                .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(t => t.clinicalDataTrialSets.Any(t => t.ClinicalDataLevel == ClinicalLevel.Subject && t.IsConfirm))
 | 
						||
                .Select(t => new ImageClinicalDataToBeDoneDto()
 | 
						||
                {
 | 
						||
                    TrialId = t.Id,
 | 
						||
                    ResearchProgramNo = t.ResearchProgramNo,
 | 
						||
                    ExperimentName = t.ExperimentName,
 | 
						||
                    TrialCode = t.TrialCode,
 | 
						||
                    UrgentCount = t.SubjectVisitList.Where(u => u.IsBaseLine && u.SubmitState != SubmitStateEnum.Submitted && u.IsUrgent).Count(),
 | 
						||
                    ToBeDealedCount = t.SubjectVisitList.Where(u => u.IsBaseLine && u.SubmitState != SubmitStateEnum.Submitted).Count(),
 | 
						||
 | 
						||
                });
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            var toBeDealedCount = _subjectVisitRepository
 | 
						||
                 .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id) && t.Trial.clinicalDataTrialSets.Any(t => t.ClinicalDataLevel == ClinicalLevel.Subject && t.IsConfirm))
 | 
						||
                 .Where(u => u.IsBaseLine && u.SubmitState != SubmitStateEnum.Submitted).Count();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeDealedCount = toBeDealedCount });
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// CRC影像质疑待处理
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <param name="_subjectVisitRepository"></param>
 | 
						||
        /// <param name="_trialRepository"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<ImageQuestionToBeDoneDto>>> GetCRCImageQuestionToBeDoneList(ImageQuestionToBeDoneQuery inQuery,
 | 
						||
            [FromServices] IRepository<SubjectVisit> _subjectVisitRepository,
 | 
						||
              [FromServices] IRepository<Trial> _trialRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var query = _trialRepository
 | 
						||
                .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Select(t => new ImageQuestionToBeDoneDto()
 | 
						||
                {
 | 
						||
                    TrialId = t.Id,
 | 
						||
                    ResearchProgramNo = t.ResearchProgramNo,
 | 
						||
                    ExperimentName = t.ExperimentName,
 | 
						||
                    TrialCode = t.TrialCode,
 | 
						||
                    UrgentCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
 | 
						||
                    .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC && u.SubjectVisit.IsUrgent).Count(),
 | 
						||
 | 
						||
                    ToBeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
 | 
						||
 | 
						||
                    .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC).Count(),
 | 
						||
 | 
						||
                });
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            var toBeDealedCount = _subjectVisitRepository
 | 
						||
                  .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                  .SelectMany(c => c.QCChallengeList)
 | 
						||
                  .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC).Count();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeDealedCount = toBeDealedCount });
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 核查质疑待处理
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <param name="_subjectVisitRepository"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<ImageCheckQuestionToBeDoneDto>>> GetImageCheckQuestionToBeDoneList(ImageCheckQuestionToBeDoneQuery inQuery,
 | 
						||
            [FromServices] IRepository<SubjectVisit> _subjectVisitRepository,
 | 
						||
              [FromServices] IRepository<Trial> _trialRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var query = _trialRepository
 | 
						||
                .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Select(t => new ImageCheckQuestionToBeDoneDto()
 | 
						||
                {
 | 
						||
                    TrialId = t.Id,
 | 
						||
                    ResearchProgramNo = t.ResearchProgramNo,
 | 
						||
                    ExperimentName = t.ExperimentName,
 | 
						||
                    TrialCode = t.TrialCode,
 | 
						||
                    UrgentCount = t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.CVIng && u.CheckChallengeState == CheckChanllengeTypeEnum.PMWaitCRCReply && u.IsUrgent).Count(),
 | 
						||
                    ToBeReplyedCount = t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.CVIng && u.CheckChallengeState == CheckChanllengeTypeEnum.PMWaitCRCReply).Count()
 | 
						||
 | 
						||
                });
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            var toBeDealedCount = _subjectVisitRepository
 | 
						||
                  .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                  .Where(u => u.CheckState == CheckStateEnum.CVIng && u.CheckChallengeState == CheckChanllengeTypeEnum.PMWaitCRCReply).Count();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeReplyedCount = toBeDealedCount });
 | 
						||
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 影像重传
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <param name="_subjectVisitRepository"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<ImageReUploadToBeDoneDto>>> GetImageReUploadToBeDoneList(ImageReUploadToBeDoneQuery inQuery,
 | 
						||
            [FromServices] IRepository<SubjectVisit> _subjectVisitRepository,
 | 
						||
              [FromServices] IRepository<Trial> _trialRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var query = _trialRepository
 | 
						||
                .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Select(t => new ImageReUploadToBeDoneDto()
 | 
						||
                {
 | 
						||
                    TrialId = t.Id,
 | 
						||
                    ResearchProgramNo = t.ResearchProgramNo,
 | 
						||
                    ExperimentName = t.ExperimentName,
 | 
						||
                    TrialCode = t.TrialCode,
 | 
						||
                    UrgentCount = t.SubjectVisitList.Where(u => u.SubmitState == SubmitStateEnum.ToSubmit && u.IsUrgent && u.IsPMBackOrReReading).Count(),
 | 
						||
                    ToBeReUploadCount = t.SubjectVisitList.Where(u => u.SubmitState == SubmitStateEnum.ToSubmit && u.IsPMBackOrReReading).Count(),
 | 
						||
 | 
						||
                });
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            var toBeDealedCount = _subjectVisitRepository
 | 
						||
                  .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                  .Where(u => u.SubmitState == SubmitStateEnum.ToSubmit && u.IsPMBackOrReReading).Count();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount });
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 加急影像提交
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <param name="_subjectVisitRepository"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<ImageSubmittedToBeDoneDto>>> GetImageSubmittedToBeDoneList(ImageSubmittedToBeDoneQuery inQuery,
 | 
						||
            [FromServices] IRepository<SubjectVisit> _subjectVisitRepository,
 | 
						||
              [FromServices] IRepository<Trial> _trialRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var query = _trialRepository
 | 
						||
                .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Select(t => new ImageSubmittedToBeDoneDto()
 | 
						||
                {
 | 
						||
                    TrialId = t.Id,
 | 
						||
                    ResearchProgramNo = t.ResearchProgramNo,
 | 
						||
                    ExperimentName = t.ExperimentName,
 | 
						||
                    TrialCode = t.TrialCode,
 | 
						||
                    UrgentCount = t.SubjectVisitList.Where(u => u.SubmitState == SubmitStateEnum.ToSubmit && u.IsUrgent).Count(),
 | 
						||
                    ToBeDealedCount = t.SubjectVisitList.Where(u => u.SubmitState == SubmitStateEnum.ToSubmit).Count(),
 | 
						||
 | 
						||
                });
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            var toBeDealedCount = _subjectVisitRepository
 | 
						||
                  .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                  .Where(u => u.SubmitState == SubmitStateEnum.ToSubmit).Count();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount });
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region IQC待办
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 影像质控     待领取 跟项目配置有关系 --未完成
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <param name="_subjectVisitRepository"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<ImageQualityToBeDoneDto>>> GetImageQualityToBeDoneList(ImageQualityToBeDoneQuery inQuery,
 | 
						||
            [FromServices] IRepository<SubjectVisit> _subjectVisitRepository,
 | 
						||
              [FromServices] IRepository<Trial> _trialRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var query = _trialRepository
 | 
						||
                .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(t => t.QCProcessEnum != TrialQCProcess.NotAudit)
 | 
						||
                .Select(t => new ImageQualityToBeDoneDto()
 | 
						||
                {
 | 
						||
                    TrialId = t.Id,
 | 
						||
                    ResearchProgramNo = t.ResearchProgramNo,
 | 
						||
                    ExperimentName = t.ExperimentName,
 | 
						||
                    TrialCode = t.TrialCode,
 | 
						||
 | 
						||
                    // 待审核  加急的(待领取 已领取)--  领取了 还没做完 就是待审核
 | 
						||
                    UrgentCount = t.SubjectVisitList.Where(u => u.CurrentActionUserId == _userInfo.Id && u.IsUrgent).Count(),
 | 
						||
 | 
						||
 | 
						||
                    //待领取量
 | 
						||
                    ToBeClaimedCount = t.SubjectVisitList.Where(u =>u.CurrentActionUserId==null &&(u.PreliminaryAuditUserId==null ||(u.PreliminaryAuditUserId!=_userInfo.Id && u.ReviewAuditUserId==null)) ).Count(),
 | 
						||
 | 
						||
                    //待审核通过,统计从已领取到QC提交之间的      已领取 待审核 审核中   (审核完成  领取人就会清理 所以只用查询当前领取人是自己的就好了)
 | 
						||
                    ToBeReviewedCount = t.SubjectVisitList.Where(u => u.CurrentActionUserId == _userInfo.Id).Count()
 | 
						||
 | 
						||
                });
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
 | 
						||
            var toBeClaimedCount = _subjectVisitRepository
 | 
						||
                .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(u => u.CurrentActionUserId == null && (u.PreliminaryAuditUserId == null || (u.PreliminaryAuditUserId != _userInfo.Id && u.ReviewAuditUserId == null))).Count();
 | 
						||
 | 
						||
 | 
						||
            var toBeReviwedCount = _subjectVisitRepository.Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(u => u.CurrentActionUserId == _userInfo.Id).Count();
 | 
						||
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeClaimedCount = toBeClaimedCount, TotalToBeReviewedCount= toBeReviwedCount });
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// QC 质疑
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <param name="_subjectVisitRepository"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<ImageQuestionToBeDoneDto>>> GetQCImageQuestionToBeDoneList(ImageQuestionToBeDoneQuery inQuery,
 | 
						||
            [FromServices] IRepository<SubjectVisit> _subjectVisitRepository,
 | 
						||
              [FromServices] IRepository<Trial> _trialRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var query = _trialRepository
 | 
						||
                .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Select(t => new ImageQuestionToBeDoneDto()
 | 
						||
                {
 | 
						||
                    TrialId = t.Id,
 | 
						||
                    ResearchProgramNo = t.ResearchProgramNo,
 | 
						||
                    ExperimentName = t.ExperimentName,
 | 
						||
                    TrialCode = t.TrialCode,
 | 
						||
                    UrgentCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
 | 
						||
                    .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && u.SubjectVisit.IsUrgent).Count(),
 | 
						||
                    ToBeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
 | 
						||
                    .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count(),
 | 
						||
 | 
						||
                });
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            var toBeDealedCount = _subjectVisitRepository
 | 
						||
                  .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                  .SelectMany(c => c.QCChallengeList)
 | 
						||
                  .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount });
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
 | 
						||
        #region IR待办
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// IR 影像阅片 待阅量 
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <param name="_visitTaskRepository"></param>
 | 
						||
        /// <param name="_trialReadingCriterionRepository"></param>
 | 
						||
        /// <param name="_trialRepository"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<IRImageReadingToBeDoneDto>>> GetIRImageReadingToBeDoneList(IRImageReadingToBeDoneQuery inQuery,
 | 
						||
           [FromServices] IRepository<VisitTask> _visitTaskRepository,
 | 
						||
            [FromServices] IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository,
 | 
						||
           [FromServices] IRepository<Trial> _trialRepository)
 | 
						||
        {
 | 
						||
 | 
						||
 | 
						||
            var newQuery = _trialReadingCriterionRepository.Where(t => t.IsConfirm == true && t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                 .Select(c => new IRImageReadingToBeDoneDto()
 | 
						||
                 {
 | 
						||
                     TrialId = c.TrialId,
 | 
						||
                     ResearchProgramNo = c.Trial.ResearchProgramNo,
 | 
						||
                     ExperimentName = c.Trial.ExperimentName,
 | 
						||
                     TrialCode = c.Trial.TrialCode,
 | 
						||
                     CriterionName = c.CriterionName,
 | 
						||
                     TrialReadingCriterionId = c.Id,
 | 
						||
 | 
						||
                     UrgentCount = c.VisitTaskList.AsQueryable().Where(t => t.DoctorUserId == _userInfo.Id && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect)
 | 
						||
                           // 前序 不存在 未一致性核查未通过的
 | 
						||
                           .Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum))
 | 
						||
                           //前序 不存在  未生成任务的访视
 | 
						||
                           .Where(t => c.IsAutoCreate ? !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum) : true)
 | 
						||
 | 
						||
                           .Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true))
 | 
						||
                           .Count(t => t.IsUrgent),
 | 
						||
 | 
						||
 | 
						||
                     UnReadCount = c.VisitTaskList.Where(t => t.DoctorUserId == _userInfo.Id && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect)
 | 
						||
                          // 前序 不存在 未一致性核查未通过的
 | 
						||
                          .Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum))
 | 
						||
                          //前序 不存在  未生成任务的访视
 | 
						||
                          //.WhereIf(g.Key.IsAutoCreate == false, t => !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum))
 | 
						||
                          .Where(t => c.IsAutoCreate ? !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum) : true)
 | 
						||
 | 
						||
                          .Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true))
 | 
						||
                          .Count(),
 | 
						||
 | 
						||
 | 
						||
 | 
						||
                     HaveSignedCount = c.VisitTaskList.Where(t => t.DoctorUserId == _userInfo.Id && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze)
 | 
						||
                                       && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count(),
 | 
						||
                 })
 | 
						||
 | 
						||
                ;
 | 
						||
 | 
						||
            #region 废弃
 | 
						||
            //var query = _trialRepository
 | 
						||
            //  .Select(t => new IRImageReadingToBeDoneDto()
 | 
						||
            //  {
 | 
						||
            //      TrialId = t.Id,
 | 
						||
            //      ResearchProgramNo = t.ResearchProgramNo,
 | 
						||
            //      ExperimentName = t.ExperimentName,
 | 
						||
            //      TrialCode = t.TrialCode,
 | 
						||
 | 
						||
 | 
						||
            //      UrgentCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
 | 
						||
            //      .Where(u => u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && u.SubjectVisit.IsUrgent).Count(),
 | 
						||
 | 
						||
            //      UnReadCount=t.VisitTaskList.Where(t => t.DoctorUserId == _userInfo.Id  && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect)
 | 
						||
            //      // 前序 不存在 未一致性核查未通过的
 | 
						||
            //      .Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum))
 | 
						||
            //     //前序 不存在  未生成任务的访视
 | 
						||
            //     .Where(t=>t.TrialReadingCriterion.IsAutoCreate == false?  !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum):true)
 | 
						||
 | 
						||
            //      .Where(y=>y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true))
 | 
						||
            //      .Count(),
 | 
						||
 | 
						||
            //      HaveSignedCount = t.VisitTaskList.Where(t => t.DoctorUserId == _userInfo.Id 
 | 
						||
            //      && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze) 
 | 
						||
            //      && t.ReadingTaskState==ReadingTaskState.HaveSigned).Count()
 | 
						||
 | 
						||
            //  });
 | 
						||
 | 
						||
            // 不能对包含聚合或子查询的表达式执行聚合函数
 | 
						||
 | 
						||
            //var query = _visitTaskRepository.Where(t => t.DoctorUserId == _userInfo.Id && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze))
 | 
						||
            //    .GroupBy(t => new { t.TrialId, t.Trial.ResearchProgramNo, t.Trial.TrialCode, t.Trial.ExperimentName, t.TrialReadingCriterionId, t.TrialReadingCriterion.CriterionName, t.TrialReadingCriterion.IsAutoCreate })
 | 
						||
            //    .Select(g => new IRImageReadingToBeDoneDto()
 | 
						||
            //    {
 | 
						||
            //        TrialId = g.Key.TrialId,
 | 
						||
            //        ResearchProgramNo = g.Key.ResearchProgramNo,
 | 
						||
            //        ExperimentName = g.Key.ExperimentName,
 | 
						||
            //        TrialCode = g.Key.TrialCode,
 | 
						||
            //        CriterionName = g.Key.CriterionName,
 | 
						||
            //        TrialReadingCriterionId = g.Key.TrialReadingCriterionId,
 | 
						||
 | 
						||
            //        //UrgentCount = g.AsQueryable().Where(t => t.DoctorUserId == _userInfo.Id && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect)
 | 
						||
            //        //      // 前序 不存在 未一致性核查未通过的
 | 
						||
            //        //      .Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum))
 | 
						||
            //        //     //前序 不存在  未生成任务的访视
 | 
						||
            //        //     .Where( t => g.Key.IsAutoCreate ? !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum):true)
 | 
						||
 | 
						||
            //        //      .Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true))
 | 
						||
            //        //      .Count(t=>t.IsUrgent),
 | 
						||
 | 
						||
            //        UnReadCount = g.Where(t => t.DoctorUserId == _userInfo.Id && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect)
 | 
						||
            //              // 前序 不存在 未一致性核查未通过的
 | 
						||
            //              .Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum))
 | 
						||
            //              //前序 不存在  未生成任务的访视
 | 
						||
            //              //.WhereIf(g.Key.IsAutoCreate == false, t => !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum))
 | 
						||
            //              //.Where(t => g.Key.IsAutoCreate ? !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum) : true)
 | 
						||
 | 
						||
            //              .Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true))
 | 
						||
            //              .Count(),
 | 
						||
 | 
						||
            //        HaveSignedCount = g.Where(t => t.DoctorUserId == _userInfo.Id && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze)
 | 
						||
            //                            && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count(),
 | 
						||
 | 
						||
            //    });
 | 
						||
            #endregion
 | 
						||
 | 
						||
 | 
						||
 | 
						||
            var result = await newQuery.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(IRImageReadingToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            var toBeDealedCount = _trialRepository
 | 
						||
                   .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                    .SelectMany(t => t.VisitTaskList)
 | 
						||
                   .Where(t => t.DoctorUserId == _userInfo.Id && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect)
 | 
						||
                   // 前序 不存在 未一致性核查未通过的
 | 
						||
                   .Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum))
 | 
						||
                   //前序 不存在  未生成任务的访视
 | 
						||
                   .Where(t => t.TrialReadingCriterion.IsAutoCreate == false ? !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum) : true)
 | 
						||
 | 
						||
                  .Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true))
 | 
						||
                  .Count();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalUnReadCount = toBeDealedCount });
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// IR医学反馈 
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<MedicalCommentsToBeDoneDto>>> GetIRMedicalCommentsToBeDoneList(MedicalCommentsToBeDoneQuery inQuery,
 | 
						||
             [FromServices] IRepository<TaskMedicalReview> _taskMedicalReviewRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var query = _taskMedicalReviewRepository
 | 
						||
                .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(t => t.IsClosedDialog == false)
 | 
						||
                .GroupBy(t => new
 | 
						||
                {
 | 
						||
                    t.TrialId,
 | 
						||
                    t.Trial.ResearchProgramNo,
 | 
						||
                    t.Trial.ExperimentName,
 | 
						||
                    t.Trial.TrialCode,
 | 
						||
                    t.VisitTask.TrialReadingCriterionId,
 | 
						||
                    t.VisitTask.TrialReadingCriterion.CriterionName
 | 
						||
                })
 | 
						||
                .Select(g => new MedicalCommentsToBeDoneDto()
 | 
						||
                {
 | 
						||
                    TrialId = g.Key.TrialId,
 | 
						||
                    ResearchProgramNo = g.Key.ResearchProgramNo,
 | 
						||
                    ExperimentName = g.Key.ExperimentName,
 | 
						||
                    TrialCode = g.Key.TrialCode,
 | 
						||
                    CriterionName = g.Key.CriterionName,
 | 
						||
                    TrialReadingCriterionId = g.Key.TrialReadingCriterionId,
 | 
						||
                    UrgentCount = g.Where(u => u.VisitTask.IsUrgent
 | 
						||
                    && u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.MIM).Count(),
 | 
						||
 | 
						||
                    ToBeReplyedCount = g.Where(u =>
 | 
						||
                     u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.MIM).Count(),
 | 
						||
 | 
						||
                });
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            var toBeDealedCount = _taskMedicalReviewRepository
 | 
						||
                .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(t => t.IsClosedDialog == false)
 | 
						||
                .Where(u => u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.MIM).Count();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount });
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region MIM待办
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// MIM医学反馈 
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<MedicalCommentsToBeDoneDto>>> GetMIMMedicalCommentsToBeDoneList(MedicalCommentsToBeDoneQuery inQuery,
 | 
						||
             [FromServices] IRepository<TaskMedicalReview> _taskMedicalReviewRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var query = _taskMedicalReviewRepository
 | 
						||
                 .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                .Where(t => t.IsClosedDialog == false)
 | 
						||
                .GroupBy(t => new
 | 
						||
                {
 | 
						||
                    t.TrialId,
 | 
						||
                    t.Trial.ResearchProgramNo,
 | 
						||
                    t.Trial.ExperimentName,
 | 
						||
                    t.Trial.TrialCode,
 | 
						||
                    t.VisitTask.TrialReadingCriterionId,
 | 
						||
                    t.VisitTask.TrialReadingCriterion.CriterionName
 | 
						||
                })
 | 
						||
                .Select(g => new MedicalCommentsToBeDoneDto()
 | 
						||
                {
 | 
						||
                    TrialId = g.Key.TrialId,
 | 
						||
                    ResearchProgramNo = g.Key.ResearchProgramNo,
 | 
						||
                    ExperimentName = g.Key.ExperimentName,
 | 
						||
                    TrialCode = g.Key.TrialCode,
 | 
						||
                    CriterionName = g.Key.CriterionName,
 | 
						||
 | 
						||
                    UrgentCount = g.Where(u => u.VisitTask.IsUrgent
 | 
						||
                    && u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer).Count(),
 | 
						||
 | 
						||
                    ToBeReplyedCount = g.Where(u =>
 | 
						||
                     u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer).Count(),
 | 
						||
 | 
						||
                });
 | 
						||
 | 
						||
            var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            var toBeDealedCount = _taskMedicalReviewRepository
 | 
						||
                  .Where(t => t.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                  .Where(t => t.IsClosedDialog == false)
 | 
						||
                  .Where(u => u.ReadingMedicalReviewDialogList.OrderByDescending(l => l.CreateTime).First().UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer).Count();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = toBeDealedCount });
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
 | 
						||
        #region 项目列表查询
 | 
						||
 | 
						||
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<TrialToBeDoneDto>>> GetTrialToBeDoneList(TrialToBeDoneQuery inQuery,
 | 
						||
              [FromServices] IRepository<TaskMedicalReview> _taskMedicalReviewRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var isPM = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager|| _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM;
 | 
						||
            var isCRC = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator;
 | 
						||
            var isIQC = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC;
 | 
						||
            var isMIM = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.MIM;
 | 
						||
            var isSPMOrCPM = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM;
 | 
						||
 | 
						||
 | 
						||
            var query = _trialRepository.AsQueryable().IgnoreQueryFilters()
 | 
						||
 | 
						||
             .WhereIf(inQuery.SponsorId != null, o => o.SponsorId == inQuery.SponsorId)
 | 
						||
             .WhereIf(!string.IsNullOrEmpty(inQuery.Code), o => o.TrialCode.Contains(inQuery.Code))
 | 
						||
             .WhereIf(!string.IsNullOrEmpty(inQuery.ResearchProgramNo), o => o.ResearchProgramNo.Contains(inQuery.ResearchProgramNo))
 | 
						||
             .WhereIf(!string.IsNullOrWhiteSpace(inQuery.ExperimentName), o => o.ExperimentName.Contains(inQuery.ExperimentName))
 | 
						||
             .WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin, t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id && t.IsDeleted == false) && t.IsDeleted == false)
 | 
						||
             .Select(t => new TrialToBeDoneDto()
 | 
						||
             {
 | 
						||
                 TrialId = t.Id,
 | 
						||
                 ResearchProgramNo = t.ResearchProgramNo,
 | 
						||
                 ExperimentName = t.ExperimentName,
 | 
						||
                 TrialCode = t.TrialCode,
 | 
						||
                 CreateTime=t.CreateTime,
 | 
						||
                 Sponsor= _userInfo.IsEn_Us? t.Sponsor.SponsorName:t.Sponsor.SponsorNameCN,
 | 
						||
                 TrialStatusStr=t.TrialStatusStr,
 | 
						||
 | 
						||
                 ExpetiedTaskCount= isPM ?   t.VisitTaskList.Where(t=>t.IsUrgent).Count():0,
 | 
						||
                
 | 
						||
                 ReReadingApprovalCount= isPM? t.VisitTaskReReadingList.Where(t=>t.OriginalReReadingTask.ReReadingApplyState==ReReadingApplyState.DocotorHaveApplyed).Count():0,
 | 
						||
                
 | 
						||
                 PendingReconciliationCount=isPM?  t.SubjectVisitList.Where(t=>t.CheckState==CheckStateEnum.ToCheck).Count():0,
 | 
						||
                
 | 
						||
                 PendingResponseCount=isPM? t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.CVIng &&
 | 
						||
                    u.CheckChallengeDialogList.OrderByDescending(t => t.CreateTime).First().UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count() : 0
 | 
						||
 | 
						||
 | 
						||
 | 
						||
             });
 | 
						||
 | 
						||
 | 
						||
            
 | 
						||
            //.ProjectTo<TrialDetailDTO>(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id });
 | 
						||
 | 
						||
            var result= await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? "CreateTime" : inQuery.SortField, inQuery.Asc);
 | 
						||
 | 
						||
            return ResponseOutput.Ok(result, new { TotalToBeReUploadCount = 0 });
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        #endregion
 | 
						||
    }
 | 
						||
}
 |