保存分割绑定和答案
continuous-integration/drone/push Build is passing Details

Test_IRC_Net8
Hewt 2026-03-20 09:35:33 +08:00
parent c84fed8af1
commit 7a8ec6221f
2 changed files with 122 additions and 9 deletions

View File

@ -18,6 +18,16 @@ public class SegmentBindingView : SegmentBindingAddOrEdit
} }
public class SaveSegmentBindingAndAnswerInDto
{
public Guid VisitTaskId { get; set; }
public List<SaveSegmentBindingDto> BindingList { get; set; }
}
public class SaveSegmentBindingDto : SegmentBindingAddOrEdit
{
public string Answer { get; set; }
}
public class SegmentBindingAddOrEdit public class SegmentBindingAddOrEdit
{ {

View File

@ -23,6 +23,10 @@ namespace IRaCIS.Core.Application.Service;
[ ApiExplorerSettings(GroupName = "Reading")] [ ApiExplorerSettings(GroupName = "Reading")]
public class SegmentationService(IRepository<Segmentation> _segmentationRepository, public class SegmentationService(IRepository<Segmentation> _segmentationRepository,
IRepository<SegmentBinding> _segmentBindingRepository, IRepository<SegmentBinding> _segmentBindingRepository,
IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswerRepository,
IRepository<VisitTask> _visitTaskRepository,
IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository,
IRepository<ReadingTableQuestionAnswer> _readingTableQuestionAnswerRepository,
IRepository<Segment> _segmentRepository, IRepository<Segment> _segmentRepository,
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer): BaseService, ISegmentationService IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer): BaseService, ISegmentationService
{ {
@ -151,9 +155,7 @@ public class SegmentationService(IRepository<Segmentation> _segmentationReposito
.WhereIf(inQuery.SegmentId != null, x => x.SegmentId == inQuery.SegmentId) .WhereIf(inQuery.SegmentId != null, x => x.SegmentId == inQuery.SegmentId)
.WhereIf(inQuery.SegmentationId != null, x => x.SegmentationId == inQuery.SegmentationId) .WhereIf(inQuery.SegmentationId != null, x => x.SegmentationId == inQuery.SegmentationId)
.WhereIf(inQuery.TableQuestionId != null, x => x.TableQuestionId == inQuery.TableQuestionId) .WhereIf(inQuery.TableQuestionId != null, x => x.TableQuestionId == inQuery.TableQuestionId)
.WhereIf(inQuery.VisitTaskId != null, x => x.VisitTaskId == inQuery.VisitTaskId) .WhereIf(inQuery.VisitTaskId != null, x => x.VisitTaskId == inQuery.VisitTaskId)
.ProjectTo<SegmentBindingView>(_mapper.ConfigurationProvider); .ProjectTo<SegmentBindingView>(_mapper.ConfigurationProvider);
var pageList = await segmentBindingQueryable.ToPagedListAsync(inQuery); var pageList = await segmentBindingQueryable.ToPagedListAsync(inQuery);
@ -190,6 +192,107 @@ public class SegmentationService(IRepository<Segmentation> _segmentationReposito
return ResponseOutput.Ok(); return ResponseOutput.Ok();
} }
/// <summary>
/// 保存分割绑定和答案
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<IResponseOutput> SaveSegmentBindingAndAnswer(SaveSegmentBindingAndAnswerInDto inDto)
{
var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId)
.FirstNotNullAsync();
foreach (var item in inDto.BindingList)
{
// 处理绑定关系
var binding = await _segmentBindingRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.QuestionId == item.QuestionId && x.RowId == item.RowId && x.TableQuestionId == item.TableQuestionId)
.FirstOrDefaultAsync();
if (binding == null)
{
await _segmentBindingRepository.InsertFromDTOAsync(new SegmentBinding
{
VisitTaskId = inDto.VisitTaskId,
QuestionId = item.QuestionId,
RowId = item.RowId,
TableQuestionId = item.TableQuestionId,
SegmentId = item.SegmentId,
SegmentationId = item.SegmentationId,
});
}
else
{
await _segmentBindingRepository.UpdatePartialFromQueryAsync(x => x.Id == binding.Id, t => new SegmentBinding
{
SegmentId = item.SegmentId,
SegmentationId = item.SegmentationId,
});
}
// 处理问题
if (item.RowId != null && item.TableQuestionId != null)
{
var answer = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.RowId == item.VisitTaskId && x.TableQuestionId == item.TableQuestionId)
.FirstOrDefaultAsync();
var rowinfo= await _readingTableAnswerRowInfoRepository.Where(x => x.Id==item.RowId)
.Include(x=>x.VisitTask)
.FirstNotNullAsync();
if (answer != null)
{
await _readingTableQuestionAnswerRepository.UpdatePartialFromQueryAsync(x => x.Id == answer.Id, t => new ReadingTableQuestionAnswer
{
Answer = item.Answer
});
}
else
{
await _readingTableQuestionAnswerRepository.InsertFromDTOAsync(new ReadingTableQuestionAnswer
{
VisitTaskId = inDto.VisitTaskId,
RowId = item.RowId.Value,
TableQuestionId = item.TableQuestionId.Value,
Answer = item.Answer,
TrialId= rowinfo.VisitTask.TrialId,
RowIndex= rowinfo.RowIndex,
});
}
}
else
{
var answer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId &&x.ReadingQuestionTrialId==item.QuestionId)
.FirstOrDefaultAsync();
if (answer != null)
{
await _readingTaskQuestionAnswerRepository.UpdatePartialFromQueryAsync(x => x.Id == answer.Id, t => new ReadingTaskQuestionAnswer
{
Answer = item.Answer
});
}
else
{
await _readingTaskQuestionAnswerRepository.InsertFromDTOAsync(new ReadingTaskQuestionAnswer
{
ReadingQuestionTrialId= item.QuestionId.Value,
ReadingQuestionCriterionTrialId=taskinfo.TrialReadingCriterionId,
TrialId= taskinfo.TrialId,
SubjectId= taskinfo.SubjectId,
VisitTaskId = inDto.VisitTaskId,
Answer=item.Answer,
});
}
}
}
await _segmentationRepository.SaveChangesAsync();
return ResponseOutput.Ok();
}
} }