修改一致性全量核查

Test_IRC_Net8
hang 2025-10-24 10:12:22 +08:00
parent ef673fc44b
commit 1532ac4a7e
5 changed files with 140 additions and 34 deletions

View File

@ -674,20 +674,6 @@
<param name="childCode"></param> <param name="childCode"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.EventStoreRecordService.GetEventStoreRecordList(IRaCIS.Core.Application.ViewModel.EventStoreRecordQuery)">
<summary>
邮件事件消息列表
</summary>
<param name="inQuery"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.EventStoreRecordService.RePublishEvent(System.Guid)">
<summary>
重新发布失败的事件消息
</summary>
<param name="eventId"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.GetTrialQCQuestionAnserList_Export(IRaCIS.Core.Application.Contracts.GetQCQuestionAnswerQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialQCQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.UserRole},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialQCQuestion},IRaCIS.Application.Interfaces.IDictionaryService)"> <member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.GetTrialQCQuestionAnserList_Export(IRaCIS.Core.Application.Contracts.GetQCQuestionAnswerQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialQCQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.UserRole},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialQCQuestion},IRaCIS.Application.Interfaces.IDictionaryService)">
<summary> <summary>
质控问题答案导出 质控问题答案导出
@ -995,6 +981,20 @@
<returns></returns> <returns></returns>
<exception cref="T:System.Exception"></exception> <exception cref="T:System.Exception"></exception>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.EventStoreRecordService.GetEventStoreRecordList(IRaCIS.Core.Application.ViewModel.EventStoreRecordQuery)">
<summary>
邮件事件消息列表
</summary>
<param name="inQuery"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.EventStoreRecordService.RePublishEvent(System.Guid)">
<summary>
重新发布失败的事件消息
</summary>
<param name="eventId"></param>
<returns></returns>
</member>
<member name="T:IRaCIS.Core.Application.Service.ExploreRecommendService"> <member name="T:IRaCIS.Core.Application.Service.ExploreRecommendService">
<summary> <summary>
ExploreRecommendService ExploreRecommendService
@ -18837,6 +18837,13 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.TrialStatService.GetTrialEfficacyEvaluationStatList(IRaCIS.Core.Application.ViewModel.EfficacyEvaluationQuery)">
<summary>
疗效统计表,只针对肿瘤标准 排除基线
</summary>
<param name="inQuery"></param>
<returns></returns>
</member>
<member name="T:IRaCIS.Core.Application.Triggers.ChallengeStateTrigger"> <member name="T:IRaCIS.Core.Application.Triggers.ChallengeStateTrigger">
<summary> <summary>
访视 质疑状态 触发修改 访视 质疑状态 触发修改

View File

