445 lines
18 KiB
C#
445 lines
18 KiB
C#
//--------------------------------------------------------------------
|
|
// 此代码由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 ClinicalQuestionService : BaseService, IClinicalQuestionService
|
|
{
|
|
|
|
private readonly IRepository<TrialClinicalQuestion> _trialClinicalQuestionRepository;
|
|
|
|
private readonly IRepository<SystemClinicalQuestion> _systemClinicalQuestionRepository;
|
|
|
|
|
|
private readonly IRepository<SystemClinicalTableQuestion> _systemClinicalTableQuestionRepository;
|
|
|
|
private readonly IRepository<TrialClinicalTableQuestion> _trialClinicalTableQuestionRepository;
|
|
|
|
public ClinicalQuestionService(IRepository<TrialClinicalQuestion> trialClinicalQuestionRepository,
|
|
IRepository<SystemClinicalTableQuestion> systemClinicalTableQuestionRepository,
|
|
IRepository<TrialClinicalTableQuestion> trialClinicalTableQuestionRepository,
|
|
IRepository<SystemClinicalQuestion> systemClinicalQuestionRepository
|
|
)
|
|
{
|
|
_systemClinicalTableQuestionRepository = systemClinicalTableQuestionRepository;
|
|
_trialClinicalQuestionRepository = trialClinicalQuestionRepository;
|
|
_trialClinicalTableQuestionRepository = trialClinicalTableQuestionRepository;
|
|
_systemClinicalQuestionRepository = systemClinicalQuestionRepository;
|
|
}
|
|
|
|
|
|
#region 项目问题
|
|
|
|
/// <summary>
|
|
/// 获取项目临床问题
|
|
/// </summary>
|
|
/// <param name="inQuery"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<PageOutput<TrialClinicalQuestionDto>> GetTrialClinicalQuestionList(TrialClinicalQuestionQuery inQuery)
|
|
{
|
|
|
|
var trialClinicalQuestionQueryable = _trialClinicalQuestionRepository
|
|
.WhereIf(!inQuery.QuestionName.IsNullOrEmpty(), x => x.QuestionName.Contains(inQuery.QuestionName) || x.QuestionEnName.Contains(inQuery.QuestionName))
|
|
.ProjectTo<TrialClinicalQuestionDto>(_mapper.ConfigurationProvider);
|
|
var pageList = await trialClinicalQuestionQueryable
|
|
.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TrialClinicalQuestion.ShowOrder) : inQuery.SortField,
|
|
inQuery.Asc);
|
|
return pageList;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 新增或者修改项目临床问题
|
|
/// </summary>
|
|
/// <param name="inDto"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<IResponseOutput> AddOrUpdateTrialClinicalQuestion(TrialClinicalQuestionDto inDto)
|
|
{
|
|
if (await _trialClinicalQuestionRepository.AnyAsync(x =>x.TrialClinicalId==inDto.TrialClinicalId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName))
|
|
{
|
|
return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]);
|
|
}
|
|
|
|
var entity = await _trialClinicalQuestionRepository.InsertOrUpdateAsync(inDto, true);
|
|
return ResponseOutput.Ok(entity.Id.ToString());
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除项目临床数据问题
|
|
/// </summary>
|
|
/// <param name="id"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("{id:guid}")]
|
|
public async Task<IResponseOutput> DeleteTrialClinicalQuestion(Guid id)
|
|
{
|
|
var success = await _trialClinicalQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true);
|
|
return ResponseOutput.Ok();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取项目问题分组
|
|
/// </summary>
|
|
/// <param name="inDto"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<List<TrialClinicalQuestionDto>> GetTrialClinicalGroupQuestionList(GetTrialGroupDto inDto)
|
|
{
|
|
return await this._trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId&&x.ClinicalQuestionType== "group")
|
|
.ProjectTo<TrialClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取项目标准其他问题
|
|
/// </summary>
|
|
/// <param name="inDto"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<List<TrialClinicalQuestionDto>> GetTrialClinicalOtherQuestionList(GetTrialGroupDto inDto)
|
|
{
|
|
var types = new List<string>()
|
|
{
|
|
"select","radio"
|
|
};
|
|
return await this._trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId && types.Contains( x.ClinicalQuestionType))
|
|
.ProjectTo<TrialClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
|
#region 系统问题
|
|
|
|
/// <summary>
|
|
/// 获取系统临床问题
|
|
/// </summary>
|
|
/// <param name="inQuery"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<PageOutput<SystemClinicalQuestionDto>> GetSystemClinicalQuestionList(SystemClinicalQuestionQuery inQuery)
|
|
{
|
|
|
|
var systemClinicalQuestionQueryable = _systemClinicalQuestionRepository
|
|
.WhereIf(!inQuery.QuestionName.IsNullOrEmpty(), x => x.QuestionName.Contains(inQuery.QuestionName) || x.QuestionEnName.Contains(inQuery.QuestionName))
|
|
.ProjectTo<SystemClinicalQuestionDto>(_mapper.ConfigurationProvider);
|
|
var pageList = await systemClinicalQuestionQueryable
|
|
.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(SystemClinicalQuestion.ShowOrder) : inQuery.SortField,
|
|
inQuery.Asc);
|
|
return pageList;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 新增或者修改系统临床问题
|
|
/// </summary>
|
|
/// <param name="inDto"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<IResponseOutput> AddOrUpdateSystemClinicalQuestion(SystemClinicalQuestionDto inDto)
|
|
{
|
|
|
|
if (await _systemClinicalQuestionRepository.AnyAsync(x => x.SystemClinicalId == inDto.SystemClinicalId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName))
|
|
{
|
|
return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]);
|
|
}
|
|
var entity = await _systemClinicalQuestionRepository.InsertOrUpdateAsync(inDto, true);
|
|
return ResponseOutput.Ok(entity.Id.ToString());
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 删除系统临床数据问题
|
|
/// </summary>
|
|
/// <param name="id"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("{id:guid}")]
|
|
public async Task<IResponseOutput> DeleteSystemClinicalQuestion(Guid id)
|
|
{
|
|
var success = await _systemClinicalQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true);
|
|
return ResponseOutput.Ok();
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 获取系统问题分组
|
|
/// </summary>
|
|
/// <param name="inDto"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<List<SystemClinicalQuestionDto>> GetSystemClinicalGroupQuestionList(GetSystemGroupDto inDto)
|
|
{
|
|
return await this._systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId && x.ClinicalQuestionType =="group")
|
|
.ProjectTo<SystemClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 获取系统其他问题
|
|
/// </summary>
|
|
/// <param name="inDto"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<List<SystemClinicalQuestionDto>> GetSystemClinicalOtherQuestionList(GetSystemGroupDto inDto)
|
|
{
|
|
var types = new List<string>()
|
|
{
|
|
"select","radio"
|
|
};
|
|
return await this._systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId && types.Contains(x.ClinicalQuestionType))
|
|
.ProjectTo<SystemClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
#region 系统表格问题
|
|
|
|
/// <summary>
|
|
/// 获取系统表格问题
|
|
/// </summary>
|
|
/// <param name="inQuery"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<PageOutput<SystemClinicalTableQuestionDto>> GetSystemClinicalTableQuestionList(SystemClinicalTableQuestionQuery inQuery)
|
|
{
|
|
|
|
var systemClinicalTableQuestionQueryable = this._systemClinicalTableQuestionRepository
|
|
.Where(x => x.QuestionId == inQuery.QuestionId)
|
|
.ProjectTo<SystemClinicalTableQuestionDto>(_mapper.ConfigurationProvider);
|
|
|
|
var pageList = await systemClinicalTableQuestionQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(SystemClinicalTableQuestion.ShowOrder) : inQuery.SortField,
|
|
inQuery.Asc);
|
|
|
|
return pageList;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 新增或修改系统表格问题
|
|
/// </summary>
|
|
/// <param name="inDto"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<IResponseOutput> AddOrUpdateSystemClinicalTableQuestion(SystemClinicalTableQuestionDto inDto)
|
|
{
|
|
if (await _systemClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName))
|
|
{
|
|
return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]);
|
|
}
|
|
|
|
var entity = await _systemClinicalTableQuestionRepository.InsertOrUpdateAsync(inDto, true);
|
|
|
|
return ResponseOutput.Ok(entity.Id.ToString());
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除系统表格问题
|
|
/// </summary>
|
|
/// <param name="id"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("{id:guid}")]
|
|
public async Task<IResponseOutput> DeleteSystemClinicalTableQuestion(Guid id)
|
|
{
|
|
var success = await _systemClinicalTableQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true);
|
|
return ResponseOutput.Ok();
|
|
}
|
|
#endregion
|
|
|
|
|
|
#region 项目表格问题
|
|
|
|
/// <summary>
|
|
/// 获取项目表格问题
|
|
/// </summary>
|
|
/// <param name="inQuery"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<PageOutput<TrialClinicalTableQuestionDto>> GetTrialClinicalTableQuestionList(TrialClinicalTableQuestionQuery inQuery)
|
|
{
|
|
|
|
var trialClinicalTableQuestionQueryable = this._trialClinicalTableQuestionRepository
|
|
.Where(x => x.QuestionId == inQuery.QuestionId)
|
|
.ProjectTo<TrialClinicalTableQuestionDto>(_mapper.ConfigurationProvider);
|
|
|
|
var pageList = await trialClinicalTableQuestionQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TrialClinicalTableQuestion.ShowOrder) : inQuery.SortField,
|
|
inQuery.Asc);
|
|
|
|
return pageList;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 新增或修改项目表格问题
|
|
/// </summary>
|
|
/// <param name="inDto"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<IResponseOutput> AddOrUpdateTrialClinicalTableQuestion(TrialClinicalTableQuestionDto inDto)
|
|
{
|
|
if (await _trialClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName))
|
|
{
|
|
return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]);
|
|
}
|
|
var entity = await _trialClinicalTableQuestionRepository.InsertOrUpdateAsync(inDto, true);
|
|
|
|
return ResponseOutput.Ok(entity.Id.ToString());
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除项目表格问题
|
|
/// </summary>
|
|
/// <param name="id"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("{id:guid}")]
|
|
public async Task<IResponseOutput> DeleteTrialClinicalTableQuestion(Guid id)
|
|
{
|
|
var success = await _trialClinicalTableQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true);
|
|
return ResponseOutput.Ok();
|
|
}
|
|
#endregion
|
|
|
|
|
|
#region 同步系统问题
|
|
|
|
/// <summary>
|
|
/// 同步系统问题
|
|
/// </summary>
|
|
/// <param name="inDto"></param>
|
|
/// <returns></returns>
|
|
public async Task SynchronizationQuestion(List<SynchronizationQuestionDto> inDto)
|
|
{
|
|
var trialClinicalId = inDto.Select(x => x.TrialClinicalId).ToList();
|
|
|
|
var systemClinicalId = inDto.Select(x => x.SystemClinicalId).ToList();
|
|
var questionRelationList =await _trialClinicalQuestionRepository.Where(x => trialClinicalId.Contains(x.TrialClinicalId)).Select(x => new QuestionDic()
|
|
{
|
|
SystemQuestionId=x.SystemClinicalQuestionId?? default(Guid),
|
|
TrialQuestionId=x.Id,
|
|
TrialClinicalId=x.TrialClinicalId,
|
|
}).ToListAsync();
|
|
|
|
var tableQuestionRelationList = await _trialClinicalTableQuestionRepository.Where(x => trialClinicalId.Contains(x.TrialClinicalId)).Select(x => new QuestionDic()
|
|
{
|
|
SystemQuestionId = x.SystemTableQuestionId ?? default(Guid),
|
|
TrialQuestionId = x.Id,
|
|
TrialClinicalId = x.TrialClinicalId,
|
|
}).ToListAsync();
|
|
|
|
var newTrialQuestionAll = await _systemClinicalQuestionRepository.Where(x => systemClinicalId.Contains(x.SystemClinicalId))
|
|
.ProjectTo<TrialClinicalQuestion>(_mapper.ConfigurationProvider).ToListAsync();
|
|
|
|
var newTrialTableQuestionAll = await _systemClinicalTableQuestionRepository.Where(x => systemClinicalId.Contains(x.SystemClinicalId))
|
|
.ProjectTo<TrialClinicalTableQuestion>(_mapper.ConfigurationProvider).ToListAsync();
|
|
|
|
|
|
List<TrialClinicalQuestion> addTrialDataList = new List<TrialClinicalQuestion>();
|
|
List<TrialClinicalTableQuestion> addTrialTableList = new List<TrialClinicalTableQuestion>();
|
|
foreach (var item in inDto)
|
|
{
|
|
var questionRelation = questionRelationList.Where(x=>x.TrialClinicalId==item.TrialClinicalId).ToDictionary(
|
|
x => x.SystemQuestionId,
|
|
x => x.TrialQuestionId
|
|
);
|
|
|
|
var newTrialQuestionList = newTrialQuestionAll.Where(x => x.SystemClinicalQuestionId == item.SystemClinicalId).ToList();
|
|
newTrialQuestionList.ForEach(x =>
|
|
{
|
|
if (questionRelation.ContainsKey(x.Id))
|
|
{
|
|
x.Id = questionRelation[x.Id];
|
|
}
|
|
else
|
|
{
|
|
var newid = NewId.NextGuid();
|
|
questionRelation.Add(x.Id, newid);
|
|
x.Id = newid;
|
|
}
|
|
|
|
x.TrialClinicalId = item.TrialClinicalId;
|
|
});
|
|
|
|
var copyNewQuestionList = newTrialQuestionList.Clone();
|
|
foreach (var x in newTrialQuestionList)
|
|
{
|
|
var question = x.Clone();
|
|
if (question.ParentId != null)
|
|
{
|
|
question.ParentId = questionRelation[question.ParentId ?? default(Guid)];
|
|
}
|
|
if (question.GroupId != null)
|
|
{
|
|
question.GroupId = questionRelation[question.GroupId ?? default(Guid)];
|
|
}
|
|
addTrialDataList.Add(question);
|
|
};
|
|
|
|
|
|
|
|
var tableQuestionRelation = tableQuestionRelationList.Where(x => x.TrialClinicalId == item.TrialClinicalId).ToDictionary(
|
|
x => x.SystemQuestionId,
|
|
x => x.TrialQuestionId
|
|
);
|
|
|
|
var newTrialTableQuestionList = newTrialTableQuestionAll.Where(x => x.TrialClinicalId == item.TrialClinicalId)
|
|
.ToList();
|
|
|
|
|
|
newTrialTableQuestionList.ForEach(x =>
|
|
{
|
|
if (tableQuestionRelation.ContainsKey(x.Id))
|
|
{
|
|
x.Id = tableQuestionRelation[x.Id];
|
|
}
|
|
else
|
|
{
|
|
var newid = NewId.NextGuid();
|
|
tableQuestionRelation.Add(x.Id, newid);
|
|
x.Id = newid;
|
|
}
|
|
});
|
|
|
|
foreach (var x in newTrialTableQuestionList)
|
|
{
|
|
var tableQuestion = x.Clone();
|
|
tableQuestion.TrialClinicalId = item.TrialClinicalId;
|
|
|
|
tableQuestion.QuestionId = copyNewQuestionList.Where(y => y.SystemClinicalQuestionId == x.QuestionId).Select(y => y.Id).FirstOrDefault();
|
|
|
|
|
|
addTrialTableList.Add(tableQuestion);
|
|
}
|
|
}
|
|
|
|
|
|
await _trialClinicalQuestionRepository.BatchDeleteNoTrackingAsync(x => trialClinicalId.Contains(x.TrialClinicalId));
|
|
await _trialClinicalQuestionRepository.AddRangeAsync(addTrialDataList);
|
|
await _trialClinicalTableQuestionRepository.BatchDeleteNoTrackingAsync(x => trialClinicalId.Contains(x.TrialClinicalId) );
|
|
await _trialClinicalTableQuestionRepository.AddRangeAsync(addTrialTableList);
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
}
|
|
}
|