using AutoMapper; using AutoMapper.QueryableExtensions; 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 SiteService : ISiteService { private readonly ISiteRepository _siteRepository; private readonly IHospitalRepository _hospitalRepository; private readonly IMapper _mapper; private readonly IUserTrialRepository _userTrialRepository; private readonly IUserRepository _userRepository; public SiteService(ISiteRepository researchCenterRepository, IHospitalRepository hospitalRepository, IMapper mapper, IUserTrialRepository userTrialRepository, IUserRepository userRepository) { _siteRepository = researchCenterRepository; _hospitalRepository = hospitalRepository; _mapper = mapper; _userTrialRepository = userTrialRepository; _userRepository = userRepository; } /// 分页获取研究中心列表 public PageOutput GetSiteList(SiteQueryParam searchModel) { Expression> researchCenterLambda = x => true; if (!string.IsNullOrWhiteSpace(searchModel.SiteName.Trim())) { researchCenterLambda = researchCenterLambda.And(t => t.SiteName.Contains(searchModel.SiteName.Trim())); } IQueryable siteQueryable = default; if (searchModel.UserId == Guid.Empty) //查询所有Site { siteQueryable = from site in _siteRepository.GetAll().Where(researchCenterLambda) join hospital in _hospitalRepository.GetAll() on site.HospitalId equals hospital.Id into h from centerHospital in h.DefaultIfEmpty() select new SiteSelectDTO() { Id = site.Id, SiteName = site.SiteName, City = site.City, Country = site.Country, SiteCode = site.SiteCode, HospitalId = site.HospitalId, DirectorName = site.DirectorName, DirectorPhone = site.DirectorPhone, ContactName = site.ContactName, ContactPhone = site.ContactPhone, HospitalName = centerHospital.HospitalName }; //researchCenterQueryable = _researchCenterRepository.GetAll().Where(researchCenterLambda).ProjectTo(); } else //查询该用户没有是否选中改研究中心 ) { siteQueryable = from site in _siteRepository.GetAll().Where(researchCenterLambda) join userResearchCenter in _userTrialRepository .Find(t => t.UserId == searchModel.UserId) on site.Id equals userResearchCenter .SiteId into t from userResearch in t.DefaultIfEmpty() join hospital in _hospitalRepository.GetAll() on site.HospitalId equals hospital.Id into h from centerHospital in h.DefaultIfEmpty() select new SiteSelectDTO() { Id = site.Id, SiteName = site.SiteName, SiteCode = site.SiteCode, IsSelect = userResearch == null ? false : true, HospitalId = site.HospitalId, HospitalName = centerHospital.HospitalName }; } var count = siteQueryable.Count(); //处理排序字段 var propName = string.IsNullOrWhiteSpace(searchModel.SortField) ? "SiteName" : searchModel.SortField; //处理升序和降序 siteQueryable = searchModel.Asc ? siteQueryable.OrderBy(propName) : siteQueryable.OrderByDescending(propName); //分页 siteQueryable = siteQueryable .Skip((searchModel.PageIndex - 1) * searchModel.PageSize) .Take(searchModel.PageSize); var researchCenterList = siteQueryable.ToList(); return new PageOutput(searchModel.PageIndex, searchModel.PageSize, count, researchCenterList); } public IEnumerable GetSiteList() { return _siteRepository.GetAll().ProjectTo(_mapper.ConfigurationProvider); } /// 添加研究中心 public IResponseOutput AddOrUpdateSite(SiteCommand site, Guid userId) { if (site.Id == Guid.Empty || site.Id == null) { if (_siteRepository.GetAll().FirstOrDefault(t => t.SiteName == site.SiteName) != null) { return ResponseOutput.NotOk("Please specify another center name"); } var temp = _mapper.Map(site); var saveMode = _siteRepository.Add(temp); var success = _siteRepository.SaveChanges(); return ResponseOutput.Result(success, saveMode.Id.ToString()); } else { var updateModel = site; bool exist = _siteRepository.IsExist(u => u.SiteName == updateModel.SiteName && u.Id != updateModel.Id); if (exist) { return ResponseOutput.NotOk("已存在同名的中心名称"); } var success = _siteRepository.Update(u => u.Id == updateModel.Id, s => new Site { SiteCode = updateModel.SiteCode, SiteName = updateModel.SiteName, City = updateModel.City, Country = updateModel.Country, HospitalId = updateModel.HospitalId, DirectorName = updateModel.DirectorName, DirectorPhone = updateModel.DirectorPhone, ContactName = updateModel.ContactName, ContactPhone = updateModel.ContactPhone, UpdateUserId = userId, UpdateTime = DateTime.Now }); return ResponseOutput.Result(success, success ? string.Empty : StaticData.UpdateFailed); } } /// 删除研究中心 public IResponseOutput DeleteSite(Guid siteId) { if (_userRepository.Find().Any(t => t.OrganizationId == siteId)) { return ResponseOutput.NotOk("该Site下存在用户,暂时无法删除。"); } if (_userTrialRepository.Find().Any(t => t.SiteId == siteId)) { return ResponseOutput.NotOk("有项目在该Site下,暂时无法删除。"); } var success = _siteRepository.Delete(t => t.Id == siteId); return ResponseOutput.Result(success); } } }