From 308f5140a16f48d8704aa53b551ce2dd287d15c6 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Thu, 23 Oct 2025 16:58:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=AF=94=E4=BE=8B=E5=B0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reading/Dto/ReadingImageTaskViewModel.cs | 5 + .../ReadingNoDicomTaskService.cs | 99 +++++++++++++++++++ .../ReadingNoneDicomMarkBinding.cs | 4 +- 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs index 3f1331bd4..590a4b017 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs @@ -2479,6 +2479,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string OrderMarkName { get; set; } + /// + /// 比例 + /// + public decimal? Proportion { get; set; } + public Guid? MarkId { get; set; } public Guid? NoneDicomFileId { get; set; } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingNoDicomTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingNoDicomTaskService.cs index 857f708b9..1e242facd 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingNoDicomTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingNoDicomTaskService.cs @@ -4,6 +4,7 @@ using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Infra.EFCore.Common; using MassTransit; using Microsoft.AspNetCore.Mvc; using Panda.DynamicWebApi.Attributes; @@ -159,6 +160,98 @@ namespace IRaCIS.Core.Application.Service return ResponseOutput.Ok(); } + + /// + /// 修改比例修改答案 + /// + /// + /// + /// + private async Task ChangePlottingScale(Guid? id, decimal proportion) + { + var markInfo = await _readingNoneDicomMarkRepository.Where(x => x.Id == id).Select(x => new + { + x.NoneDicomFileId, + x.VisitTaskId + }).FirstNotNullAsync(); + + var visitTask = await _visitTaskRepository.Where(x => x.Id == markInfo.VisitTaskId).Include(x=>x.TrialReadingCriterion).FirstNotNullAsync(); + + + var digitPlaces = visitTask.TrialReadingCriterion.DigitPlaces??0; + + if (proportion == -1) + { + await _readingNoneDicomMarkBindingRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == markInfo.VisitTaskId && x.ReadingNoneDicomMark.NoneDicomFileId == markInfo.NoneDicomFileId); + } + else + { + var bindingList= await _readingNoneDicomMarkBindingRepository.Where(x => x.VisitTaskId == markInfo.VisitTaskId && x.ReadingNoneDicomMark.NoneDicomFileId == markInfo.NoneDicomFileId) + .ToListAsync(); + + List ImageToolAttributeList = new List() + { + "length", + "perimeter", + "area" + }; + + var questionAnswerList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == markInfo.VisitTaskId && + bindingList.Select(b => b.QuestionId).Contains(x.ReadingQuestionTrialId) + && ImageToolAttributeList.Contains(x.ReadingQuestionTrial.ImageToolAttribute)).Include(x=>x.ReadingQuestionTrial) + .ToListAsync(); + + foreach (var item in questionAnswerList) + { + var answerValue = item.Answer.IsNullOrEmptyReturn0(); + switch (item.ReadingQuestionTrial.ImageToolAttribute) + { + case "length": + case "perimeter": + answerValue = answerValue * proportion; + break; + case "area": + answerValue = answerValue * proportion * proportion; + break; + } + + + await _readingTaskQuestionAnswerRepository.UpdatePartialFromQueryAsync(item.Id, x => new ReadingTaskQuestionAnswer() + { + Answer= decimal.Round(answerValue, digitPlaces).ToString("F" + digitPlaces.ToString()) + }); + } + + var tableQuestionAnswerList = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == markInfo.VisitTaskId && + bindingList.Select(b => b.TableQuestionId).Contains(x.TableQuestionId) + && ImageToolAttributeList.Contains(x.ReadingTableQuestionTrial.ImageToolAttribute)).Include(x => x.ReadingTableQuestionTrial) + .ToListAsync(); + + foreach (var item in tableQuestionAnswerList) + { + var answerValue = item.Answer.IsNullOrEmptyReturn0(); + switch (item.ReadingTableQuestionTrial.ImageToolAttribute) + { + case "length": + case "perimeter": + answerValue = answerValue * proportion; + break; + case "area": + answerValue = answerValue * proportion * proportion; + break; + } + + + await _readingTableQuestionAnswerRepository.UpdatePartialFromQueryAsync(item.Id, x => new ReadingTableQuestionAnswer() + { + Answer = decimal.Round(answerValue, digitPlaces).ToString("F" + digitPlaces.ToString()) + }); + } + } + + return ResponseOutput.Ok(); + } + /// /// 删除绑定关系 /// @@ -197,7 +290,13 @@ namespace IRaCIS.Core.Application.Service [HttpPost] public async Task AddNoneDicomMark(AddNoneDicomMarkInDto inDto) { + var entity = await _readingNoneDicomMarkRepository.InsertOrUpdateAsync(inDto, true); + + if (inDto.Proportion != null) + { + await this.ChangePlottingScale(entity.Id, inDto.Proportion.Value); + } return ResponseOutput.Ok(entity.Id); } diff --git a/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingNoneDicomMarkBinding.cs b/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingNoneDicomMarkBinding.cs index 425aea6be..8ce8bd255 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingNoneDicomMarkBinding.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingNoneDicomMarkBinding.cs @@ -1,3 +1,5 @@ +using Org.BouncyCastle.Crypto.Digests; + namespace IRaCIS.Core.Domain.Models; [Comment("项目阅片 - 非Dicom标记绑定")] @@ -7,7 +9,7 @@ public class ReadingNoneDicomMarkBinding : BaseAddAuditEntity [JsonIgnore] [ForeignKey("NoneDicomMarkId")] - public NoneDicomStudy NoneDicomStudy { get; set; } + public ReadingNoneDicomMark ReadingNoneDicomMark { get; set; } public Guid VisitTaskId { get; set; }