@ -1,4 +1,5 @@
using MiniExcelLibs.Attributes; using IRaCIS.Core.Application.Helper;
using MiniExcelLibs.Attributes;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace IRaCIS.Core.Application.MassTransit.Command namespace IRaCIS.Core.Application.MassTransit.Command
@ -37,7 +38,8 @@ namespace IRaCIS.Core.Application.MassTransit.Command
public class FullCheckResult: CheckViewModel public class FullCheckResult: CheckViewModel
{ {
public string LatestScanDateStr { get; set; } = string.Empty;
public string Modalitys { get; set; } = string.Empty;
public DateTime CheckTime { get; set; } public DateTime CheckTime { get; set; }
public string CheckResult { get; set; } public string CheckResult { get; set; }
@ -81,6 +83,7 @@ namespace IRaCIS.Core.Application.MassTransit.Command
public string Modality { get; set; } = string.Empty; public string Modality { get; set; } = string.Empty;
#region 全量一致性核查加入 #region 全量一致性核查加入
[DictionaryTranslateAttribute("Subject_Visit_Status")]
public SubjectStatus SubjectStatus { get; set; } public SubjectStatus SubjectStatus { get; set; }

View File

@ -197,7 +197,7 @@ namespace IRaCIS.Core.Application.MassTransit.Consumer
var dbExceptExcel = dbVisitStudyList.Except(etcVisitStudyList); var dbExceptExcel = dbVisitStudyList.Except(etcVisitStudyList);
// excel 存在 // excel 存在
var excelExceptDB = etcVisitStudyList.Except(dbCheckList); var excelExceptDB = etcVisitStudyList.Except(dbVisitStudyList);
//ETC 和系统的完全一致 两者没有差别 //ETC 和系统的完全一致 两者没有差别
if (dbExceptExcel.Count() == 0 && excelExceptDB.Count() == 0) if (dbExceptExcel.Count() == 0 && excelExceptDB.Count() == 0)
@ -313,8 +313,7 @@ namespace IRaCIS.Core.Application.MassTransit.Consumer
var etcList = context.Message.ETCList; var etcList = context.Message.ETCList;
Expression<Func<SubjectVisit, bool>> subjectVisitLambda = x => x.TrialId == trialId /*&& x.Subject.IsSubjectQuit == false*/ && x.AuditState == AuditStateEnum.QCPassed && Expression<Func<SubjectVisit, bool>> subjectVisitLambda = x => x.TrialId == trialId /*&& x.Subject.IsSubjectQuit == false*/ && x.AuditState == AuditStateEnum.QCPassed;
(x.CheckState == CheckStateEnum.CVPassed);
var dicomQuery = from sv in _subjectVisitRepository.Where(subjectVisitLambda) var dicomQuery = from sv in _subjectVisitRepository.Where(subjectVisitLambda)
join subject in _subjectRepository.AsQueryable() on sv.SubjectId equals subject.Id join subject in _subjectRepository.AsQueryable() on sv.SubjectId equals subject.Id
@ -390,9 +389,9 @@ namespace IRaCIS.Core.Application.MassTransit.Consumer
var dbExceptExcel = dbVisitStudyList.Except(etcVisitStudyList); var dbExceptExcel = dbVisitStudyList.Except(etcVisitStudyList);
// excel 存在 // excel 存在
var excelExceptDB = etcVisitStudyList.Except(dbCheckList); var excelExceptDB = etcVisitStudyList.Except(dbVisitStudyList);
var dbCurrentVisitFirst = dbCheckList.First(); var dbCurrentVisitFirst = dbVisitStudyList.First();
//ETC 和系统的完全一致 两者没有差别 //ETC 和系统的完全一致 两者没有差别
if (dbExceptExcel.Count() == 0 && excelExceptDB.Count() == 0) if (dbExceptExcel.Count() == 0 && excelExceptDB.Count() == 0)
@ -407,8 +406,8 @@ namespace IRaCIS.Core.Application.MassTransit.Consumer
SiteCode = dbCurrentVisitFirst.SiteCode, SiteCode = dbCurrentVisitFirst.SiteCode,
SubjectCode = dbCurrentVisitFirst.SubjectCode, SubjectCode = dbCurrentVisitFirst.SubjectCode,
VisitName = dbCurrentVisitFirst.VisitName, VisitName = dbCurrentVisitFirst.VisitName,
Modality = string.Join('、', dbVisitStudyList.Select(t => t.Modality)), Modalitys = string.Join('、', dbVisitStudyList.Select(t => t.Modality)),
StudyDate = dbVisitStudyList.Select(t => t.StudyDate).MaxBy(d => DateTime.Parse(d)) ?? "" LatestScanDateStr = dbVisitStudyList.Select(t => t.StudyDate).MaxBy(d => DateTime.Parse(d)) ?? ""
}); });
} }
else else
@ -425,8 +424,8 @@ namespace IRaCIS.Core.Application.MassTransit.Consumer
SiteCode = dbCurrentVisitFirst.SiteCode, SiteCode = dbCurrentVisitFirst.SiteCode,
SubjectCode = dbCurrentVisitFirst.SubjectCode, SubjectCode = dbCurrentVisitFirst.SubjectCode,
VisitName = dbCurrentVisitFirst.VisitName, VisitName = dbCurrentVisitFirst.VisitName,
Modality = string.Join('、', dbVisitStudyList.Select(t => t.Modality)), Modalitys = string.Join('、', dbVisitStudyList.Select(t => t.Modality)),
StudyDate = dbVisitStudyList.Select(t => t.StudyDate).MaxBy(d => DateTime.Parse(d)) ?? "", LatestScanDateStr = dbVisitStudyList.Select(t => t.StudyDate).MaxBy(d => DateTime.Parse(d)) ?? "",
CheckResult = checkResult CheckResult = checkResult
}); });
} }

View File

