This commit is contained in:
2023-06-27 15:22:18 +08:00
14 changed files with 678 additions and 24 deletions
@@ -0,0 +1,185 @@
//--------------------------------------------------------------------
// 此代码由T4模板自动生成 byzhouhang 20210918
// 生成时间 2023-06-15 15:06:06
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//--------------------------------------------------------------------
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Domain.Share;
using MassTransit;
namespace IRaCIS.Core.Application.Service
{
/// <summary>
/// 临床答案
/// </summary>
[ApiExplorerSettings(GroupName = "Reading")]
public class ClinicalAnswerService : BaseService
{
private readonly IRepository<TrialClinicalQuestion> _trialClinicalQuestionRepository;
private readonly IRepository<SystemClinicalQuestion> _systemClinicalQuestionRepository;
private readonly IRepository<SystemClinicalTableQuestion> _systemClinicalTableQuestionRepository;
private readonly IRepository<TrialClinicalTableQuestion> _trialClinicalTableQuestionRepository;
private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository;
private readonly IRepository<ClinicalForm> _clinicalFormRepository;
private readonly IRepository<ClinicalQuestionAnswer> _clinicalQuestionAnswerRepository;
private readonly IRepository<ClinicalTableAnswer> _clinicalTableAnswerRepository;
private readonly IClinicalQuestionService _iClinicalQuestionService;
public ClinicalAnswerService(IRepository<TrialClinicalQuestion> trialClinicalQuestionRepository,
IRepository<SystemClinicalTableQuestion> systemClinicalTableQuestionRepository,
IRepository<TrialClinicalTableQuestion> trialClinicalTableQuestionRepository,
IRepository<ClinicalForm> clinicalFormRepository,
IRepository<ClinicalTableAnswer> clinicalTableAnswerRepository,
IRepository<ClinicalQuestionAnswer> clinicalQuestionAnswerRepository,
IClinicalQuestionService iClinicalQuestionService,
IRepository<ClinicalDataTrialSet> clinicalDataTrialSetRepository,
IRepository<SystemClinicalQuestion> systemClinicalQuestionRepository
)
{
_clinicalQuestionAnswerRepository = clinicalQuestionAnswerRepository;
_systemClinicalTableQuestionRepository = systemClinicalTableQuestionRepository;
_trialClinicalQuestionRepository = trialClinicalQuestionRepository;
_trialClinicalTableQuestionRepository = trialClinicalTableQuestionRepository;
_systemClinicalQuestionRepository = systemClinicalQuestionRepository;
_clinicalDataTrialSetRepository = clinicalDataTrialSetRepository;
_clinicalFormRepository = clinicalFormRepository;
_clinicalTableAnswerRepository = clinicalTableAnswerRepository;
_iClinicalQuestionService = iClinicalQuestionService;
}
/// <summary>
/// 获取CRC受试者临床数据
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<GetCRCSubjectClinicalOutDto>> GetCRCSubjectClinicalList(GetCRCSubjectClinicalInDto inDto)
{
var result =await _clinicalDataTrialSetRepository.Where(x => x.TrialId == inDto.TrialId).OrderBy(x=>x.ClinicalDataSetName).Select(x => new GetCRCSubjectClinicalOutDto()
{
ClinicalDataTrialSetId = x.Id,
ClinicalDataSetName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us),
}).ToListAsync();
var clinicalData = await _clinicalFormRepository.Where(x => x.SubjectId == inDto.TrialId).ToListAsync();
result.ForEach(x =>
{
x.ClinicalCount = clinicalData.Where(y => y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Count();
});
return result;
}
/// <summary>
/// 获取表单列表
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<GetClinicalQuestionAnswerListOutDto> GetClinicalQuestionFormList(GetClinicalQuestionAnswerListInDto inDto)
{
var result = new GetClinicalQuestionAnswerListOutDto();
result.AnswerList = new List<Dictionary<string, string>>();
result.QuestionList=await _trialClinicalQuestionRepository.Where(x=>x.TrialClinicalId==inDto.ClinicalDataTrialSetId
&&x.ClinicalQuestionType!= ReadingQestionType.Group
&& x.ClinicalQuestionType != ReadingQestionType.Table).OrderBy(x=>x.ShowOrder)
.ProjectTo<TrialClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
var answers = await _clinicalQuestionAnswerRepository.Where(x => x.SubjectId == inDto.SubjectId && x.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId)
.Select(x => new
{
x.ClinicalFormId,
x.ClinicalForm.CheckDate,
x.QuestionId,
x.Answer
})
.ToListAsync();
var ClinicalFormIds = answers.OrderBy(x=>x.CheckDate).Select(x => x.ClinicalFormId).Distinct().ToList();
ClinicalFormIds.ForEach(x =>
{
var dic = answers.Where(y => y.ClinicalFormId == x).ToDictionary(x => x.QuestionId.ToString(), x => x.Answer);
dic.Add("clinicalFormId", x.ToString());
result.AnswerList.Add(dic);
});
return result;
}
/// <summary>
/// 获取临床数据表单问题
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<GetClinicalFormInfoOutDto> GetClinicalFormInfo(GetClinicalFormInfoInDto inDto)
{
var formInfo = await _clinicalFormRepository.Where(x => x.Id == inDto.ClinicalFormId).FirstNotNullAsync();
var questionAnswer = await _clinicalQuestionAnswerRepository.Where(x => x.ClinicalFormId == inDto.ClinicalFormId).Select(x => new ClinicalFormQuestionAnswer
{
QuestionId = x.QuestionId,
Answer = x.Answer
}).ToListAsync();
var tableAnswer = await _clinicalTableAnswerRepository.Where(x => x.ClinicalFormId == inDto.ClinicalFormId).Select(x => new ClinicalFormTableQuestionAnswer
{
TableQuestionId = x.TableQuestionId,
Answer = x.Answer,
QuestionId = x.QuestionId,
RowIndex = x.ClinicalAnswerRowInfo.RowIndex
}).ToListAsync();
var questions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == formInfo.ClinicalDataTrialSetId)
.ProjectTo<ClinicalQuestionPreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
var tableQuestions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == formInfo.ClinicalDataTrialSetId)
.ProjectTo<ClinicalTablePreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).ToList();
result.ForEach(x =>
{
_iClinicalQuestionService.FindChildQuestion(x, questions, tableQuestions, questionAnswer, tableAnswer);
});
return new GetClinicalFormInfoOutDto()
{
Question = result
};
}
/// <summary>
/// 提交临床数据表单
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task SubmitClinicalForm(SubmitClinicalFormInDto inDto)
{
}
}
}
@@ -61,7 +61,7 @@ namespace IRaCIS.Core.Application.Service
result.ForEach(x =>
{
this.FindChildQuestion(x, questions, tableQuestions);
this.FindChildQuestion(x, questions, tableQuestions, new List<ClinicalFormQuestionAnswer>(), new List<ClinicalFormTableQuestionAnswer>());
});
return (result, true);
@@ -87,7 +87,7 @@ namespace IRaCIS.Core.Application.Service
result.ForEach(x =>
{
this.FindChildQuestion(x, questions, tableQuestions);
this.FindChildQuestion(x, questions, tableQuestions,new List<ClinicalFormQuestionAnswer> (),new List<ClinicalFormTableQuestionAnswer>());
});
return (result, true);
@@ -101,14 +101,27 @@ namespace IRaCIS.Core.Application.Service
/// <param name="item"></param>
/// <param name="questions"></param>
/// <param name="tableQuestions"></param>
public void FindChildQuestion(ClinicalQuestionPreviewDto item, List<ClinicalQuestionPreviewDto> questions, List<ClinicalTablePreviewDto> tableQuestions)
public void FindChildQuestion(ClinicalQuestionPreviewDto item, List<ClinicalQuestionPreviewDto> questions, List<ClinicalTablePreviewDto> tableQuestions,List<ClinicalFormQuestionAnswer> answers, List<ClinicalFormTableQuestionAnswer> tableAnswers)
{
item.Childrens = questions.Where(x => (x.ParentId == item.Id)||(x.GroupId== item.Id&&x.ParentId==null)).ToList();
item.Answer = answers.Where(x => x.QuestionId == item.Id).Select(x => x.Answer).FirstOrDefault()??string.Empty;
item.TableQuestions = tableQuestions.Where(x => x.QuestionId == item.Id).ToList();
var tableIndexs = tableAnswers.Where(x => x.QuestionId == item.Id).Select(x => x.RowIndex).Distinct().OrderBy(x=>x).ToList();
item.TableAnswer = new List<Dictionary<Guid, string>>();
tableIndexs.ForEach(x =>
{
item.TableAnswer.Add(tableAnswers.Where(y => y.RowIndex == x).ToDictionary(y => y.TableQuestionId, y => y.Answer));
});
item.TableQuestions = tableQuestions.Where(x => x.QuestionId == item.Id).OrderBy(x=>x.ShowOrder).ToList();
item.Childrens.ForEach(x => {
this.FindChildQuestion(x, questions, tableQuestions);
this.FindChildQuestion(x, questions, tableQuestions, answers, tableAnswers);
});
}
@@ -123,7 +136,7 @@ namespace IRaCIS.Core.Application.Service
public async Task<PageOutput<TrialClinicalQuestionDto>> GetTrialClinicalQuestionList(TrialClinicalQuestionQuery inQuery)
{
var trialClinicalQuestionQueryable = _trialClinicalQuestionRepository
var trialClinicalQuestionQueryable = _trialClinicalQuestionRepository.Where(x=>x.TrialClinicalId==inQuery.TrialClinicalId)
.WhereIf(!inQuery.QuestionName.IsNullOrEmpty(), x => x.QuestionName.Contains(inQuery.QuestionName) || x.QuestionEnName.Contains(inQuery.QuestionName))
.ProjectTo<TrialClinicalQuestionDto>(_mapper.ConfigurationProvider);
var pageList = await trialClinicalQuestionQueryable
@@ -415,10 +428,10 @@ namespace IRaCIS.Core.Application.Service
}).ToListAsync();
var newTrialQuestionAll = await _systemClinicalQuestionRepository.Where(x => systemClinicalId.Contains(x.SystemClinicalId))
.ProjectTo<TrialClinicalQuestion>(_mapper.ConfigurationProvider).ToListAsync();
.ProjectTo<TrialClinicalQuestionSynchronize>(_mapper.ConfigurationProvider).ToListAsync();
var newTrialTableQuestionAll = await _systemClinicalTableQuestionRepository.Where(x => systemClinicalId.Contains(x.SystemClinicalId))
.ProjectTo<TrialClinicalTableQuestion>(_mapper.ConfigurationProvider).ToListAsync();
.ProjectTo<TrialClinicalTableQuestionSynchronize>(_mapper.ConfigurationProvider).ToListAsync();
List<TrialClinicalQuestion> addTrialDataList = new List<TrialClinicalQuestion>();
@@ -430,7 +443,7 @@ namespace IRaCIS.Core.Application.Service
x => x.TrialQuestionId
);
var newTrialQuestionList = newTrialQuestionAll.Where(x => x.SystemClinicalQuestionId == item.SystemClinicalId).ToList();
var newTrialQuestionList = newTrialQuestionAll.Where(x => x.SystemClinicalId == item.SystemClinicalId).ToList();
newTrialQuestionList.ForEach(x =>
{
if (questionRelation.ContainsKey(x.Id))
@@ -469,7 +482,7 @@ namespace IRaCIS.Core.Application.Service
x => x.TrialQuestionId
);
var newTrialTableQuestionList = newTrialTableQuestionAll.Where(x => x.TrialClinicalId == item.TrialClinicalId)
var newTrialTableQuestionList = newTrialTableQuestionAll.Where(x => x.SystemClinicalId == item.SystemClinicalId)
.ToList();
@@ -504,6 +517,7 @@ namespace IRaCIS.Core.Application.Service
await _trialClinicalQuestionRepository.AddRangeAsync(addTrialDataList);
await _trialClinicalTableQuestionRepository.BatchDeleteNoTrackingAsync(x => trialClinicalId.Contains(x.TrialClinicalId) );
await _trialClinicalTableQuestionRepository.AddRangeAsync(addTrialTableList);
await _trialClinicalQuestionRepository.SaveChangesAsync();
}
@@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Application.Service.Reading.Dto
{
public class GetCRCSubjectClinicalInDto
{
public Guid SubjectId { get; set; }
public Guid TrialId { get; set; }
}
public class GetCRCSubjectClinicalOutDto
{
public Guid ClinicalDataTrialSetId { get; set; }
public string ClinicalDataSetName { get; set; }
public int ClinicalCount { get; set; }
}
public class GetClinicalQuestionAnswerListInDto
{
public Guid SubjectId { get; set; }
public Guid ClinicalDataTrialSetId { get; set; }
}
public class GetClinicalQuestionAnswerListOutDto
{
public List<TrialClinicalQuestionDto> QuestionList { get; set; }
public List<Dictionary<string, string>> AnswerList { get; set; }
}
public class GetClinicalFormInfoInDto
{
public Guid ClinicalFormId { get; set; }
}
public class GetClinicalFormInfoOutDto
{
public List<ClinicalQuestionPreviewDto> Question { get; set; }
}
public class ClinicalFormQuestionAnswer
{
public Guid QuestionId { get; set; }
public string Answer { get; set; } = string.Empty;
}
public class ClinicalFormTableQuestionAnswer
{
public Guid TableQuestionId { get; set; }
public int RowIndex { get; set; }
public Guid QuestionId { get; set; }
public string Answer { get; set; } = string.Empty;
}
public class SubmitClinicalFormInDto
{
public Guid? ClinicalFormId { get; set; }
public Guid SubjectId { get; set; }
public Guid ClinicalDataTrialSetId { get; set; }
public List<ClinicalFormQuestionAnswer> QuestionAnswers { get; set; }
public List<List<ClinicalFormQuestionAnswer>> TableQuestionAnswer { get; set; }
}
}
@@ -37,6 +37,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public Guid SystemClinicalId { get; set; }
public string Answer { get; set; } = string.Empty;
/// <summary>
/// 子问题
/// </summary>
@@ -46,11 +48,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// 表格问题
/// </summary>
public List<ClinicalTablePreviewDto> TableQuestions { get; set; } = new List<ClinicalTablePreviewDto>();
public List<Dictionary<Guid,string>> TableAnswer { get; set; }
}
/// <summary>
/// 系统临床数据问题
/// 项目临床数据问题
/// </summary>
public class ClinicalTablePreviewDto : TrialClinicalTableQuestionDto
{
@@ -399,6 +403,24 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
#region
public class TrialClinicalTableQuestionSynchronize : TrialClinicalTableQuestion
{
/// <summary>
/// 系统临床数据Id
/// </summary>
public Guid SystemClinicalId { get; set; }
}
public class TrialClinicalQuestionSynchronize : TrialClinicalQuestion
{
/// <summary>
/// 系统临床数据Id
/// </summary>
public Guid SystemClinicalId { get; set; }
}
public class SynchronizationQuestionDto
{
/// <summary>
@@ -17,8 +17,8 @@ namespace IRaCIS.Core.Application.Interfaces
Task SynchronizationQuestion(List<SynchronizationQuestionDto> inDto);
void FindChildQuestion(ClinicalQuestionPreviewDto item, List<ClinicalQuestionPreviewDto> questions, List<ClinicalTablePreviewDto> tableQuestions, List<ClinicalFormQuestionAnswer> answers, List<ClinicalFormTableQuestionAnswer> tableAnswers);
}
@@ -31,10 +31,16 @@ namespace IRaCIS.Core.Application.Service
CreateMap<TrialClinicalTableQuestionDto, TrialClinicalTableQuestion>();
CreateMap<SystemClinicalQuestion, TrialClinicalQuestion>()
.ForMember(d => d.SystemClinicalQuestionId, u => u.MapFrom(s => s.Id));
.ForMember(d => d.SystemClinicalQuestionId, opt => opt.MapFrom(src => src.Id));
CreateMap<SystemClinicalQuestion, TrialClinicalQuestionSynchronize>()
.ForMember(d => d.SystemClinicalQuestionId, opt => opt.MapFrom(src => src.Id));
CreateMap<SystemClinicalTableQuestion, TrialClinicalTableQuestion>()
.ForMember(d => d.SystemTableQuestionId, u => u.MapFrom(s => s.Id));
CreateMap<SystemClinicalTableQuestion, TrialClinicalTableQuestionSynchronize>()
.ForMember(d => d.SystemTableQuestionId, opt => opt.MapFrom(src => src.Id));
// 预览