CostCalculationItem/IRaCIS.Core.Application/Institution/HospitalService.cs

126 lines
5.5 KiB
C#

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;
}
/// <summary> 获取所有医院列表 </summary>
public IEnumerable<HospitalDTO> GetHospitalList()
{
return _hospitalRepository.GetAll().ProjectTo<HospitalDTO>(_mapper.ConfigurationProvider);
}
/// <summary> 添加医院 </summary>
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<Hospital>(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);
}
}
/// <summary> 删除医院信息 </summary>
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);
}
/// <summary> 分页获取医院列表 </summary>
public PageOutput<HospitalDTO> GetHospitalPageList(HospitalQueryDTO hospitalSearchModel)
{
Expression<Func<Hospital, bool>> 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<HospitalDTO>(_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<HospitalDTO>(hospitalSearchModel.PageIndex, hospitalSearchModel.PageSize, count, userList);
}
}
}