Merge branch 'Uat_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details

Uat_IRC_Net8
he 2025-06-16 15:16:20 +08:00
commit c8bbb3da48
8 changed files with 149 additions and 69 deletions

View File

@ -94,7 +94,7 @@ namespace IRaCIS.Core.Application.Service
})).ToList();
await _readingGlobalTaskInfoRepository.AddRangeAsync(answers);
await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == inDto.GlobalTaskId, u => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading });
await _visitTaskRepository.UpdatePartialFromEFAutoAsync(inDto.GlobalTaskId, u => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading });
var result = await _readingGlobalTaskInfoRepository.SaveChangesAsync();
return ResponseOutput.Ok(result);
}

View File

@ -3271,7 +3271,7 @@ namespace IRaCIS.Core.Application.Service
await _readingTableQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId);
await _readingTaskQuestionMarkRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId);
await _readingCustomTagRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId);
await _visitTaskRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask()
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask()
{
ReadingTaskState = ReadingTaskState.WaitReading
});

View File

@ -346,7 +346,7 @@ namespace IRaCIS.Core.Application.Service
var relatedVisitTaskIds = JsonConvert.SerializeObject(relatedVisitTaskIdList);
// 这里先保存 签名的时候 会统一创建关系
await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == inDto.OncologyTaskId, u => new VisitTask()
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.Id == inDto.OncologyTaskId, u => new VisitTask()
{
RelatedVisitTaskIds = relatedVisitTaskIds
});

View File

