using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; using System.Linq.Expressions; namespace IRaCIS.Core.Application.Service { public static class QCCommon { /// /// 验证CRC 是否已提交 已提交 就不允许进行任何操作,如果是IQC 那么还验证是否是当前任务领取人 /// /// /// /// /// /// public static async Task VerifyIsCRCSubmmitAsync(IRepository _repository, IUserInfo _userInfo, Guid? subjectVisitId = null) { if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator) { //添加的时候不验证 if (subjectVisitId != null) { if (await _repository.AnyAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.Submitted && (!t.QCChallengeList.Any(u => u.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload)))) { throw new BusinessValidationFailedException("CRC 已提交影像,不能进行操作。"); } } } //IQC 的时候 验证是不是当前领取人 if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC) { await VerifyIsCanQCAsync(_repository, _userInfo, null, subjectVisitId); } } public static async Task VerifyIsCanQCAsync(IRepository _repository, IUserInfo _userInfo, SubjectVisit? subjectVisit = null, Guid? subjectVisitId = null) { if (subjectVisitId != null) { subjectVisit = (await _repository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); } if (subjectVisit!.CurrentActionUserId != _userInfo.Id) { throw new BusinessValidationFailedException("您不是该质控任务当前领取人,没有操作权限!"); } } public static async Task VerifyStudyImageDataAsync(IRepository _repository, Guid subjectId, Guid subjectVisitId, DateTime imageDate) { var visitList = await _repository.Where(t => t.SubjectId == subjectId).Select(t => new { t.VisitNum, t.EarliestScanDate, t.LatestScanDate, t.Id }).ToListAsync(); var currentVisitNum = await _repository.Where(t => t.Id == subjectVisitId).Select(t => t.VisitNum).FirstOrDefaultAsync(); //小于当前访视 最近的最晚拍片 var before = visitList.Where(u => u.VisitNum < currentVisitNum).Max(k => k.LatestScanDate); if (before != null && before > imageDate) { throw new BusinessValidationFailedException($"当前访视检查时间{imageDate.ToString("yyyy-MM-dd")}不能早于前序访视检查时间{before?.ToString("yyyy-MM-dd")},请核对检查数据是否有误"); } //大于当前访视 最近的最早拍片日期 var after = visitList.Where(u => u.VisitNum > currentVisitNum).Min(k => k.EarliestScanDate); if (after != null && after < imageDate) { throw new BusinessValidationFailedException($"当前访视检查时间{imageDate.ToString("yyyy-MM-dd")}不能晚于该访视之后的检查时间{after?.ToString("yyyy-MM-dd")},请核对检查数据是否有误"); } } #region 处理方式多选过滤条件 public static Expression> GetSubjectVisitFilter(string[]? VisitPlanArray) { Expression> svExpression = x => true; bool isNeedVisitSearch = VisitPlanArray != null && VisitPlanArray?.Length > 0; if (isNeedVisitSearch) { var inPlanArray = VisitPlanArray!.Where(t => !t.Contains('.')).Select(t => decimal.Parse(t)).ToArray(); var isSelectOutPlan = VisitPlanArray!.Any(t => t.Contains('.')); if (inPlanArray.Length > 0) { svExpression = svExpression.And(t => inPlanArray.Contains(t.VisitNum)); if (isSelectOutPlan) { svExpression = svExpression.Or(t => t.InPlan == false); } } else if (isSelectOutPlan) { svExpression = t => t.InPlan == false; } } return svExpression; } public static Expression> GetQCChallengeFilter(string[]? VisitPlanArray) { Expression> svExpression = x => true; bool isNeedVisitSearch = VisitPlanArray != null && VisitPlanArray?.Length > 0; if (isNeedVisitSearch) { var inPlanArray = VisitPlanArray!.Where(t => !t.Contains('.')).Select(t => decimal.Parse(t)).ToArray(); var isSelectOutPlan = VisitPlanArray!.Any(t => t.Contains('.')); if (inPlanArray.Length > 0) { svExpression = svExpression.And(t => inPlanArray.Contains(t.SubjectVisit.VisitNum)); if (isSelectOutPlan) { svExpression = svExpression.Or(t => t.SubjectVisit.InPlan == false); } } else if (isSelectOutPlan) { svExpression = t => t.SubjectVisit.InPlan == false; } } return svExpression; } public static Expression> GetDicomStudySubjectVisitFilter(string[]? VisitPlanArray) { Expression> svExpression = x => true; bool isNeedVisitSearch = VisitPlanArray != null && VisitPlanArray?.Length > 0; if (isNeedVisitSearch) { var inPlanArray = VisitPlanArray!.Where(t => !t.Contains('.')).Select(t => decimal.Parse(t)).ToArray(); var isSelectOutPlan = VisitPlanArray!.Any(t => t.Contains('.')); if (inPlanArray.Length > 0) { svExpression = svExpression.And(t => inPlanArray.Contains(t.SubjectVisit.VisitNum)); if (isSelectOutPlan) { svExpression = svExpression.Or(t => t.SubjectVisit.InPlan == false); } } else if (isSelectOutPlan) { svExpression = t => t.SubjectVisit.InPlan == false; } } return svExpression; } public static Expression> GetNoneDicomStudySubjectVisitFilter(string[]? VisitPlanArray) { Expression> svExpression = x => true; bool isNeedVisitSearch = VisitPlanArray != null && VisitPlanArray?.Length > 0; if (isNeedVisitSearch) { var inPlanArray = VisitPlanArray!.Where(t => !t.Contains('.')).Select(t => decimal.Parse(t)).ToArray(); var isSelectOutPlan = VisitPlanArray!.Any(t => t.Contains('.')); if (inPlanArray.Length > 0) { svExpression = svExpression.And(t => inPlanArray.Contains(t.SubjectVisit.VisitNum)); if (isSelectOutPlan) { svExpression = svExpression.Or(t => t.SubjectVisit.InPlan == false); } } else if (isSelectOutPlan) { svExpression = t => t.SubjectVisit.InPlan == false; } } return svExpression; } public static Expression> GetStudyMonitorSubjectVisitFilter(string[]? VisitPlanArray) { Expression> svExpression = x => true; bool isNeedVisitSearch = VisitPlanArray != null && VisitPlanArray?.Length > 0; if (isNeedVisitSearch) { var inPlanArray = VisitPlanArray!.Where(t => !t.Contains('.')).Select(t => decimal.Parse(t)).ToArray(); var isSelectOutPlan = VisitPlanArray!.Any(t => t.Contains('.')); if (inPlanArray.Length > 0) { svExpression = svExpression.And(t => inPlanArray.Contains(t.SubjectVisit.VisitNum)); if (isSelectOutPlan) { svExpression = svExpression.Or(t => t.SubjectVisit.InPlan == false); } } else if (isSelectOutPlan) { svExpression = t => t.SubjectVisit.InPlan == false; } } return svExpression; } #endregion } }