@ -1,5 +1,8 @@
using System; using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Helper;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -76,8 +79,9 @@ namespace IRaCIS.Core.Application.ViewModel
public class EfficacyEvaluationQuery public class EfficacyEvaluationQuery
{ {
[NotDefault]
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
[NotDefault]
public Guid TrialReadingCriterionId { get; set; } public Guid TrialReadingCriterionId { get; set; }
} }
@ -87,4 +91,70 @@ namespace IRaCIS.Core.Application.ViewModel
public int SubjectCount { get; set; } public int SubjectCount { get; set; }
} }
public class EfficacyEvaluationExport
{
public Guid Id { get; set; }
public Guid SubjectId { get; set; }
public string SubjectCode { get; set; } = String.Empty;
public decimal VisitTaskNum { get; set; }
public string TaskName { get; set; }
public string TaskBlindName { get; set; }
public ReadingTaskState ReadingTaskState { get; set; }
public ReadingCategory ReadingCategory { get; set; }
public bool? IsBaseline { get; set; }
[DictionaryTranslateAttribute("ArmEnum")]
public Arm ArmEnum { get; set; }
//裁判结果选择的访视或者全局任务Id
public Arm? JudgeArmEnum { get; set; }
//裁判选择标记
//根据裁判的任务结果 设置访视任务的这个字段 该字段表示 裁判认同该任务的结果
[DictionaryTranslateAttribute("YesOrNoAudit")]
public bool? IsJudgeSelect { get; set; }
//在当前访视触发裁判,或者在截止日期小于等于当前访视的阅片期触发裁判
[DictionaryTranslateAttribute("YesOrNoAudit")]
public bool? IsTrigerJudge { get; set; }
//(如果是访视点裁判,则仅在所选阅片人对应访视 显示;如果是阅片期裁判,则在所选阅片人 阅片期内的所有访视 显示此原因)
public string JudgeNote { get; set; } = string.Empty;
public string VisitNote { get; set; }
public Guid? DoctorUserId { get; set; }
public string UserName { get; set; }
public List<CommonQuesionInfo> QuestionAnswerList { get; set; }
public List<decimal> SubjectCriterionReadingPeriodVisitNumList { get; set; }
public String TrialSiteCode { get; set; } = String.Empty;
}
} }

View File

@ -15,7 +15,7 @@ public class TrialStatService(
IRepository<TrialDocument> _trialDocumentRepository, IRepository<TrialDocument> _trialDocumentRepository,
IRepository<SystemDocument> _systemDocumentRepository, IRepository<SystemDocument> _systemDocumentRepository,
IRepository<SystemNotice> _systemNoticeRepository, IRepository<SystemNotice> _systemNoticeRepository,
IRepository<SubjectVisitImageBackRecord> _subjectVisitImageBackRecordReposiotry, IRepository<VisitTask> _visitTaskRepository,
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService
{ {
@ -33,7 +33,8 @@ public class TrialStatService(
QCFinishedCount = t.SubjectVisitList.Where(t => t.AuditState == AuditStateEnum.QCPassed || t.AuditState == AuditStateEnum.QCFailed).Count(), QCFinishedCount = t.SubjectVisitList.Where(t => t.AuditState == AuditStateEnum.QCPassed || t.AuditState == AuditStateEnum.QCFailed).Count(),
CheckFinishedCount = t.SubjectVisitList.Where(t => t.CheckState == CheckStateEnum.CVPassed).Count(), CheckFinishedCount = t.SubjectVisitList.Where(t => t.CheckState == CheckStateEnum.CVPassed).Count(),
CriterionList = t.TrialReadingCriterionList.Select(t => new VisitReadingCriterionInfo() CriterionList = t.TrialReadingCriterionList.Where(t => inQuery.TrialReadingCriterionId != null ? t.Id == inQuery.TrialReadingCriterionId : true)
.Select(t => new VisitReadingCriterionInfo()
{ {
TrialReadingCriterionId = t.Id, TrialReadingCriterionId = t.Id,
TrialReadingCriterionName = t.CriterionName, TrialReadingCriterionName = t.CriterionName,
@ -84,10 +85,36 @@ public class TrialStatService(
return list; return list;
} }
/////疗效统计表,只针对肿瘤标准 排除基线
/////
//public async Task<List<EfficacyEvaluationStatViewModel>> GetTrialEfficacyEvaluationStatList(EfficacyEvaluationQuery inQuery)
//{
//} /// <summary>
/// 疗效统计表,只针对肿瘤标准 排除基线
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
public async Task<List<EfficacyEvaluationStatViewModel>> GetTrialEfficacyEvaluationStatList(EfficacyEvaluationQuery inQuery)
{
var query = _visitTaskRepository
.Where(t => t.TrialId == inQuery.TrialId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.IsAnalysisCreate == false && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze))
//访视和全局查询已签名完成的,裁判可以是未签名,未完成的
.Where(t => (t.ReadingTaskState == ReadingTaskState.HaveSigned && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global)) || t.ReadingCategory == ReadingCategory.Judge)
.Select(t => new EfficacyEvaluationExport()
{
Id = t.Id,
SubjectId = t.SubjectId,
SubjectCode = t.Subject.Code,
VisitTaskNum = t.VisitTaskNum,
TaskName = t.TaskName,
TaskBlindName = t.TaskBlindName,
ReadingTaskState = t.ReadingTaskState,
ReadingCategory = t.ReadingCategory,
});
return new List<EfficacyEvaluationStatViewModel> { };
}
} }