@ -502,8 +502,8 @@ namespace IRaCIS.Core.Application.Service
#region 方式二
var subjectVisitQuery = _subjectVisitRepository.Where(t => t.TrialId == inQuery.TrialId).Where(t => t.IsLostVisit == false)
.Where(sv => sv.Subject.FinalSubjectVisitId == null ? true : sv.VisitNum < sv.Subject.LatestSubjectVisit.VisitNum).Select(sv => new ReadModuleView()
var subjectVisitQuery = _subjectVisitRepository.Where(t => t.TrialId == inQuery.TrialId)/*.Where(t => t.IsLostVisit == false)*/
.Where(sv => sv.Subject.FinalSubjectVisitId == null ? true : sv.VisitNum <= sv.Subject.LatestSubjectVisit.VisitNum).Select(sv => new ReadModuleView()
{
Id = sv.Id,
CreateTime = sv.CreateTime,
@ -888,7 +888,7 @@ namespace IRaCIS.Core.Application.Service
var resultlist = await visitQuery.WhereIf(finalVisitNum != 0, x => x.VisitNum <= finalVisitNum)
.WhereIf(inDto.ReadingSetType == ReadingSetType.TumorReading, x => readModulequery.Where(y => y.SubjectVisitId == x.Id && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId && y.ReadingSetType == ReadingSetType.ImageReading).Count() > 0)
.Where(x => x.VisitNum > maxReadVisitNum)
.Where(x => !x.IsBaseLine) // 排除基线
//.Where(x => !x.IsBaseLine) // 排除基线
.Where(x => readModulequery.Where(y => y.SubjectVisitId == x.Id && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId && y.ReadingSetType == inDto.ReadingSetType).Count() == 0).OrderBy(x => finalVisitNum)
.Select(x => new GetSubjectReadVisitsOutDto()
{

View File

@ -3502,18 +3502,24 @@ namespace IRaCIS.Core.Infra.EFCore.Common
{
isDistinctionInterface = false;
switch (_userInfo.RequestUrl)
{
//申请重阅
case "VisitTask/applyReReading":
extraIdentification = "/" + (int)entity.ReReadingApplyState;
//PM 申请重阅区分不了是否有SPM参与
if (entity.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed)
{
var hasSPM = _dbContext.VisitTaskReReading.Any(t => t.OriginalReReadingTaskId == entity.Id);
//var hasSPM = _dbContext.VisitTaskReReading.Any(t => t.OriginalReReadingTaskId == entity.Id);
var hasSPM = entitys.Where(x => x.Entity.GetType() == typeof(VisitTaskReReading))
.Select(t => t.Entity as VisitTaskReReading).Any(t => t.OriginalReReadingTaskId == entity.Id);
if (!hasSPM)
{
@ -3528,6 +3534,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common
//同意重阅
case "VisitTask/ConfirmReReading":
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM)
{
extraIdentification = "/" + 1;
@ -3549,26 +3556,34 @@ namespace IRaCIS.Core.Infra.EFCore.Common
break;
}
}
case "ReadingImageTask/SubmitVisitTaskQuestions":
//访视任务-- 非Dicom 阅片
if (_userInfo.RequestUrl == "ReadingImageTask/SubmitVisitTaskQuestions" && entity.ReadingTaskState != ReadingTaskState.HaveSigned && type == AuditOpt.Update)
if (entity.ReadingTaskState != ReadingTaskState.HaveSigned)
{
//提交访视任务的时候 会多次更新同一个记录 只记录最后一次
return;
}
break;
//Dicom 阅片 签名
if (_userInfo.RequestUrl == "ReadingImageTask/SubmitDicomVisitTask")
{
case "ReadingImageTask/SubmitDicomVisitTask":
//跳转阅片结果需要该参数
var subjectCode = _dbContext.Subject.Where(t => t.Id == entity.SubjectId).Select(t => t.Code).First();
obj.SubjectCode = subjectCode;
break;
case "ReadingImageTask/resetReadingTask":
//跳转阅片结果需要该参数
obj.IsReadingReset = true;
break;
}
#region 裁判、肿瘤学、全局 都是通用的
@ -3589,10 +3604,37 @@ namespace IRaCIS.Core.Infra.EFCore.Common
obj.SelectResult = r1.Id == entity.JudgeResultTaskId ? "R1" : "R2";
}
#endregion
//增加进入阅片中的稽查
//重置阅片也会从待阅片 变为阅片中,因为复制病灶依赖这个改变
if (obj.IsReadingReset != true)
{
if (entity.ReadingTaskState == ReadingTaskState.Reading)
{
if (_dbContext.VisitTask.Where(t => t.Id == entity.Id).Any(t => t.ReadingTaskState == ReadingTaskState.WaitReading))
{
isDistinctionInterface = false;
extraIdentification = "/ChangeToReading";
}
}
}
if (entity.IsReadClinicalData == true)
{
if (_dbContext.VisitTask.Where(t => t.Id == entity.Id).Any(t => t.IsReadClinicalData == false))
{
isDistinctionInterface = false;
extraIdentification = "/ReadClinicalData";
}
}
}
#region 通过链接跳转 2022 12-19

View File

@ -62,6 +62,8 @@ namespace IRaCIS.Core.Infra.EFCore.Common
public string CutOffVisitName { get; set; }
public string SelectResult { get; set; }
public bool? IsReadingReset { get;set; }
}
public class InspectionConvertDTO : DataInspection
{

View File

@ -35,15 +35,19 @@ namespace IRaCIS.Core.Infra.EFCore
Task<bool> UpdateAsync(TEntity entity, Expression<Func<TEntity, TEntity>> updateFactory,
bool autoSave = false, CancellationToken cancellationToken = default);
/// <summary> EF跟踪方式 会去数据库查询完整的实体,再更新部分字段 </summary>
/// <summary> EF跟踪方式 会去数据库查询完整的实体,再更新部分字段 一定会产生更新sql </summary>
Task<TEntity> UpdatePartialFromQueryAsync(Guid id, Expression<Func<TEntity, TEntity>> updateFactory,
bool autoSave = false, CancellationToken cancellationToken = default);
/// <summary> 稽查用这个 EF跟踪方式 先查询出来所有实体,再更新部分字段 </summary>
/// <summary> 稽查用这个 EF跟踪方式 先查询出来所有实体,再更新部分字段 一定会产生更新sql</summary>
Task UpdatePartialFromQueryAsync(Expression<Func<TEntity, bool>> updateFilter,
Expression<Func<TEntity, TEntity>> updateFactory,
bool autoSave = false, bool ignoreQueryFilter = false, CancellationToken cancellationToken = default);
/// <summary> EF跟踪方式 会去数据库查询完整的实体,再更新部分字段 根据是否修改了字段ef 自动判断是否生成sql</summary>
Task<TEntity> UpdatePartialFromEFAutoAsync(Guid id, Expression<Func<TEntity, TEntity>> updateFactory,
bool autoSave = false, CancellationToken cancellationToken = default);
#endregion

View File

@ -8,6 +8,7 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Query;
using Microsoft.Extensions.Localization;
using System.Reflection;
namespace IRaCIS.Core.Infra.EFCore
{
@ -167,6 +168,36 @@ namespace IRaCIS.Core.Infra.EFCore
return searchEntity;
}
public async Task<TEntity> UpdatePartialFromEFAutoAsync(Guid id, Expression<Func<TEntity, TEntity>> updateFactory,
bool autoSave = false, CancellationToken cancellationToken = default)
{
var searchEntity = await _dbSet.FindAsync(id);
if (searchEntity == null)
{
throw new BusinessValidationFailedException(I18n.T("Repository_UpdateError"));
}
var list = ((MemberInitExpression)updateFactory.Body).Bindings.Select(mb => mb.Member.Name)
.Select(propName => typeof(TEntity).GetProperty(propName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)).ToList();
Func<TEntity, TEntity> func = updateFactory.Compile();
TEntity applyObj = func(searchEntity);
foreach (PropertyInfo prop in list)
{
object value = prop.GetValue(applyObj);
prop.SetValue(searchEntity, value);
}
await SaveChangesAsync(autoSave);
return searchEntity;
}
public async Task UpdatePartialFromQueryAsync(Expression<Func<TEntity, bool>> updateFilter,
Expression<Func<TEntity, TEntity>> updateFactory,
bool autoSave = false, bool ignoreQueryFilter = false, CancellationToken cancellationToken = default)
@ -191,6 +222,7 @@ namespace IRaCIS.Core.Infra.EFCore
/// <summary>EF跟踪方式 删除</summary>
public async Task<bool> DeleteAsync(TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default)
{