using AutoMapper; using IRaCIS.Application.ExpressionExtend; using IRaCIS.Application.Interfaces; using IRaCIS.Application.ViewModels; using IRaCIS.Core.Application.Contracts.RequestAndResponse; using IRaCIS.Infra.Data.ExpressionExtend; using System; using System.Linq; using System.Linq.Expressions; using IRaCIS.Core.Domain.Interfaces; using IRaCIS.Core.Domain.Models; namespace IRaCIS.Application.Services { public class TrialRevenuesPriceService : ITrialRevenuesPriceService { private readonly ITrialRepository _trialRepository; private readonly ITrialRevenuesPriceRepository _trialRevenuesPriceRepository; private readonly ICRORepository _croRepository; private readonly IDictionaryRepository _dictionaryRepository; private readonly ITrialRevenuesPriceVerificationRepository _trialRevenuesPriceVerificationRepository; private readonly IMapper _mapper; public TrialRevenuesPriceService(ITrialRepository trialRepository, ITrialRevenuesPriceRepository trialCostRepository, ICRORepository croCompanyRepository, IDictionaryRepository dictionaryRepository, ITrialRevenuesPriceVerificationRepository trialRevenuesPriceVerificationRepository, IMapper mapper) { _trialRepository = trialRepository; _trialRevenuesPriceRepository = trialCostRepository; _croRepository = croCompanyRepository; _dictionaryRepository = dictionaryRepository; _trialRevenuesPriceVerificationRepository = trialRevenuesPriceVerificationRepository; _mapper = mapper; } public IResponseOutput AddOrUpdateTrialRevenuesPrice(TrialRevenuesPriceDTO model) { var count = model.Timepoint + model.TimepointIn24H + model.TimepointIn48H + model.Adjudication + model.AdjudicationIn24H + model.AdjudicationIn48H + model.Downtime + model.Global + model.Training; if (count <= 0) { return ResponseOutput.NotOk("Please add meaningful data"); } var trialExistedItem = _trialRevenuesPriceRepository.FindSingleOrDefault(u => u.TrialId == model.TrialId); if (trialExistedItem == null)//insert { var trialCost = _mapper.Map(model); _trialRevenuesPriceRepository.Add(trialCost); var success = _trialRevenuesPriceRepository.SaveChanges(); return ResponseOutput.Result(success, trialCost.Id.ToString()); } else//update { var trialRevenuesPrice = _trialRevenuesPriceRepository.GetAll() .FirstOrDefault(u => u.TrialId == model.TrialId); _trialRevenuesPriceRepository.Update(_mapper.Map(model, trialRevenuesPrice)); // 完善价格的 将对应的列设置为true 变更为有价格了 var aaa = _trialRevenuesPriceVerificationRepository.Update(t => t.TrialId == model.TrialId, u => new TrialRevenuesPriceVerification() { //有价格 则设置为true 否则 该列不变 Timepoint = model.Timepoint > 0 || u.Timepoint, TimepointIn24H = model.TimepointIn24H > 0 || u.TimepointIn24H, TimepointIn48H = model.TimepointIn48H > 0 || u.TimepointIn48H, Adjudication = model.Adjudication > 0 || u.Adjudication, AdjudicationIn24H = model.AdjudicationIn24H > 0 || u.AdjudicationIn24H, AdjudicationIn48H = model.AdjudicationIn48H > 0 || u.AdjudicationIn48H, Global = model.Global > 0 || u.Global, Downtime = model.Downtime > 0 || u.Downtime, Training = model.Training > 0 || u.Training, RefresherTraining = model.RefresherTraining > 0 || u.RefresherTraining, }); //删除所有有价格的记录 为true 表示有价格或者不需要价格 缺价格的为false _trialRevenuesPriceVerificationRepository.Delete(t => t.TrialId == model.TrialId && t.Timepoint&& t.TimepointIn24H&& t.TimepointIn48H && t.Adjudication && t.AdjudicationIn24H && t.AdjudicationIn48H && t.Global && t.Training &&t.RefresherTraining); var success = _trialRevenuesPriceRepository.SaveChanges(); return ResponseOutput.Result(success); } } public bool DeleteTrialCost(Guid id) { return _trialRevenuesPriceRepository.Delete(u => u.Id == id); } public PageOutput GetTrialRevenuesPriceList(TrialRevenuesPriceQueryDTO queryParam) { Expression> trialLambda = x => true; if (queryParam.CroId != Guid.Empty && queryParam.CroId != null) { trialLambda = trialLambda.And(o => o.CROId == queryParam.CroId); } var trialQueryable = from trial in _trialRepository.Find(u => u.Code.Contains(queryParam.KeyWord) || u.Indication.Contains(queryParam.KeyWord)).Where(trialLambda) join cro in _croRepository.GetAll() on trial.CROId equals cro.Id into CRO from croInfo in CRO.DefaultIfEmpty() join dic in _dictionaryRepository.GetAll() on trial.ReviewModeId equals dic.Id into dict from dic in dict.DefaultIfEmpty() join trialCost in _trialRevenuesPriceRepository.GetAll() on trial.Id equals trialCost.TrialId into trialInfo from trialCostItem in trialInfo.DefaultIfEmpty() select new TrialRevenuesPriceDetialDTO { Id = trialCostItem == null ? Guid.Empty : trialCostItem.Id, TrialId = trial.Id, TrialCode = trial.Code, Indication = trial.Indication, Cro = croInfo == null ? string.Empty : croInfo.CROName, ReviewMode = dic == null ? string.Empty : dic.Value, Timepoint = trialCostItem == null ? 0 : trialCostItem.Timepoint, TimepointIn24H = trialCostItem == null ? 0 : trialCostItem.TimepointIn24H, TimepointIn48H = trialCostItem == null ? 0 : trialCostItem.TimepointIn48H, Adjudication = trialCostItem == null ? 0 : trialCostItem.Adjudication, AdjudicationIn24H = trialCostItem == null ? 0 : trialCostItem.AdjudicationIn24H, AdjudicationIn48H = trialCostItem == null ? 0 : trialCostItem.AdjudicationIn48H, Downtime = trialCostItem == null ? 0 : trialCostItem.Downtime, Global = trialCostItem == null ? 0 : trialCostItem.Global, Training = trialCostItem == null ? 0 : trialCostItem.Training, RefresherTraining= trialCostItem == null ? 0 : trialCostItem.RefresherTraining, Expedited = trial.Expedited }; var count = trialQueryable.Count(); var propName = string.IsNullOrWhiteSpace(queryParam.SortField) ? "TrialCode" : queryParam.SortField; trialQueryable = queryParam.Asc ? trialQueryable.OrderBy(propName) : trialQueryable.OrderByDescending(propName); trialQueryable = trialQueryable.Skip((queryParam.PageIndex - 1) * queryParam.PageSize) .Take(queryParam.PageSize); var trialList = trialQueryable.ToList(); return new PageOutput(queryParam.PageIndex, queryParam.PageSize, count, trialList); } } }