Merge branch 'Test.Study' into Uat.Study

Uat_Study
hang 2023-09-15 15:22:47 +08:00
commit ca9be92525
20 changed files with 269 additions and 42 deletions

View File

@ -21,7 +21,7 @@
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Test_Study"
},
"applicationUrl": "http://localhost:6100"
"applicationUrl": "http://localhost:6000"
}
}
}

View File

@ -10558,6 +10558,20 @@
<member name="M:IRaCIS.Core.Application.Image.QA.QCOperationService.ReplaceQCTaskActionUser(System.Guid,System.Guid)">
<summary>替换当前领取人 </summary>
</member>
<member name="M:IRaCIS.Core.Application.Image.QA.QCOperationService.CollectNextIQCQuality(IRaCIS.Core.Application.Contracts.GetNextIQCQualityInDto)">
<summary>
领取下一个质控任务
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Image.QA.QCOperationService.GetNextIQCQuality(IRaCIS.Core.Application.Contracts.GetNextIQCQualityInDto)">
<summary>
获取下一个质控任务
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Image.QA.QCOperationService.ObtainOrCancelQCTask(System.Guid,System.Guid,System.Boolean)">
<summary>
手动领取 或者取消 QC任务

View File

@ -60,6 +60,21 @@ namespace IRaCIS.Core.Application.Contracts
public Guid? HandleUserId { get; set; }
}
public class GetNextIQCQualityInDto
{
[NotDefault]
public Guid TrialId { get; set; }
public Guid SubjectId { get; set; }
}
public class GetNextIQCQualityOutDto
{
public Guid? SubjectId { get; set; }
public Guid? VisitId { get; set; }
}
public class CRCRequestToQCCommand
{
@ -105,6 +120,8 @@ namespace IRaCIS.Core.Application.Contracts
public bool IsEnrollementQualificationConfirm { get; set; }
public bool IsPDProgressView { get; set; }
public string VisitBaseDataDes { get; set; }
public string OutEnrollmentVisitName { get; set; } = String.Empty;

View File

@ -878,6 +878,109 @@ namespace IRaCIS.Core.Application.Image.QA
return ResponseOutput.Result(success);
}
/// <summary>
/// 领取下一个质控任务
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<GetNextIQCQualityOutDto> CollectNextIQCQuality(GetNextIQCQualityInDto inDto)
{
var nextIQCQuality = await this.GetNextIQCQuality(inDto);
if (nextIQCQuality.VisitId != null)
{
var visit = await _subjectVisitRepository.Where(x => x.Id == nextIQCQuality.VisitId).FirstOrDefaultAsync();
if (!visit.IsTake)
{
await ObtainOrCancelQCTask(inDto.TrialId, nextIQCQuality.VisitId.Value, true);
}
}
return nextIQCQuality;
}
/// <summary>
/// 获取下一个质控任务
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<GetNextIQCQualityOutDto> GetNextIQCQuality(GetNextIQCQualityInDto inDto)
{
var trialConfig = await _trialRepository
.Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification })
.FirstOrDefaultAsync(t => t.TrialId == inDto.TrialId)
.IfNullThrowException();
SubjectVisit? subjectVisit = null;
List<SubjectVisit>? visitList = null;
switch (trialConfig.QCProcessEnum)
{
case TrialQCProcess.NotAudit:
return new GetNextIQCQualityOutDto() { };
break;
case TrialQCProcess.SingleAudit:
visitList = await _subjectVisitRepository.Where(x => x.SubmitState != SubmitStateEnum.None && x.TrialId == inDto.TrialId && (x.CurrentActionUserId == _userInfo.Id || (x.AuditState != AuditStateEnum.PrimaryQCPassed && !x.IsTake))).Include(x => x.Subject).ToListAsync();
subjectVisit = visitList.Where(x => x.SubjectId == inDto.SubjectId).OrderBy(x => x.VisitNum).FirstOrDefault();
if (subjectVisit != null)
{
return new GetNextIQCQualityOutDto()
{
SubjectId = subjectVisit.SubjectId,
VisitId = subjectVisit.Id
};
}
subjectVisit = visitList.OrderBy(x => x.Subject.Code).ThenBy(x => x.VisitNum).FirstOrDefault();
if (subjectVisit != null)
{
return new GetNextIQCQualityOutDto()
{
SubjectId = subjectVisit.SubjectId,
VisitId = subjectVisit.Id
};
}
else
{
return new GetNextIQCQualityOutDto() { };
}
break;
case TrialQCProcess.DoubleAudit:
visitList = await _subjectVisitRepository.Where(x => x.SubmitState != SubmitStateEnum.None && x.TrialId == inDto.TrialId && x.PreliminaryAuditUserId != _userInfo.Id && (x.CurrentActionUserId == _userInfo.Id || (x.AuditState != AuditStateEnum.QCPassed))).Include(x => x.Subject).ToListAsync();
if (subjectVisit != null)
{
return new GetNextIQCQualityOutDto()
{
SubjectId = subjectVisit.SubjectId,
VisitId = subjectVisit.Id
};
}
subjectVisit = visitList.OrderBy(x => x.Subject.Code).ThenBy(x => x.VisitNum).FirstOrDefault();
if (subjectVisit != null)
{
return new GetNextIQCQualityOutDto()
{
SubjectId = subjectVisit.SubjectId,
VisitId = subjectVisit.Id
};
}
else
{
return new GetNextIQCQualityOutDto() { };
}
break;
default:
return new GetNextIQCQualityOutDto() { };
}
}
/// <summary>
/// 手动领取 或者取消 QC任务

