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 CroService : ICroService
{
private readonly ICRORepository _croRepository;
private readonly ITrialRepository _trialRepository;
private readonly IUserRepository _userRepository;
private readonly IMapper _mapper;
public CroService(ICRORepository croCompanyRepository, ITrialRepository trialRepository, IUserRepository userRepository,IMapper mapper)
{
_croRepository = croCompanyRepository;
_trialRepository = trialRepository;
_userRepository = userRepository;
_mapper = mapper;
}
/// 分页获取CRO列表
public PageOutput GetCroList(CROCompanyQueryDTO croCompanySearchModel)
{
Expression> croLambda = x => true;
if (!string.IsNullOrWhiteSpace(croCompanySearchModel.CROName.Trim()))
{
croLambda = croLambda.And(t => t.CROName.Contains(croCompanySearchModel.CROName.Trim()));
}
var croQueryable = _croRepository.Find(croLambda).ProjectTo(_mapper.ConfigurationProvider);
var count = croQueryable.Count();
var propName = string.IsNullOrWhiteSpace(croCompanySearchModel.SortField) ? "Id" : croCompanySearchModel.SortField;
croQueryable = croCompanySearchModel.Asc ? croQueryable.OrderBy(propName) : croQueryable.OrderByDescending(propName);
croQueryable = croQueryable
.Skip(((croCompanySearchModel.PageIndex - 1) * croCompanySearchModel.PageSize))
.Take(croCompanySearchModel.PageSize);
var croList = croQueryable.ToList();
return new PageOutput(croCompanySearchModel.PageIndex,
croCompanySearchModel.PageSize, count, croList);
}
/// 根据CRO 名称查询所有CRO 列表
public IEnumerable GetCroSearchList()
{
var croQueryable = _croRepository.GetAll().ProjectTo(_mapper.ConfigurationProvider);
return croQueryable.ToList();
}
/// 添加CRO信息
public IResponseOutput AddOrUpdateCro(CROCompanyDTO addCroCompanyViewModel, Guid userId)
{
if (addCroCompanyViewModel.Id == Guid.Empty||addCroCompanyViewModel.Id==null)
{
if (_croRepository.FindSingleOrDefault(t => t.CROName == addCroCompanyViewModel.CROName) != null)
{
return ResponseOutput.NotOk("Name repetition. ");
}
var temp = _mapper.Map(addCroCompanyViewModel);
var cro = _croRepository.Add(temp);
var success = _croRepository.SaveChanges();
return ResponseOutput.Result(success, cro.Id.ToString());
}
else
{
var updateCroCompanyViewModel = addCroCompanyViewModel;
if (_croRepository.FindSingleOrDefault(t => t.CROName == updateCroCompanyViewModel.CROName && t.Id != updateCroCompanyViewModel.Id) != null)
{
return ResponseOutput.NotOk("Name repetition. ");
}
var success = _croRepository.Update(t => t.Id == updateCroCompanyViewModel.Id, u => new CRO()
{
CROName = updateCroCompanyViewModel.CROName,
CROCode = updateCroCompanyViewModel.CROCode,
UpdateTime = DateTime.Now,
UpdateUserId = userId
});
return ResponseOutput.Result(success, success ? string.Empty : StaticData.AddFailed);
}
}
/// 删除CRO信息
public IResponseOutput DeleteCro(Guid cROCompanyId)
{
if (_trialRepository.Find().Any(t => t.CROId == cROCompanyId))
{
return ResponseOutput.NotOk("存在该CRO的项目,暂时无法删除。");
}
if (_userRepository.Find().Any(t => t.OrganizationId == cROCompanyId))
{
return ResponseOutput.NotOk("该CRO下存在用户,暂时无法删除。");
}
var success = _croRepository.Delete(t => t.Id == cROCompanyId);
return ResponseOutput.Result(success, success ? string.Empty : StaticData.DeleteFailed);
}
}
}