irc-netcore-api/IRaCIS.Core.Application/Service/Reading/ReadModuleService.cs

252 lines
10 KiB
C#

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 Panda.DynamicWebApi.Attributes;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Infra.EFCore.Common;
namespace IRaCIS.Application.Services
{
/// <summary>
/// 生成的阅片模块(在大列表上展示的) 阅片期
/// </summary>
[ApiExplorerSettings(GroupName = "Reading")]
public class ReadModuleService : BaseService
{
public IRepository<SubjectVisit> _subjectVisitRepository;
private readonly IRepository<Subject> _subjectRepository;
private readonly IRepository<VisitStage> _visitstageRepository;
private readonly IRepository<ReadingPeriodSet> _readingPeriodSetRepository;
private readonly IRepository<ReadModule> _readModuleRepository;
public ReadModuleService(IRepository<SubjectVisit> subjectVisitRepository,
IRepository<Subject> subjectRepository,
IRepository<VisitStage> visitstageRepository,
IRepository<ReadingPeriodSet> readingPeriodSetRepository,
IRepository<ReadModule> readModuleRepository
)
{
_subjectVisitRepository = subjectVisitRepository;
this._subjectRepository = subjectRepository;
this._visitstageRepository = visitstageRepository;
this._readingPeriodSetRepository = readingPeriodSetRepository;
this._readModuleRepository = readModuleRepository;
}
/// <summary>
/// 获取读片模块
/// </summary>
[HttpPost]
public async Task<(PageOutput<GetReadModuleDtoOut>,object)> GetReadModule(GetReadModuleDto dto)
{
var subjectquery = _subjectRepository.WhereIf(dto.TrialId!=null, x => x.TrialId == dto.TrialId)
.WhereIf(dto.SubjectId != null, x => x.Id == dto.SubjectId)
.Include(x => x.SubjectVisitList).Include(x=>x.Site).Include(x => x.TrialSite)
.Select(x => new GetReadModuleDtoOut
{
SiteCode = x.TrialSite.TrialSiteCode,
SiteId = x.SiteId,
SubjectCode = x.Code,
SubjectId = x.Id,
Data=x.SubjectVisitList.OrderByDescending(y=>y.InPlan).Select(y=>new GetReadModuleOutDto()
{
Id = y.Id, //id
Name=y.VisitName,
ModuleType = y.InPlan ? ModuleTypeEnum.InPlanSubjectVisit : ModuleTypeEnum.OutPlanSubjectVisit, // 模块类型
IsUrgent = x.IsUrgent, // 是否加急
SubjectVisitId = y.Id, // 访视ID
SubjectVisitName=y.VisitName, // 访视名称
Status= ReadingCommon.GetVisitSubmitStateEnum(y), // 状态
CreateTime = y.CreateTime, // 创建时间
SubjectCode = y.Subject.Code, // 受试者code
SiteCode = x.TrialSite.TrialSiteCode, // 中心Code
IsFinalVisit=y.IsFinalVisit, // 是否为末次评估
OutPlanPreviousVisitId = y.OutPlanPreviousVisitId, // 上一访视
OutPlanPreviousVisitName = y.OutPlanPreviousVisit.VisitName, // 上一访视名称
SiteId = x.Site.Id, // 中心ID
IsVisit=true, // 是否为访视
PDState = y.PDState, // PD 进展
IsEnrollmentConfirm=y.IsEnrollmentConfirm, // 入组
SubjectId = x.Id,
}).ToList()
});
var pageList = await subjectquery.ToPagedListAsync(dto.PageIndex, dto.PageSize, dto.SortField == null|| dto.SortField==string.Empty ? "SiteCode" : dto.SortField,
dto.Asc);
var subjectisd = pageList.CurrentPageData.Select(x => x.SubjectId).ToList();
var readModules =await _readModuleRepository.Where(x => subjectisd.Contains(x.SubjectId)).Include(x=>x.SubjectVisit)
.Include(x => x.ReadModuleModel).ToListAsync();
pageList.CurrentPageData.ForEach(x => {
x.Data.AddRange(readModules.Where(y => y.SubjectId == x.SubjectId).Select(
y => new GetReadModuleOutDto()
{
CreateTime = y.CreateTime,
Id = y.Id,
Name=y.ModuleName,
SubjectId=x.SubjectId,
ModuleType=y.ModuleType,
Status= ReadingCommon.GetVisitSubmitStateEnum(y.SubjectVisit),
SubjectCode= x.SubjectCode,
SiteCode=x.SiteCode,
SubjectVisitId= y.SubjectVisitId,
SubjectVisitName=y.SubjectVisit?.VisitName, // 截止访视名称
CutOffVisitId = y.SubjectVisitId, // 截止访视
CutOffVisitName = y.SubjectVisit?.VisitName, // 截止访视名称
ReadModuleId=y.ReadModuleId,
ReadModuleName=y.ReadModuleModel?.ModuleName,
IsUrgent = y.IsUrgent
}));
x.Data.OrderBy(y => y.ModuleType);
});
return (pageList, new
{
MaxLength = pageList.CurrentPageData.ToList().Max(x => x.Data.Count)
});
}
///// <summary>
///// 访视阅片完成添加阅片期模块
///// </summary>
///// <returns></returns>
//public async Task<IResponseOutput> VisitFinishReadingAddReadModule(VisitFinishReadingAddReadModuleInDto inDto)
//{
// var subjectVisit = await _subjectRepository.FirstOrDefaultNoTrackingAsync(x => x.Id == inDto.SubjectVisitId);
// List<ReadingPeriodSet> readingPeriodSets= _readingPeriodSetRepository.Where(x=>x.TrialId==inDto.TrialId&&x.IsTakeEffect=&&(x.ReadingScope==ReadingScopeEnum.All||(x.ReadingScope==ReadingScopeEnum.Site&&x.ReadingPeriodSites.Select(y=>y.SiteId).Contains(subjectVisit.SiteId))))
//}
/// <summary>
/// 获取单条信息
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
public async Task<GetReadModuleSingleOutdto> GetReadModuleSingle(GetReadModuleSingleIndto dto)
{
var data = await GetReadModule(new GetReadModuleDto()
{
SubjectId = dto.SubjectId,
});
var GetReadModuleOutDto = data.Item1.CurrentPageData.FirstOrDefault().Data.Where(x => x.Id == dto.Id).Select(x => new GetReadModuleSingleOutdto()
{
Id = x.Id,
ModuleType = x.ModuleType,
SubjectVisitId = x.SubjectVisitId,
SubjectVisitName = x.SubjectVisitName,
Stakeholders = string.Empty
}).FirstOrDefault();
SubjectVisit visit = (await _subjectVisitRepository.Where(x => x.Id == GetReadModuleOutDto.SubjectVisitId).FirstOrDefaultAsync()).IfNullThrowConvertException();
//switch (GetVisitSubmitStateEnum(visit))
//{
// case ReadModuleEnum.ImageUpload:
// case
// break;
//};
return GetReadModuleOutDto;
}
/// <summary>
/// 添加阅片期
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> AddReadModule(ReadModuleAddDto dto)
{
var visitquery = _subjectVisitRepository.Where(x => x.SubjectId == dto.SubjectId && x.InPlan);
visitquery = visitquery.WhereIf(dto.ExpirationDate != null,x => x.LatestScanDate <= dto.ExpirationDate.Value);
visitquery = visitquery.WhereIf(dto.ExpirationVisitNum != null, x => x.VisitNum <= dto.ExpirationVisitNum.Value);
var visit = visitquery.OrderByDescending(x => x.VisitNum).FirstOrDefault();
if (visit != null)
{
await _readModuleRepository.AddAsync(new ReadModule()
{
Id= NewId.NextGuid(),
SubjectId = dto.SubjectId,
ModuleType = ModuleTypeEnum.Read,
IsUrgent = visit.IsUrgent,
ModuleName = dto.Name,
SubjectVisitId = visit.Id,
ReadingSetType= ReadingSetType.ImageReading,
Status = ReadingCommon.GetVisitSubmitStateEnum(visit),
});
var res = await _readModuleRepository.SaveChangesAsync();
return ResponseOutput.Ok(res);
}
else
{
return ResponseOutput.NotOk("No qualified visit was found ");
}
}
///// <summary>
///// 新增或者修改
///// </summary>
///// <param name="addOrEditReadModule"></param>
///// <returns></returns>
//[HttpPost]
//public async Task<IResponseOutput> AddOrUpdateReadModuleService(ReadModuleAddOrEdit addOrEditReadModule)
//{
// var entity = await _repository.InsertOrUpdateAsync<ReadModule, ReadModuleAddOrEdit>(addOrEditReadModule, true);
// return ResponseOutput.Ok(entity.Id.ToString());
//}
/// <summary>
/// 删除
/// </summary>
/// <param name="readModuleId"></param>
/// <returns></returns>
[HttpDelete("{readModuleId:guid}")]
public async Task<IResponseOutput> DeleteReadModule(Guid readModuleId)
{
var success = await _readModuleRepository.DeleteFromQueryAsync(t => t.Id == readModuleId, true);
return ResponseOutput.Result(true);
}
}
}