View File

@ -499,6 +499,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public Guid VisitTaskId { get; set; }
public Guid TrialId { get; set; }
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
}
public class ReadingTableAnswerRowInfoBase
@ -719,6 +724,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
{
[NotDefault]
public Guid VisitTaskId { get; set; }
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
}
public class GetReadingTableQuestionOutDto
@ -795,6 +805,10 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public List<OrganInfo> OrganInfos { get; set; } = new List<OrganInfo>();
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
public bool IsGetallQuestion { get; set; } = false;
/// <summary>
@ -947,6 +961,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public Guid TrialId { get; set; }
public Guid VisitTaskId { get; set; }
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
}
#endregion

View File

@ -336,10 +336,15 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public ValueOfType? ValueType { get; set; }
/// <summary>
/// 单位
/// </summary>
public ValueUnit? Unit { get; set; }
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
/// <summary>
/// 单位
/// </summary>
public ValueUnit? Unit { get; set; }
/// <summary>
/// 限制编辑
@ -439,10 +444,15 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public ValueOfType? ValueType { get; set; }
/// <summary>
/// 数据来源
/// </summary>
public DataSources? DataSource { get; set; } = DataSources.ManualEntry;
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
/// <summary>
/// 数据来源
/// </summary>
public DataSources? DataSource { get; set; } = DataSources.ManualEntry;
/// <summary>
/// 单位
@ -974,10 +984,15 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public ValueOfType? ValueType { get; set; }
/// <summary>
/// 单位
/// </summary>
public ValueUnit? Unit { get; set; }
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
/// <summary>
/// 单位
/// </summary>
public ValueUnit? Unit { get; set; }
/// <summary>
@ -1038,10 +1053,15 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public ValueOfType? ValueType { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 数据来源
@ -1555,10 +1575,15 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public ValueOfType? ValueType { get; set; }
/// <summary>
/// 限制编辑
/// </summary>
public LimitEdit LimitEdit { get; set; } = LimitEdit.None;
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
/// <summary>
/// 限制编辑
/// </summary>
public LimitEdit LimitEdit { get; set; } = LimitEdit.None;
/// <summary>
/// 最大答案长度
@ -1901,10 +1926,15 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// </summary>
public ValueOfType? ValueType { get; set; }
/// <summary>
/// 数据来源
/// </summary>
public DataSources? DataSource { get; set; } = DataSources.ManualEntry;
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
/// <summary>
/// 数据来源
/// </summary>
public DataSources? DataSource { get; set; } = DataSources.ManualEntry;
/// <summary>
/// 单位

View File

@ -6,6 +6,7 @@
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Domain.Share;
namespace IRaCIS.Core.Application.Contracts
{
@ -22,7 +23,7 @@ namespace IRaCIS.Core.Application.Contracts
Task<GetGlobalReadingInfoOutDto> GetGlobalReadingInfo(GetGlobalReadingInfoInDto inDto);
Task<List<DicomReadingQuestionAnswer>> GetReadingQuestion(Guid trialReadingCriterionId, Guid? visitTaskId);
Task<List<DicomReadingQuestionAnswer>> GetReadingQuestion(Guid trialReadingCriterionId, Guid? visitTaskId,QuestionClassify? questionClassify);
Task<GetReadingTableQuestionOutDto> GetReadingTableQuestion(GetReadingTableQuestionOrAnswerInDto inDto);

View File

@ -704,7 +704,7 @@ namespace IRaCIS.Application.Services
{
//await AddDefaultValueToTask(inDto.VisitTaskId);
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
var result = await GetReadingQuestion(taskInfo.TrialReadingCriterionId, taskInfo.Id);
var result = await GetReadingQuestion(taskInfo.TrialReadingCriterionId, taskInfo.Id, inDto.QuestionClassify);
return (result, new
{
@ -720,7 +720,7 @@ namespace IRaCIS.Application.Services
/// <param name="visitTaskId"></param>
/// <returns></returns>
[NonDynamicMethod]
public async Task<List<DicomReadingQuestionAnswer>> GetReadingQuestion(Guid trialReadingCriterionId, Guid? visitTaskId)
public async Task<List<DicomReadingQuestionAnswer>> GetReadingQuestion(Guid trialReadingCriterionId, Guid? visitTaskId, QuestionClassify? questionClassify)
{
@ -729,6 +729,7 @@ namespace IRaCIS.Application.Services
//排除表格问题
var questions = await _readingQuestionTrialRepository
.WhereIf(questionClassify!=null,x=>x.QuestionClassify== questionClassify)
.WhereIf(criterionIdInfo.IseCRFShowInDicomReading, x => x.ReadingQuestionCriterionTrialId == trialReadingCriterionId && x.Type != ReadingQestionType.Table)
.WhereIf(!criterionIdInfo.IseCRFShowInDicomReading, x => x.IsShowInDicom && x.ReadingQuestionCriterionTrialId == trialReadingCriterionId && x.Type != ReadingQestionType.Table)
@ -893,6 +894,7 @@ namespace IRaCIS.Application.Services
TableAnswers = tableAnswers,
TableAnsweRowInfos = tableAnsweRowInfos,
OrganInfos = organList,
QuestionClassify=inDto.QuestionClassify,
}
@ -943,7 +945,8 @@ namespace IRaCIS.Application.Services
TableAnswers = tableAnswers,
TableAnsweRowInfos = tableAnsweRowInfos,
IsGetallQuestion = true,
OrganInfos = organList
OrganInfos = organList,
QuestionClassify=inDto.QuestionClassify,
}
), new
@ -964,7 +967,9 @@ namespace IRaCIS.Application.Services
{
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync();
var qusetionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId).ProjectTo<TrialReadQuestionData>(_mapper.ConfigurationProvider, new
var qusetionList = await _readingQuestionTrialRepository
.WhereIf(inDto.QuestionClassify!=null,x=>x.QuestionClassify==inDto.QuestionClassify)
.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId).ProjectTo<TrialReadQuestionData>(_mapper.ConfigurationProvider, new
{
isEn_Us = _userInfo.IsEn_Us
@ -1040,7 +1045,9 @@ namespace IRaCIS.Application.Services
var groupList = new List<TrialReadQuestionData>();
var qusetionIds = qusetionList.Select(x => x.Id).ToList();
var tableQuestionList = await _readingTableQuestionTrialRepository.Where(x => qusetionIds.Contains(x.ReadingQuestionId))
var tableQuestionList = await _readingTableQuestionTrialRepository
.WhereIf(inDto.QuestionClassify != null, x => x.QuestionClassify == inDto.QuestionClassify)
.Where(x => qusetionIds.Contains(x.ReadingQuestionId))
.ProjectTo<TableQuestionTrial>(_mapper.ConfigurationProvider, new
{

View File

@ -1615,7 +1615,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
x.SourceSubjectVisit.IsBaseLine && x.TaskState == TaskState.Effect &&
x.IsAnalysisCreate == inDto.IsAnalysisCreate
&&x.DoctorUserId==inDto.DoctorUserId
//&&x.DoctorUserId==inDto.DoctorUserId
&& x.IsSelfAnalysis == inDto.IsSelfAnalysis && x.ArmEnum == inDto.ArmEnum)
.Select(x => x.Id).FirstOrDefaultAsync();
@ -1715,7 +1715,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
var lastTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
x.IsAnalysisCreate == taskinfo.IsAnalysisCreate &&
x.DoctorUserId == taskinfo.DoctorUserId &&
//x.DoctorUserId == taskinfo.DoctorUserId &&
x.IsSelfAnalysis == taskinfo.IsSelfAnalysis &&
x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ArmEnum == taskinfo.ArmEnum
&& x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect
@ -1745,7 +1745,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
var firstChangeVisitTaskNum = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
x.IsAnalysisCreate == taskinfo.IsAnalysisCreate &&
x.DoctorUserId == taskinfo.DoctorUserId &&
//x.DoctorUserId == taskinfo.DoctorUserId &&
x.IsSelfAnalysis == taskinfo.IsSelfAnalysis &&
x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ArmEnum == taskinfo.ArmEnum
&& x.BeforeConvertedTaskId != null && x.TaskState == TaskState.Effect
@ -1755,7 +1755,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
compareTaskList = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
x.IsAnalysisCreate == taskinfo.IsAnalysisCreate &&
x.DoctorUserId == taskinfo.DoctorUserId &&
//x.DoctorUserId == taskinfo.DoctorUserId &&
x.IsSelfAnalysis == taskinfo.IsSelfAnalysis &&
x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ArmEnum == taskinfo.ArmEnum &&
x.VisitTaskNum >= firstChangeVisitTaskNum && x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect

View File

@ -976,7 +976,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
siteVisitForTumorList = await _visitTaskRepository.Where(x => (x.ReadingCategory == ReadingCategory.Visit &&
x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
x.DoctorUserId== taskinfo.DoctorUserId&&
//x.DoctorUserId== taskinfo.DoctorUserId&&
x.IsAnalysisCreate==inDto.IsAnalysisCreate&&
x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.VisitTaskNum <= taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect && x.ArmEnum == taskinfo.ArmEnum
)||x.Id== inDto.VisitTaskId).OrderByDescending(x => x.VisitTaskNum).Select(x => new SiteVisitForTumor()

View File

@ -1285,7 +1285,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
x.SourceSubjectVisit.IsBaseLine && x.TaskState == TaskState.Effect &&
x.IsAnalysisCreate == inDto.IsAnalysisCreate
&&x.DoctorUserId==inDto.DoctorUserId
//&&x.DoctorUserId==inDto.DoctorUserId
&& x.IsSelfAnalysis == inDto.IsSelfAnalysis && x.ArmEnum == inDto.ArmEnum)
.Select(x => x.Id).FirstOrDefaultAsync();

View File

@ -1280,7 +1280,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
x.SourceSubjectVisit.IsBaseLine && x.TaskState == TaskState.Effect &&
x.IsAnalysisCreate == inDto.IsAnalysisCreate
&&x.DoctorUserId==inDto.DoctorUserId
//&&x.DoctorUserId==inDto.DoctorUserId
&& x.IsSelfAnalysis == inDto.IsSelfAnalysis && x.ArmEnum == inDto.ArmEnum)
.Select(x => x.Id).FirstOrDefaultAsync();

View File

@ -67,6 +67,8 @@ namespace IRaCIS.Core.Application.Contracts
public string Modalitys { get; set; } = string.Empty;
public string VisitBaseDataDes { get; set; }
public List<string> ModalityList { get; set; } = new List<string>();

View File

@ -77,6 +77,8 @@ namespace IRaCIS.Application.Contracts
public bool IsPDProgressView { get; set; }
public string VisitBaseDataDes { get; set; }
public bool IsSubjectSecondCodeView { get; set; } = false;
}

View File

@ -297,6 +297,18 @@ namespace IRaCIS.Core.Domain.Share
Automatic = 1
}
/// <summary>
/// 问题分类
/// </summary>
public enum QuestionClassify
{
/// <summary>
/// PET
/// </summary>
PET = 0,
}
/// <summary>
/// 自定义计算标记

View File

@ -202,6 +202,10 @@ namespace IRaCIS.Core.Domain.Models
/// </summary>
public string? FileType { get; set; }
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
[JsonIgnore]
[ForeignKey("GroupId")]

View File

@ -261,7 +261,12 @@ namespace IRaCIS.Core.Domain.Models
/// </summary>
public Guid? GroupId { get; set; }
[JsonIgnore]
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
[JsonIgnore]
[ForeignKey("GroupId")]
public ReadingQuestionTrial GroupInfo { get; set; }

View File

@ -173,7 +173,12 @@ namespace IRaCIS.Core.Domain.Models
/// </summary>
public string? FileType { get; set; }
[ForeignKey("DependParentId")]
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
[ForeignKey("DependParentId")]
[JsonIgnore]
public ReadingTableQuestionSystem DependParentQuestion { get; set; }

View File

@ -195,7 +195,12 @@ namespace IRaCIS.Core.Domain.Models
/// </summary>
public string? FileType { get; set; }
[JsonIgnore]
/// <summary>
/// 问题分类
/// </summary>
public QuestionClassify? QuestionClassify { get; set; }
[JsonIgnore]
[ForeignKey("DependParentId")]
public ReadingTableQuestionTrial DependParentQuestion { get; set; }

View File

@ -299,7 +299,8 @@ namespace IRaCIS.Core.Domain.Models
public int PlanVisitCount { get; set; }
public string VisitBaseDataDes { get; set; } = StaticData.International("Trial_VisitBaseDataDes");
public DateTime? TrialFinishedTime { get; set; }