using IRaCIS.Application.ExpressionExtend; using IRaCIS.Application.Interfaces; using IRaCIS.Application.ViewModels; using IRaCIS.Core.Application.Contracts.RequestAndResponse; using IRaCIS.Core.Domain.Interfaces; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; using IRaCIS.Infra.Data.ExpressionExtend; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; namespace IRaCIS.Application.Services { public class StatisticsService : IStatisticsService { private readonly IDoctorRepository _doctorRepository; private readonly ITrialRepository _trialRepository; private readonly IEnrollRepository _enrollRepository; private readonly IWorkloadRepository _workloadRepository; private readonly ICRORepository _croCompanyRepository; private readonly IDictionaryRepository _dictionaryRepository; private readonly IHospitalRepository _hospitalRepository; private readonly IEnrollDetailRepository _enrollDetailRepository; private readonly IUserRepository _userRepository; private readonly IUserTrialRepository _userTrialRepository; public StatisticsService(IDoctorRepository doctorRepository, ITrialRepository trialRepository, IEnrollRepository intoGroupRepository, IWorkloadRepository workloadRepository, ICRORepository croCompanyRepository, IDictionaryRepository dictionaryRepository, IHospitalRepository hospitalRepository, IEnrollDetailRepository enrollDetailRepository, IUserRepository userRepository, IUserTrialRepository userTrialRepository) { _doctorRepository = doctorRepository; _trialRepository = trialRepository; _enrollRepository = intoGroupRepository; _workloadRepository = workloadRepository; _croCompanyRepository = croCompanyRepository; _dictionaryRepository = dictionaryRepository; _hospitalRepository = hospitalRepository; _enrollDetailRepository = enrollDetailRepository; _userRepository = userRepository; _userTrialRepository = userTrialRepository; } public PageOutput GetWorkloadByTrialAndReviewer(StatisticsWorkloadQueryParam param, Guid userId) { var currentUser = _userRepository.FindSingleOrDefault(u => u.Id == userId); var bDate = new DateTime(param.BeginDate.Year, param.BeginDate.Month, param.BeginDate.Day); var eDate = new DateTime(param.EndDate.Year, param.EndDate.Month, param.EndDate.Day); eDate = eDate.AddDays(1); Expression> workloadLambda = x => x.DataFrom == (int)WorkLoadFromStatus.FinalConfirm; workloadLambda = workloadLambda.And(x => x.WorkTime >= bDate && x.WorkTime < eDate); Expression> trialLambda = x => true; if (currentUser.SuperAdmin) //超级管理员按照条件查询所有 { if (Guid.Empty != param.CroId && param.CroId != null) { trialLambda = trialLambda.And(u => u.CROId == param.CroId); } } else if (currentUser.UserType.Contains("CROCoordinator")) //协调者看CRO下面的 { trialLambda = trialLambda.And(u => u.CROId == currentUser.OrganizationId); } else //不管是精鼎的pm还是我们的pm 还是运维人员 只能看到自己参与项目的统计 { List trialIdList = _userTrialRepository.Find(u => u.UserId == userId&&u.SiteId==Guid.Empty).Select(u => u.TrialId).ToList(); trialLambda = trialLambda.And(u => trialIdList.Contains(u.Id)); } if (!string.IsNullOrWhiteSpace(param.TrialCode)) { trialLambda = trialLambda.And(u => u.Code.Contains(param.TrialCode.Trim())); } Expression> doctorLambda = x => true; if (!string.IsNullOrWhiteSpace(param.Reviewer)) { var reviewer = param.Reviewer.Trim(); doctorLambda = doctorLambda.And(u => u.ChineseName.Contains(reviewer) || u.FirstName.Contains(reviewer) || u.LastName.Contains(reviewer) || u.Code.Contains(reviewer) ); } if (Guid.Empty != param.HospitalId && param.HospitalId != null) { doctorLambda = doctorLambda.And(u => u.HospitalId == param.HospitalId); } var workloadQuery = from workLoad in _workloadRepository.GetAll().Where(workloadLambda) join trial in _trialRepository.Find(trialLambda) on workLoad.TrialId equals trial.Id join doctor in _doctorRepository.Find(doctorLambda) on workLoad.DoctorId equals doctor.Id group workLoad by new { workLoad.DoctorId, workLoad.TrialId } into gWorkLoad select new { DoctorId = gWorkLoad.Key.DoctorId, TrialId = gWorkLoad.Key.TrialId, Downtime = gWorkLoad.Sum(t => t.Downtime), Training = gWorkLoad.Sum(t => t.Training), Timepoint = gWorkLoad.Sum(t => t.Timepoint), TimepointIn24H = gWorkLoad.Sum(t => t.TimepointIn24H), TimepointIn48H = gWorkLoad.Sum(t => t.TimepointIn48H), Global = gWorkLoad.Sum(t => t.Global), Adjudication = gWorkLoad.Sum(t => t.Adjudication), AdjudicationIn24H = gWorkLoad.Sum(t => t.AdjudicationIn24H), AdjudicationIn48H = gWorkLoad.Sum(t => t.AdjudicationIn48H), RefresherTraining= gWorkLoad.Sum(t => t.RefresherTraining), }; var query = from w in workloadQuery join trial in _trialRepository.Find(trialLambda) on w.TrialId equals trial.Id into t from trialItem in t.DefaultIfEmpty() join doctor in _doctorRepository.Find(doctorLambda) on w.DoctorId equals doctor.Id into tt from doctorItem in tt.DefaultIfEmpty() join cro in _croCompanyRepository.GetAll() on trialItem.CROId equals cro.Id into ttt from croItem in ttt.DefaultIfEmpty() select new WorkloadByTrialAndReviewerDTO { Id = Guid.NewGuid(), TrialId = trialItem.Id, Indication = trialItem.Indication, TrialCode = trialItem.Code, CroId = trialItem.CROId, Cro = croItem.CROName, ReviewerCode = doctorItem.Code, ChineseName = doctorItem.ChineseName, FirstName = doctorItem.FirstName, LastName = doctorItem.LastName, Training = w.Training, Timepoint = w.Timepoint, TimepointIn24H = w.TimepointIn24H, TimepointIn48H = w.TimepointIn48H, Adjudication = w.Adjudication, AdjudicationIn24H = w.AdjudicationIn24H, AdjudicationIn48H = w.AdjudicationIn48H, Global = w.Global, Downtime = w.Downtime, RefresherTraining=w.RefresherTraining, PersonalTotal = w.Timepoint + w.TimepointIn24H + w.TimepointIn48H + w.Adjudication + w.AdjudicationIn24H + w.AdjudicationIn48H + w.Global }; var propName = param.SortField == "" ? "ReviewerCode" : param.SortField; query = param.Asc ? query.OrderBy(propName).ThenBy(t=>t.TrialCode).ThenBy(u=>u.ReviewerCode) : query.OrderByDescending(propName).ThenBy(t => t.TrialCode).ThenBy(u => u.ReviewerCode); if (propName == "FirstName" || propName == "LastName") { query = param.Asc ? query.OrderBy(t => t.LastName).ThenBy(t => t.FirstName) : query.OrderByDescending(t => t.LastName).ThenBy(t => t.FirstName); } var count = query.Count(); query = query .Skip((param.PageIndex - 1) * param.PageSize) .Take(param.PageSize); var doctorViewList = query.ToList(); return new PageOutput(param.PageIndex, param.PageSize, count, doctorViewList); } public PageOutput GetEnrollStatByReviewer(EnrollStatByReviewerQueryDTO param) { var bDate = new DateTime(param.BeginDate.Year, param.BeginDate.Month, 1); var eDate = new DateTime(param.EndDate.Year, param.EndDate.Month, 1); eDate = eDate.AddMonths(1); Expression> enrollLambda = x => true; enrollLambda = enrollLambda.And(x => x.EnrollTime >= bDate && x.EnrollTime < eDate); Expression> hospitalLambda = x => true; if (Guid.Empty != param.HospitalId&& param.HospitalId!=null) { hospitalLambda = hospitalLambda.And(u => u.Id == param.HospitalId); } Expression> doctorLambda = x => true; if (!string.IsNullOrWhiteSpace(param.Reviewer)) { var reviewer = param.Reviewer.Trim(); doctorLambda = doctorLambda.And(u => u.ChineseName.Contains(reviewer) || u.FirstName.Contains(reviewer) || u.LastName.Contains(reviewer) || u.Code.Contains(reviewer) ); } var enrollQueryable = from enroll in _enrollRepository.Find(enrollLambda) group enroll by new { enroll.DoctorId } into g select new { DoctorId = g.Key.DoctorId, Submitted = g.Sum(t => t.EnrollStatus == (int)EnrollStatus.HasCommittedToCRO?1:0), Approved = g.Sum(t => t.EnrollStatus == (int)EnrollStatus.InviteIntoGroup?1:0), Reading = g.Sum(t => t.EnrollStatus == (int)EnrollStatus.DoctorReading?1:0), Finished = g.Sum(t => t.EnrollStatus >= (int)EnrollStatus.End?1:0), }; var query = from w in enrollQueryable join doctor in _doctorRepository.Find(doctorLambda) on w.DoctorId equals doctor.Id join hospital in _hospitalRepository.Find(hospitalLambda) on doctor.HospitalId equals hospital.Id select new EnrollStatByReviewerDTO { Id = Guid.NewGuid(), Hospital = hospital.HospitalName, ReviewerCode = doctor.Code, ChineseName = doctor.ChineseName, FirstName = doctor.FirstName, LastName = doctor.LastName, Pending = w.Submitted, Approved = w.Approved, Reading = w.Reading, Finished = w.Finished, Total = w.Submitted+ w.Approved+ w.Reading+ w.Finished }; if (param.SortField != "EntryRate") { var propName = param.SortField == "" ? "ReviewerCode" : param.SortField; query = param.Asc ? query.OrderBy(propName).ThenBy(u => u.ReviewerCode) : query.OrderByDescending(propName).ThenBy(u => u.ReviewerCode); if (propName == "FirstName" || propName == "LastName") { query = param.Asc ? query.OrderBy(t => t.LastName).ThenBy(t => t.FirstName) : query.OrderByDescending(t => t.LastName).ThenBy(t => t.FirstName); } } var count = query.Count(); query = query .Skip((param.PageIndex - 1) * param.PageSize) .Take(param.PageSize); var list = query.ToList(); if (param.SortField == "EntryRate") { list = param.Asc ? list.OrderBy(t => t.EntryRate).ToList() : list.OrderByDescending(t => t.EntryRate).ToList(); } return new PageOutput(param.PageIndex, param.PageSize, count, list); } public PageOutput GetEnrollStatByTrial(EnrollStatByTrialQueryDTO param) { #region 筛选条件 Expression> trialLambda = x => true; if (param.Expedited != null) { trialLambda = trialLambda.And(o => o.Expedited == param.Expedited); } if (!string.IsNullOrEmpty(param.TrialCode)) { var code = param.TrialCode.Trim(); trialLambda = trialLambda.And(o => o.Code.Contains(code)); } if (!string.IsNullOrWhiteSpace(param.Indication)) { var indication = param.Indication.Trim(); trialLambda = trialLambda.And(o => o.Indication.Contains(indication)); } if (param.CROId != Guid.Empty&& param.CROId != null) { trialLambda = trialLambda.And(o => o.CROId == param.CROId); } if (param.BeginDate != null && param.EndDate != null) { var bDate = new DateTime(param.BeginDate.Value.Year, param.BeginDate.Value.Month, param.BeginDate.Value.Day); var eDate = new DateTime(param.EndDate.Value.Year, param.EndDate.Value.Month, param.BeginDate.Value.Day); eDate = eDate.AddMonths(1); trialLambda = trialLambda.And(o => o.CreateTime>=bDate&&o.CreateTime t.EnrollStatus >= (int)EnrollStatus.ConfirmIntoGroup).GroupBy(t => t.TrialId).Select(g => new { TrialId = g.Key, EnrollCount = g.Count() }); var trialQuery = from trial in _trialRepository.GetAll().Where(trialLambda) join cro in _croCompanyRepository.GetAll() on trial.CROId equals cro.Id into t from cro in t.DefaultIfEmpty() join trialEnroll in trialEnrollStatQuery on trial.Id equals trialEnroll.TrialId select new EnrollStatByTrialDTO { TrialId= trial.Id, Cro = cro != null ? cro.CROName : "", Expedited = trial.Expedited, Indication = trial.Indication, TrialCode = trial.Code, EnrollCount= trialEnroll.EnrollCount, CreateTime = trial.CreateTime }; var propName = param.SortField == "" ? "TrialCode" : param.SortField; trialQuery = param.Asc ? trialQuery.OrderBy(propName) : trialQuery.OrderByDescending(propName); var count = trialQuery.Count(); trialQuery = trialQuery .Skip((param.PageIndex - 1) * param.PageSize) .Take(param.PageSize); var trialList = trialQuery.ToList(); var trialIds = trialList.Select(t => t.TrialId).ToList(); var enrollReviewerQuery = from enroll in _enrollRepository.GetAll() .Where(t => t.EnrollStatus >= (int)EnrollStatus.ConfirmIntoGroup&& trialIds.Contains(t.TrialId)) join reviewer in _doctorRepository.GetAll() on enroll.DoctorId equals reviewer.Id select new { TrialId = enroll.TrialId, NameCN = reviewer.ChineseName, Name = reviewer.LastName + " / " + reviewer.FirstName }; var enrollReviewerByTrialList = enrollReviewerQuery.ToList().GroupBy(t => t.TrialId).Select(g => new { TrialId = g.Key, ReviewerNameCNList = g.Select(t => t.NameCN).ToList(), ReviewerNameList = g.Select(t => t.Name).ToList() }).ToList(); trialList.ForEach(t => { var trialDoctors = enrollReviewerByTrialList.FirstOrDefault(u => u.TrialId == t.TrialId); if (trialDoctors != null) { t.ReviewerNameCNList = trialDoctors.ReviewerNameCNList; t.ReviewerNameList = trialDoctors.ReviewerNameList; } }); return new PageOutput(param.PageIndex, param.PageSize, count, trialList); } #region Dashboard 数据统计 public ReadingDataDTO GetReadingDataByType() { int tp = 0; int ad = 0; int g = 0; var finalConfirmWorkload = _workloadRepository.Find(u => u.DataFrom == (int)WorkLoadFromStatus.FinalConfirm).ToList(); foreach (var item in finalConfirmWorkload) { tp += (item.Timepoint + item.TimepointIn24H + item.TimepointIn48H); ad += (item.Adjudication + item.AdjudicationIn24H + item.AdjudicationIn48H); g += item.Global; } return new ReadingDataDTO { Timepoint = tp, Adjudication = ad, Global = g }; } public List GetReadingDataByMonth(int monthCount) { DateTime now = DateTime.Now.AddMonths(-1); DateTime eTime = new DateTime(now.Year, now.Month, 20); DateTime now6 = now.AddMonths(-1 * (monthCount - 1)); DateTime bTime = new DateTime(now.AddMonths(-(monthCount - 1)).Year, now.AddMonths(-(monthCount - 1)).Month, 1, 0, 0, 0, 0); var query = from workload in _workloadRepository .Find(u => u.DataFrom == (int)WorkLoadFromStatus.FinalConfirm && u.WorkTime >= bTime && u.WorkTime < eTime) group workload by workload.YearMonth into gWorkLoad select new ReadingDataMonthDTO { Month = gWorkLoad.Key, Timepoint = gWorkLoad.Sum(t => t.Timepoint) + gWorkLoad.Sum(t => t.TimepointIn24H) + gWorkLoad.Sum(t => t.TimepointIn48H), Adjudication = gWorkLoad.Sum(t => t.Adjudication) + gWorkLoad.Sum(t => t.AdjudicationIn24H) + gWorkLoad.Sum(t => t.AdjudicationIn48H), Global = gWorkLoad.Sum(t => t.Global) }; var workloadList = query.OrderByDescending(u => u.Month).ToList(); List result = new List(); for (int i = 0; i < monthCount; i++) { var tempTime = now.AddMonths(-1 * i); var existedItem = workloadList.Find(u => u.Month == (tempTime.Year + "-" + tempTime.Month.ToString().PadLeft(2, '0'))); if (existedItem != null) { result.Add(new ReadingDataMonthDTO { Month = existedItem.Month, Timepoint = existedItem.Timepoint, Adjudication = existedItem.Adjudication, Global = existedItem.Global }); } else { result.Add(new ReadingDataMonthDTO { Month = tempTime.Year + "-" + tempTime.Month.ToString().PadLeft(2, '0'), Timepoint = 0, Adjudication = 0, Global = 0 }); } } return result; } public List GetReadingDataRank(int topCount) { var query = from workload in _workloadRepository .Find(u => u.DataFrom == (int)WorkLoadFromStatus.FinalConfirm) group workload by workload.DoctorId into gWorkLoad select new ReadingDataRankDTO { TotalReadingCount = gWorkLoad.Sum(t => t.Timepoint) + gWorkLoad.Sum(t => t.TimepointIn24H) + gWorkLoad.Sum(t => t.TimepointIn48H) + gWorkLoad.Sum(t => t.Adjudication) + gWorkLoad.Sum(t => t.AdjudicationIn24H) + gWorkLoad.Sum(t => t.AdjudicationIn48H) + gWorkLoad.Sum(t => t.Global), ReviewerId = gWorkLoad.Key, Timepoint = gWorkLoad.Sum(t => t.Timepoint) + gWorkLoad.Sum(t => t.TimepointIn24H) + gWorkLoad.Sum(t => t.TimepointIn48H), Adjudication = gWorkLoad.Sum(t => t.Adjudication) + gWorkLoad.Sum(t => t.AdjudicationIn24H) + gWorkLoad.Sum(t => t.AdjudicationIn48H), Global = gWorkLoad.Sum(t => t.Global) }; var workloadList = query.OrderByDescending(u => u.TotalReadingCount).Take(topCount).ToList(); var reviewerList = from w in workloadList join doctor in _doctorRepository.Find() on w.ReviewerId equals doctor.Id into tt from doctorItem in tt.DefaultIfEmpty() select new ReadingDataRankDTO { TotalReadingCount = w.TotalReadingCount, ReviewerId = w.ReviewerId, Timepoint = w.Timepoint, Adjudication = w.Adjudication, Global = w.Global, ReviewerCode = doctorItem == null ? string.Empty : doctorItem.Code, FirstName = doctorItem == null ? string.Empty : doctorItem.FirstName, LastName = doctorItem == null ? string.Empty : doctorItem.LastName, ChineseName = doctorItem == null ? string.Empty : doctorItem.ChineseName }; return reviewerList.ToList(); } public List GetReviewersByRank() { var query = from q in (from reviewer in _doctorRepository.GetAll() //.Find(u => u.ReviewStatus == 1 && u.CooperateStatus == 1) group reviewer by reviewer.RankId into gReviewer select new { RankId = gReviewer.Key, ReviewerCount = gReviewer.Count() }) join dic in _dictionaryRepository.Find() on q.RankId equals dic.Id into tt from dicItem in tt.DefaultIfEmpty() select new RankReviewersDTO { RankId = q.RankId, ReviewerCount = q.ReviewerCount, RankName = dicItem == null ? "Other" : dicItem.Value }; var rankList = query.ToList(); var staffList = rankList.Where(u => u.RankName == "Staff" || u.RankName == "Other"); int staffCount = 0; foreach (var item in staffList) { staffCount += item.ReviewerCount; } rankList.RemoveAll(u => u.RankName == "Staff" || u.RankName == "Other"); rankList.Add(new RankReviewersDTO { RankId = Guid.NewGuid(), RankName = "Staff", ReviewerCount = staffCount }); return rankList; } public List GetEnrollDataByQuarter(int type, int count) { //等于0按照月份 否则按照季度 if (type != 0) { var quarterCount = count; var year = DateTime.Now.AddMonths(-(quarterCount - 1) * 3 - DateTime.Now.Month % 3 + 1).Year; var month = DateTime.Now.AddMonths(-(quarterCount - 1) * 3 - DateTime.Now.Month % 3 + 1).Month; var beginMonth = new DateTime(year, month, 1); var endMonth = DateTime.Now; var querySql = from enrollDetail in _enrollDetailRepository.GetAll().Where(t => t.CreateTime > beginMonth && t.CreateTime < endMonth && t.EnrollStatus == (int)EnrollStatus.ConfirmIntoGroup) select new { OptTime = enrollDetail.CreateTime, Year = enrollDetail.CreateTime.Year, Month = enrollDetail.CreateTime.Month, }; var result = querySql.GroupBy(t => new { t.Year, t.Month }).Select(s => new EnrollDataDTO { Year = s.Key.Year, Month = s.Key.Month, EnrollCount = s.Count() }).ToList(); #region 填充数据 List returnList = new List(); for (int i = 0; i < DateTime.Now.Month % 3 + (quarterCount - 1) * 3; i++) { var tempTime = DateTime.Now.AddMonths(-1 * i); var existedItem = result.FirstOrDefault(u => u.YearMonth == tempTime.ToString("yyyy-MM")); if (existedItem != null) { returnList.Add(new EnrollDataDTO { Month = existedItem.Month, Year = existedItem.Year, EnrollCount = existedItem.EnrollCount }); } else { returnList.Add(new EnrollDataDTO { Month = tempTime.Month, Year = tempTime.Year, EnrollCount = 0 }); } } #endregion var returnResult = returnList.GroupBy(t => t.QuarterStr).Select(u => new EnrollQuartDataDTO() { ViewStr = u.Key, EnrollCount = u.Sum(t => t.EnrollCount) }).ToList(); return returnResult; } else { var year = DateTime.Now.AddMonths(-(count - 1)).Year; var month = DateTime.Now.AddMonths(-(count - 1)).Month; var beginMonth = new DateTime(year, month, 1); var endMonth = DateTime.Now; var querySql = from enrollDetail in _enrollDetailRepository.GetAll().Where(t => t.CreateTime > beginMonth && t.CreateTime < endMonth && t.EnrollStatus == (int)EnrollStatus.ConfirmIntoGroup) select new { OptTime = enrollDetail.CreateTime, Year = enrollDetail.CreateTime.Year, Month = enrollDetail.CreateTime.Month, }; var result = querySql.GroupBy(t => new { t.Year, t.Month }).Select(s => new EnrollDataDTO { Year = s.Key.Year, Month = s.Key.Month, EnrollCount = s.Count() }).ToList(); #region 填充数据 List returnList = new List(); for (int i = 0; i < count; i++) { var tempTime = DateTime.Now.AddMonths(-1 * i); var existedItem = result.FirstOrDefault(u => u.YearMonth == tempTime.ToString("yyyy-MM")); if (existedItem != null) { returnList.Add(new EnrollDataDTO { Month = existedItem.Month, Year = existedItem.Year, EnrollCount = existedItem.EnrollCount }); } else { returnList.Add(new EnrollDataDTO { Month = tempTime.Month, Year = tempTime.Year, EnrollCount = 0 }); } } #endregion var returnResult = returnList.GroupBy(t => t.YearMonth).Select(u => new EnrollQuartDataDTO() { ViewStr = u.Key, EnrollCount = u.Sum(t => t.EnrollCount) }).ToList(); return returnResult; } } public List GetTrialCountRank(int topCount) { var queryList = (from enrollDetail in _enrollDetailRepository.GetAll().Where(t => t.EnrollStatus == (int)EnrollStatus.ConfirmIntoGroup) group enrollDetail by enrollDetail.DoctorId into g select new { ReviewerId = g.Key, TrialCount = g.Count() }).OrderByDescending(u => u.TrialCount).Take(topCount).ToList(); var trialDataRank = from stat in queryList join doctor in _doctorRepository.GetAll() on stat.ReviewerId equals doctor.Id select new TrialDataRankDTO() { TrialCount = stat.TrialCount, ChineseName = doctor.ChineseName, FirstName = doctor.FirstName, LastName = doctor.LastName, ReviewerId = doctor.Id, ReviewerCode = doctor.Code }; return trialDataRank.ToList(); } public List GetLatestWorkLoadList(int searchCount) { var workloadList = _workloadRepository.GetAll() .Where(t => t.DataFrom == (int)WorkLoadFromStatus.FinalConfirm && (t.Adjudication + t.AdjudicationIn24H + t.AdjudicationIn48H) > 0 && (t.Timepoint + t.TimepointIn24H + t.TimepointIn48H) > 0) .OrderByDescending(t => t.CreateTime).Take(searchCount).ToList(); var reviewerList = from w in workloadList join doctor in _doctorRepository.Find() on w.DoctorId equals doctor.Id into tt from doctorItem in tt.DefaultIfEmpty() join trial in _trialRepository.GetAll() on w.TrialId equals trial.Id into cc from trialItem in cc.DefaultIfEmpty() select new LatestWorkLoadDTO { ReviewerId = w.DoctorId, Timepoint = w.Timepoint + w.TimepointIn48H + w.TimepointIn24H, Adjudication = w.Adjudication + w.AdjudicationIn48H + w.AdjudicationIn24H, Global = w.Global, ReviewerCode = doctorItem == null ? string.Empty : doctorItem.Code, FirstName = doctorItem == null ? string.Empty : doctorItem.FirstName, LastName = doctorItem == null ? string.Empty : doctorItem.LastName, ChineseName = doctorItem == null ? string.Empty : doctorItem.ChineseName, TrialCode = trialItem == null ? string.Empty : trialItem.Code }; return reviewerList.ToList(); } #endregion } }