using IRaCIS.Application.Interfaces; using IRaCIS.Application.Contracts; using IRaCIS.Core.Domain.Share; using System.Linq.Expressions; using System.Linq.Dynamic.Core; using Microsoft.AspNetCore.Mvc; namespace IRaCIS.Application.Services { /// /// Dashboard统计、全局工作量统计、入组两个维度统计(按照项目、按照人) /// [ApiExplorerSettings(GroupName = "Dashboard&Statistics")] public class StatisticsService : BaseService, IStatisticsService { private readonly IRepository _trialRepository; private readonly IRepository _croCompanyRepository; private readonly IRepository _dictionaryRepository; private readonly IRepository _hospitalRepository; private readonly IRepository _userRepository; private readonly IRepository _userTrialRepository; public StatisticsService( IRepository trialRepository, IRepository croCompanyRepository, IRepository dictionaryRepository, IRepository hospitalRepository, IRepository userRepository, IRepository userTrialRepository) { _trialRepository = trialRepository; _croCompanyRepository = croCompanyRepository; _dictionaryRepository = dictionaryRepository; _hospitalRepository = hospitalRepository; _userRepository = userRepository; _userTrialRepository = userTrialRepository; } /// 用户参与项目 统计[New] [HttpPost] public PageOutput GetParticipateTrialStat(ParticipateQueryDto param) { Expression> userLambda = x => true; Expression> userTrialLambda = x => true; if (!string.IsNullOrEmpty(param.UserInfo)) { var userInfo = param.UserInfo.Trim(); userLambda = userLambda.And(o => o.UserCode.Contains(userInfo) || (o.LastName + ' ' + o.FirstName).Contains(userInfo) || o.UserName.Contains(userInfo)); } if (!string.IsNullOrWhiteSpace(param.OrganizationName)) { var organizationName = param.OrganizationName.Trim(); userLambda = userLambda.And(o => o.OrganizationName.Contains(organizationName)); } var userTypeEnumStr = _userInfo.UserTypeEnumStr; var userId = _userInfo.Id; //PM 进来只能看到他负责的项目下的参与人员列表 if (userTypeEnumStr == UserTypeEnum.ProjectManager.ToString()) { //参与到的项目 var trialFilter = _userTrialRepository.Where(t => t.UserId == userId) .Select(u => u.TrialId); userTrialLambda = userTrialLambda.And(t => trialFilter.Contains(t.TrialId)); } //.Select(u => new { u.TrialId, u.UserId }).Distinct() var trialStatQuery = _userTrialRepository.Where(userTrialLambda) .GroupBy(t => t.UserId).Select( g => new { UserId = g.Key, TrialCount = g.Count() }); var userQuery = from trialStat in trialStatQuery join user in _userRepository.Where(userLambda) on trialStat.UserId equals user.Id select new UserParticipateTrialStat { Email = user.EMail, Name = user.LastName + ' ' + user.FirstName, UserName = user.UserName, OrganizationName = user.OrganizationName, Phone = user.Phone, TrialCount = trialStat.TrialCount, UserCode = user.UserCode, UserId = user.Id }; var propName = param.SortField == "" ? "OrganizationName" : param.SortField; userQuery = param.Asc ? userQuery.OrderBy(propName) : userQuery.OrderBy(propName + " desc"); var count = userQuery.Count(); userQuery = userQuery .Skip((param.PageIndex - 1) * param.PageSize) .Take(param.PageSize); var list = userQuery.ToList(); return new PageOutput(param.PageIndex, param.PageSize, count, list); } /// 用户参与项目 列表[New] [HttpGet("{userId:guid}")] public List GetParticipateTrialList(Guid userId) { Expression> userTrialLambda = x => x.UserId == userId; var userTypeEnum = _userInfo.UserTypeEnumStr; var loginUserId = _userInfo.Id; //PM 进来只能看到他负责的项目下的参与人员列表 if (userTypeEnum == UserTypeEnum.ProjectManager.ToString()) { //参与到的项目 var trialFilter = _userTrialRepository.Where(t => t.UserId == loginUserId) .Select(u => u.TrialId); userTrialLambda = userTrialLambda.And(t => trialFilter.Contains(t.TrialId)); } var query = from userTrial in _userTrialRepository.Where(userTrialLambda) join trial in _trialRepository.AsQueryable() on userTrial.TrialId equals trial.Id join cro in _croCompanyRepository.AsQueryable() on trial.CROId equals cro.Id into cc from cro in cc.DefaultIfEmpty() select new UserParticipateTrialDetail() { Code = trial.TrialCode, CROName = cro.CROName, Expedited = trial.Expedited, Indication = trial.Indication, UserType = userTrial.User.UserTypeRole.UserTypeShortName, TrialId = trial.Id }; return query.ToList(); } #region Dashboard 数据统计 #endregion } }