using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Application.Filter;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Service.WorkLoad.DTO;
using Microsoft.AspNetCore.Authorization;
using IRaCIS.Core.Application.Auth;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Domain.Share.Reading;
using MassTransit;
using IRaCIS.Core.Infra.EFCore.Common;
namespace IRaCIS.Application.Services
{
///
/// 阅片期配置
///
[ApiExplorerSettings(GroupName = "Reading")]
public class ReadingPeriodSetService : BaseService
{
public IRepository _subjectVisitRepository;
private readonly IRepository _readingPeriodSetRepository;
private readonly IRepository _readModuleRepository;
private readonly IRepository _readingPeriodPlanRepository;
private readonly IRepository _siteSetRepository;
public ReadingPeriodSetService(IRepository subjectVisitRepository,
IRepository ReadingPeriodSetRepository,
IRepository readModuleRepository,
IRepository readingPeriodPlanRepository,
IRepository SiteSetRepository
)
{
_subjectVisitRepository = subjectVisitRepository;
_readingPeriodSetRepository = ReadingPeriodSetRepository;
this._readModuleRepository = readModuleRepository;
this._readingPeriodPlanRepository = readingPeriodPlanRepository;
_siteSetRepository = SiteSetRepository;
}
///
/// 新增或者修改
///
///
///
[HttpPost]
public async Task AddOrUpdateReadingPeriodSet(ReadingPeriodSetAddOrEdit addOrEditReadingPeriodSet)
{
if (addOrEditReadingPeriodSet.Id == null)
{
var entity = _mapper.Map(addOrEditReadingPeriodSet);
entity.ReadingPeriodSites = addOrEditReadingPeriodSet.SiteIds.Select(x => new ReadingPeriodSite()
{
ReadingPeriodSetId = entity.Id,
TrialId =entity.TrialId,
SiteId = x,
}).ToList();
await _readingPeriodSetRepository.AddAsync(entity, true);
return ResponseOutput.Ok(entity.Id);
}
else
{
var entity = (await _readingPeriodSetRepository.Where(t => t.Id == addOrEditReadingPeriodSet.Id, true).Include(t => t.ReadingPeriodSites).FirstOrDefaultAsync()).IfNullThrowException();
_mapper.Map(addOrEditReadingPeriodSet, entity);
entity.ReadingPeriodSites = addOrEditReadingPeriodSet.SiteIds.Select(x => new ReadingPeriodSite()
{
ReadingPeriodSetId = entity.Id,
TrialId = entity.TrialId,
SiteId = x,
}).ToList();
var success = await _readingPeriodSetRepository.SaveChangesAsync();
return ResponseOutput.Ok(entity.Id);
}
}
///
/// 获取影像阅片的预览 // 需要清除之前已经选中的
///
///
public async Task> GetPreviewTheReadingList(PreviewTheReadingListInDto inDto)
{
if (await _readingPeriodPlanRepository.AnyAsync(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId))
{
await _readingPeriodPlanRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId);
await _readingPeriodPlanRepository.SaveChangesAsync();
}
var readSet = (await _readingPeriodSetRepository.Where(x => x.Id == inDto.ReadingPeriodSetId).Include(x => x.ReadingPeriodSites).FirstOrDefaultAsync()).IfNullThrowException();
var visitQuery = _subjectVisitRepository.Where(x => x.TrialId == readSet.TrialId && x.InPlan);
if (readSet.ReadingScope == ReadingScopeEnum.Site)
{
var siteIds = readSet.ReadingPeriodSites.Select(x => x.SiteId);
visitQuery = visitQuery.Where(x => siteIds.Contains(x.SiteId));
}
visitQuery = visitQuery.WhereIf(readSet.ExpirationDate != null, x => x.LatestScanDate <= readSet.ExpirationDate.Value)
.WhereIf(readSet.ExpirationVisitNum != null, x => x.VisitNum <= readSet.ExpirationVisitNum);
var subjectVisits = await visitQuery.Include(x => x.Subject).Include(x => x.TrialSite).GroupBy(x => x.SubjectId).Select(x => new
{
SubjectId = x.Key,
Visit = x.ToList()
}).ToListAsync();
List visits = new List();
subjectVisits.ForEach(x =>
{
var finalVisit = x.Visit.Where(x => x.IsFinalVisit).FirstOrDefault();
if (finalVisit != null)
{
var visit = x.Visit.Where(x => x.VisitNum < finalVisit.VisitNum).OrderByDescending(x=>x.VisitNum).FirstOrDefault();
if(visit!=null)
{
visits.Add(visit);
}
}
else
{
var visit = x.Visit.OrderByDescending(x => x.VisitNum).FirstOrDefault();
if (visit != null)
{
visits.Add(visit);
}
}
});
return visits.Where(x => _readModuleRepository.Where(y => y.ReadingSetType == readSet.ReadingSetType && x.Id == y.SubjectVisitId).Count() == 0)
.Select(x => new PreviewTheReadingListOutDto
{
ExpirationDate= readSet.ExpirationDate,
SubjectVisitId= x.Id,
TrialSiteCode = x.TrialSite.TrialSiteCode,
LatestScanDate=x.LatestScanDate,
ReadingPeriodName= readSet.ReadingPeriodName,
ReadingPeriodSetId= readSet.Id,
SubjectCode=x.Subject.Code,
SubjectId=x.SubjectId,
SubjectVisitName=x.VisitName,
//Remark= readset.Remark
}).ToList();
}
///
/// 添加对应的阅片
///
///
///
public async Task GenerateReadingTask(ReadingToGenerateInDto inDto)
{
//var readset = (await _readingPeriodSetRepository.Where(x => x.Id == inDto.ReadingPeriodSetId).Include(x => x.ReadingPeriodSites).FirstOrDefaultAsync()).IfNullThrowConvertException();
//var visits = await _subjectVisitRepository.Where(x => inDto.SubjectVisitIds.Contains(x.Id)).ToListAsync();
//List readModules = new List();
//foreach (var item in visits)
//{
// readModules.Add(new ReadModule()
// {
// Id = NewId.NextGuid(),
// SubjectId = item.SubjectId,
// ModuleType = readset.ReadingSetType == ReadingSetType.ImageReading ? ModuleTypeEnum.Read : ModuleTypeEnum.Oncology,
// IsUrgent = item.IsUrgent,
// ModuleName = readset.ReadingPeriodName,
// SubjectVisitId = item.Id,
// ReadingSetType = readset.ReadingSetType,
// Status = ReadingCommon.GetVisitSubmitStateEnum(item),
// });
//};
//await _readModuleRepository.AddRangeAsync(readModules);
//var res = await _subjectVisitRepository.SaveChangesAsync();
List plans = new List();
inDto.SubjectVisitIds.ForEach(x =>
{
plans.Add(new ReadingPeriodPlan()
{
SubjectVisitId = x,
ReadingPeriodSetId = inDto.ReadingPeriodSetId
});
});
await _readingPeriodPlanRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId);
await _readingPeriodPlanRepository.SaveChangesAsync();
await _readingPeriodPlanRepository.AddRangeAsync(plans);
var result = await _readingPeriodPlanRepository.SaveChangesAsync();
return ResponseOutput.Result(result);
}
///
/// 获取选中的计划
///
///
///
public async Task> GetPreviewTheReadingPlanList(PreviewTheReadingListInDto inDto)
{
var plans =await _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId).Include(x => x.SubjectVisit).Include(x => x.SubjectVisit.TrialSite).Include(x => x.SubjectVisit.Subject)
.Include(x => x.ReadingPeriodSet).ToListAsync();
return plans.Select(x => new PreviewTheReadingListOutDto
{
ExpirationDate = x.ReadingPeriodSet.ExpirationDate,
SubjectVisitId = x.SubjectVisitId,
TrialSiteCode = x.SubjectVisit.TrialSite.TrialSiteCode,
LatestScanDate =x.SubjectVisit.LatestScanDate,
ReadingPeriodName = x.ReadingPeriodSet.ReadingPeriodName,
ReadingPeriodSetId = x.ReadingPeriodSet.Id,
SubjectCode = x.SubjectVisit.Subject.Code,
SubjectId = x.SubjectVisit.SubjectId,
SubjectVisitName = x.SubjectVisit.VisitName,
//Remark= readset.Remark
}).ToList();
}
///
/// 分页获取
///
///
///
[HttpPost]
public async Task> GetReadingPeriodSetList(ReadingPeriodSetQuery query)
{
var readQuery =_readingPeriodSetRepository.AsQueryable().Include(x=>x.ReadingPeriodSites)
.WhereIf(query.TrialId!=null,x=>x.TrialId==query.TrialId)
.WhereIf(query.ReadingPeriodName != null, x => x.ReadingPeriodName.Contains(query.ReadingPeriodName))
.ProjectTo(_mapper.ConfigurationProvider);
var pageList= await readQuery.ToPagedListAsync(query.PageIndex, query.PageSize, query.SortField == null ? "CreateTime" : query.SortField,
query.SortAsc);
return pageList;
}
///
/// 获取单条
///
///
///
[HttpPost("{id:guid}")]
public async Task GetReadingPeriodSet(Guid id)
{
var data = await _readingPeriodSetRepository.AsQueryable().Include(x => x.ReadingPeriodSites).Where(x => x.Id == id).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
return data;
}
///
/// 设置阅片期配置是否生效
///
///
///
[HttpPut]
public async Task SetReadingPeriodSetEffect(SetReadingPeriodSetEffect indto)
{
if (indto.IsTakeEffect == ReadingPeriodStatus.TakeEffect)
{
var plans = _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == indto.Id).Include(x=>x.SubjectVisit)
.Include(x => x.ReadingPeriodSet).ToList();
var needAddVisitIds = plans.Select(x => x.SubjectVisitId).ToList();
var repeatVisitNames = _readModuleRepository.Where(x => x.ReadingSetType == ReadingSetType.ImageReading && needAddVisitIds.Contains(x.SubjectVisitId)).Select(x => x.SubjectVisit.VisitName).ToList();
if(repeatVisitNames.Count!=0)
{
return ResponseOutput.NotOk($"{string.Join(",", repeatVisitNames)}已经添加过阅片期,无法设置生效");
}
List readModules = new List();
foreach (var item in plans)
{
readModules.Add(new ReadModule()
{
Id = NewId.NextGuid(),
SubjectId = item.SubjectVisit.SubjectId,
ModuleType = item.ReadingPeriodSet.ReadingSetType == ReadingSetType.ImageReading ? ModuleTypeEnum.Read : ModuleTypeEnum.Oncology,
IsUrgent = item.SubjectVisit.IsUrgent,
ModuleName = item.ReadingPeriodSet.ReadingPeriodName,
SubjectVisitId = item.SubjectVisitId,
ReadingSetType = item.ReadingPeriodSet.ReadingSetType,
ReadingPeriodSetId= item.ReadingPeriodSet.Id,
Status = ReadingCommon.GetVisitSubmitStateEnum(item.SubjectVisit),
});
};
await _readModuleRepository.AddRangeAsync(readModules);
}
else
{
await _readModuleRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == indto.Id);
}
var readQuery =await _readingPeriodSetRepository.UpdatePartialFromQueryAsync(indto.Id, x => new ReadingPeriodSet() {
IsTakeEffect = indto.IsTakeEffect
});
var result = await _readingPeriodSetRepository.SaveChangesAsync();
return ResponseOutput.Result(result);
}
///
/// 删除
///
///
///
[HttpDelete("{readingPeriodSetId:guid}")]
public async Task DeleteReadingPeriodSet(Guid readingPeriodSetId)
{
var success = await _repository.BatchDeleteAsync(t => t.Id == readingPeriodSetId);
return ResponseOutput.Result(success);
}
}
}