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 HospitalService : IHospitalService { private readonly IHospitalRepository _hospitalRepository; private readonly IDoctorRepository _doctorRepository; private readonly IUserRepository _userRepository; private readonly IMapper _mapper; public HospitalService(IHospitalRepository hospitalRepository, IDoctorRepository doctorRepository, IUserRepository userRepository, IMapper mapper) { _hospitalRepository = hospitalRepository; _doctorRepository = doctorRepository; _userRepository = userRepository; _mapper = mapper; } /// 获取所有医院列表 public IEnumerable GetHospitalList() { return _hospitalRepository.GetAll().ProjectTo(_mapper.ConfigurationProvider); } /// 添加医院 public IResponseOutput AddOrUpdateHospital(HospitalCommand addViewModel) { if (addViewModel.Id == Guid.Empty || addViewModel.Id == null) { if (_hospitalRepository.GetAll().FirstOrDefault(t => t.HospitalName == addViewModel.HospitalName) != null) { return ResponseOutput.NotOk("Same hospital name already exist."); } var hospital = _hospitalRepository.Add(_mapper.Map(addViewModel)); var success = _hospitalRepository.SaveChanges(); return ResponseOutput.Result(success, hospital.Id.ToString()); } else { var updateViewModel = addViewModel; if (_hospitalRepository.FindSingleOrDefault(t => t.HospitalName == updateViewModel.HospitalName && t.Id != updateViewModel.Id) != null) { return ResponseOutput.NotOk("Same hospital name already exist."); } var success = _hospitalRepository.Update(t => t.Id == updateViewModel.Id, u => new Hospital() { City = updateViewModel.City, Country = updateViewModel.Country, HospitalName = updateViewModel.HospitalName, Province = updateViewModel.Province, UniversityAffiliated = updateViewModel.UniversityAffiliated }); return ResponseOutput.Result(success, success ? string.Empty : StaticData.UpdateFailed); } } /// 删除医院信息 public IResponseOutput DeleteHospital(Guid hospitalId) { if (_doctorRepository.GetAll().FirstOrDefault(t => t.Id == hospitalId) != null) { return ResponseOutput.NotOk("医生信息表已关联此医院"); } if (_userRepository.Find().Any(t => t.OrganizationId == hospitalId)) { return ResponseOutput.NotOk("该医院下存在用户,暂时无法删除。"); } var success = _hospitalRepository.Delete(t => t.Id == hospitalId); return ResponseOutput.Result(success, success ? string.Empty : StaticData.DeleteFailed); } /// 分页获取医院列表 public PageOutput GetHospitalPageList(HospitalQueryDTO hospitalSearchModel) { Expression> hospitalLambda = x => true; if (hospitalSearchModel.HospitalName.Trim() != string.Empty) { hospitalLambda = hospitalLambda.And(t => t.HospitalName.Contains(hospitalSearchModel.HospitalName.Trim())); } if (hospitalSearchModel.City.Trim() != string.Empty) { hospitalLambda = hospitalLambda.And(t => t.City.Contains(hospitalSearchModel.City.Trim())); } if (hospitalSearchModel.Province.Trim() != string.Empty) { hospitalLambda = hospitalLambda.And(t => t.Province.Contains(hospitalSearchModel.Province.Trim())); } var hospitalQueryable = _hospitalRepository.GetAll().Where(hospitalLambda).ProjectTo(_mapper.ConfigurationProvider); var count = hospitalQueryable.Count(); var propName = string.IsNullOrWhiteSpace(hospitalSearchModel.SortField) ? "HospitalName" : hospitalSearchModel.SortField; hospitalQueryable = hospitalSearchModel.Asc ? hospitalQueryable.OrderBy(propName) : hospitalQueryable.OrderByDescending(propName); hospitalQueryable = hospitalQueryable .Skip((hospitalSearchModel.PageIndex - 1) * hospitalSearchModel.PageSize) .Take(hospitalSearchModel.PageSize); var userList = hospitalQueryable.ToList(); return new PageOutput(hospitalSearchModel.PageIndex, hospitalSearchModel.PageSize, count, userList); } } }