From d59dbc83694ff02a129f3b9fe3ca94e9017e4df0 Mon Sep 17 00:00:00 2001 From: he <10978375@qq.com> Date: Thu, 22 Dec 2022 16:47:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.csproj | 1 + IRaCIS.Core.Application/Resources/en-US.json | 42 +++++++++++++++++- IRaCIS.Core.Application/Resources/zh-CN.json | 41 ++++++++++++++++- .../ReadingMedicalReviewService.cs | 18 ++++---- .../ReadingGlobalTaskService.cs | 4 +- .../ReadingImageTaskService.cs | 36 +++++++-------- .../ReadingJudgeTaskService.cs | 6 +-- .../ReadingOncologyTaskService.cs | 4 +- .../ReadingCalculate/PCWG3CalculateService.cs | 8 ++-- .../RECIST1Point1CalculateService.cs | 6 +-- .../ReadingCalculateService.cs | 2 +- IRaCIS.Core.Application/TestService.cs | 11 +++-- 后端提示语.xlsx | Bin 0 -> 15859 bytes 13 files changed, 131 insertions(+), 48 deletions(-) create mode 100644 后端提示语.xlsx diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.csproj b/IRaCIS.Core.Application/IRaCIS.Core.Application.csproj index 449c86dea..60d33f8c2 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.csproj +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.csproj @@ -44,6 +44,7 @@ + diff --git a/IRaCIS.Core.Application/Resources/en-US.json b/IRaCIS.Core.Application/Resources/en-US.json index 49cb16383..7cb4b8ef1 100644 --- a/IRaCIS.Core.Application/Resources/en-US.json +++ b/IRaCIS.Core.Application/Resources/en-US.json @@ -186,9 +186,49 @@ "TimeTooLow": "当前访视检查时间不能小于该访视之前检查的时间,请核对检查数据是否有误", "SomeoneLoading": "当前有人正在上传归档该检查!", "VisitEnd": "受试者访视结束,不允许上传!", - "DICOMUploaded{0}{1}{2}{3}": "{0}: This DICOM images have been uploaded and allocate to the {1} of the subject {2} (Study ID: {3}), which cannot continue to upload and assign it to others." + "DICOMUploaded{0}{1}{2}{3}": "{0}: This DICOM images have been uploaded and allocate to the {1} of the subject {2} (Study ID: {3}), which cannot continue to upload and assign it to others.", //StudyService //SystemAnonymizationService + + //ReadingGlobalTaskService + "ReadingGlobal_NotGlobal": "The current task is not a global reading task", + //ReadingImageTaskService + "ReadingImage_NotVisit": "The current task is not a visit task", + "ReadingImage_CantSplit": "This is currently a baseline task and cannot be split and combined", + "ReadingImage_BeSigned": "The current task has been signed!", + "ReadingImage_Beinvalid": "The current task is invalid!", + "ReadingImage_NotaTask": "The combined lesions were not the same visiting task", + "ReadingImage_DeleteError": "The current lesion splits into other lesions or other lesions merge into the current lesion, and deletion fails", + "ReadingImage_Idnotcorrespond": "InstanceId and SeriesId do not correspond !", + "ReadingImage_Twice": "The same question is passed in twice", + "ReadingImage_MaxQuestion": "The maximum number of problems currently submitted is {0}!", + "ReadingImage_Maxlesion": "According to the relevant rules of RECIST1.1, the number of target lesions in the same organ does not exceed {0}!", + "ReadingImage_Maximum": "Problems {0} The maximum number of the same problems is {1}, and {2} already exist", + "ReadingImage_RequiredQuestion": "The answer to the required question {0} is empty or not saved", + "ReadingImage_ClinicalRead": "Clinical data not read!", + "ReadingImage_IDMust": "When there is no task Id, the standard Id must be passed", + "ReadingImage_TaskFinish": "The current subject has completed all the task of reading the film!", + "ReadingImage_NeedRest": "You have read the video continuously for 2 hours. Please take a 20-minute rest before reading the video again.", + //ReadingJudgeTaskService + "ReadingJudge_SouceIdNull": "The SouceId of the current referee global task is null", + //ReadingOncologyTaskService + "ReadingOncology_TaskError": "The current task is not an oncology task", + "ReadingOncology_Abnormal": "Abnormal, the referee result is null", + //ReadingCalculate + "ReadingCalculate_Abnormal": "The PCWG3 standard configuration is abnormal!", + "ReadingCalculate_NoMarker": "Lesion {0} no marker exists,", + "ReadingCalculate_StatusIsEmpty": "Lesion {0} status is empty,", + "ReadingCalculate_NoMarkerEmpty": "Lesion {0} is unmarked and the status is empty,", + "ReadingCalculate_NoDeveloped": "The current standard calculation is not well developed!", + //ReadingMedicalReviewService + "MedicalReview_invalid": "The medical audit was invalid and the operation failed", + "MedicalReview_SaveQuestion": "Please save the medical review question first", + "MedicalReview_NeedSave": "Save the question and conclusion first", + "MedicalReview_NotClosed": "Dialogue not closed" + + + + } diff --git a/IRaCIS.Core.Application/Resources/zh-CN.json b/IRaCIS.Core.Application/Resources/zh-CN.json index 99bb84096..c7c80ba5a 100644 --- a/IRaCIS.Core.Application/Resources/zh-CN.json +++ b/IRaCIS.Core.Application/Resources/zh-CN.json @@ -188,9 +188,48 @@ "TimeTooLow": "当前访视检查时间不能小于该访视之前检查的时间,请核对检查数据是否有误", "SomeoneLoading": "当前有人正在上传归档该检查!", "VisitEnd": "受试者访视结束,不允许上传!", - "DICOMUploaded{0}{1}{2}{3}": "{0}:此DICOM图片已上传并分配给课题{2}(研究ID:{3})的{1},课题{2}无法继续上传并分配给他人。" + "DICOMUploaded{0}{1}{2}{3}": "{0}:此DICOM图片已上传并分配给课题{2}(研究ID:{3})的{1},课题{2}无法继续上传并分配给他人。", //StudyService //SystemAnonymizationService + + //ReadingGlobalTaskService + "ReadingGlobal_NotGlobal": "当前任务不是全局阅片任务", + //ReadingImageTaskService + "ReadingImage_NotVisit": "当前任务不是访视任务", + "ReadingImage_CantSplit": "当前是基线任务,无法拆分和合并病灶", + "ReadingImage_BeSigned": "当前任务已经签名!", + "ReadingImage_Beinvalid": "当前任务已失效!", + "ReadingImage_NotaTask": "合并的病灶并非同一个访视任务", + "ReadingImage_DeleteError": "当前病灶分裂出其他病灶或者其他病灶合并到了当前病灶,删除失败", + "ReadingImage_Idnotcorrespond": "InstanceId和SeriesId不对应!", + "ReadingImage_Twice": "相同问题传入两次", + "ReadingImage_MaxQuestion": "当前提交问题最大问题数为{0}个!", + "ReadingImage_Maxlesion": "按照RECIST1.1的相关规则,同一器官的靶病灶数量不超过{0}个,请确认", + "ReadingImage_Maximum": "问题{0}最大相同问题数为{1},当前已存在{2}条", + "ReadingImage_RequiredQuestion": "必填问题{0}的答案为空或未保存", + "ReadingImage_ClinicalRead": "临床数据未阅读!", + "ReadingImage_IDMust": "当没有任务Id的时候,标准Id必传", + "ReadingImage_TaskFinish": "当前受试者此次阅片任务已全部完成!", + "ReadingImage_NeedRest": "您已连续阅片2个小时,请休息20分钟后,再继续阅片。", + //ReadingJudgeTaskService + "ReadingJudge_SouceIdNull": "当前裁判的全局任务的SouceId为null", + //ReadingOncologyTaskService + "ReadingOncology_TaskError": "当前任务不是肿瘤学任务", + "ReadingOncology_Abnormal": "异常,裁判结果为null", + //ReadingCalculate + "ReadingCalculate_Abnormal": "PCWG3标准配置异常!", + "ReadingCalculate_NoMarker": "病灶{0}不存在标记,", + "ReadingCalculate_StatusIsEmpty": "病灶{0}状态为空,", + "ReadingCalculate_NoMarkerEmpty": "病灶{0}未做标记,且状态为空,", + "ReadingCalculate_NoDeveloped": "当前标准计算未开发好!", + //ReadingMedicalReviewService + "MedicalReview_invalid": "该医学审核无效,操作失败", + "MedicalReview_SaveQuestion": "请先保存医学审核问题", + "MedicalReview_NeedSave": "请先保存问题和结论", + "MedicalReview_NotClosed": "对话未关闭" + + } + diff --git a/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs b/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs index f80fb4db8..fcaa42908 100644 --- a/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs +++ b/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs @@ -425,7 +425,7 @@ namespace IRaCIS.Core.Application.Service var medicalReviewInfo = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (medicalReviewInfo.IsInvalid) { - throw new BusinessValidationFailedException("该医学审核无效,操作失败"); + throw new BusinessValidationFailedException(_localizer["MedicalReview_invalid"]); } await _readingMedicineQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.TaskMedicalReviewId == inDto.TaskMedicalReviewId); @@ -468,11 +468,11 @@ namespace IRaCIS.Core.Application.Service var medicalReviewInfo = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (medicalReviewInfo.IsInvalid) { - throw new BusinessValidationFailedException("该医学审核无效,操作失败"); + throw new BusinessValidationFailedException(_localizer["MedicalReview_invalid"]); } if ((await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).Select(x => x.SaveQuestionTime).FirstOrDefaultAsync()) == null) { - return ResponseOutput.NotOk("请先保存医学审核问题"); + return ResponseOutput.NotOk(_localizer["MedicalReview_SaveQuestion"]); } await _taskMedicalReviewRepository.UpdatePartialFromQueryAsync(inDto.TaskMedicalReviewId, x => new TaskMedicalReview() { @@ -547,7 +547,7 @@ namespace IRaCIS.Core.Application.Service var medicalReviewInfo = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (medicalReviewInfo.IsInvalid) { - throw new BusinessValidationFailedException("该医学审核无效,操作失败"); + throw new BusinessValidationFailedException(_localizer["MedicalReview_invalid"]); } var visitTaskId = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).Select(x => x.VisitTaskId).FirstOrDefaultAsync(); @@ -580,7 +580,7 @@ namespace IRaCIS.Core.Application.Service var medicalReviewInfo = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (medicalReviewInfo.IsInvalid) { - throw new BusinessValidationFailedException("该医学审核无效,操作失败"); + throw new BusinessValidationFailedException(_localizer["MedicalReview_invalid"]); } var visitTaskId = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).Select(x => x.VisitTaskId).FirstOrDefaultAsync(); if (inDto.IsApplyHeavyReading??false) @@ -663,7 +663,7 @@ namespace IRaCIS.Core.Application.Service var medicalReviewInfo = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (medicalReviewInfo.IsInvalid) { - throw new BusinessValidationFailedException("该医学审核无效,操作失败"); + throw new BusinessValidationFailedException(_localizer["MedicalReview_invalid"]); } var taskmedicalReview = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).Select(x => new @@ -677,13 +677,13 @@ namespace IRaCIS.Core.Application.Service if (taskmedicalReview.SaveQuestionTime == null || taskmedicalReview.SaveConclusionTime==null) { - throw new BusinessValidationFailedException("请先保存问题和结论"); + throw new BusinessValidationFailedException(_localizer["MedicalReview_NeedSave"]); } if (taskmedicalReview.IsHaveQuestion&&!taskmedicalReview.IsClosedDialog) { - throw new BusinessValidationFailedException("对话未关闭"); + throw new BusinessValidationFailedException(_localizer["MedicalReview_NotClosed"]); } @@ -708,7 +708,7 @@ namespace IRaCIS.Core.Application.Service var medicalReviewInfo = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (medicalReviewInfo.IsInvalid) { - throw new BusinessValidationFailedException("该医学审核无效,操作失败"); + throw new BusinessValidationFailedException(_localizer["MedicalReview_invalid"]); } await _taskMedicalReviewRepository.UpdatePartialFromQueryAsync(inDto.TaskMedicalReviewId, x => new TaskMedicalReview() diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs index caef56f17..5d4ec511e 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs @@ -87,7 +87,7 @@ namespace IRaCIS.Application.Services var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); if (taskInfo.ReadingCategory != ReadingCategory.Global) { - throw new BusinessValidationFailedException("当前任务不是全局阅片任务"); + throw new BusinessValidationFailedException(_localizer["ReadingGlobal_NotGlobal"]); } GetGlobalReadingInfoOutDto result = new GetGlobalReadingInfoOutDto() { @@ -186,7 +186,7 @@ namespace IRaCIS.Application.Services new GlobalQuestionInfo() { Answer = globalReadingQuestion.Where(y => y.TaskId == x.VisitTaskId && y.GlobalAnswerType == GlobalAnswerType.AgreeOrNot).Select(x => x.Answer).FirstOrDefault() ?? string.Empty, - QuestionName = "是否同意访视整体评估", + QuestionName = "", Type = "input", GlobalAnswerType=GlobalAnswerType.AgreeOrNot, GlobalReadingShowType= GlobalReadingShowType.AllShow, diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index 441984bb6..5027fca4c 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -311,12 +311,12 @@ namespace IRaCIS.Application.Services var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync(); if (taskinfo.ReadingCategory != ReadingCategory.Visit) { - throw new BusinessValidationFailedException("当前任务不是访视任务"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_NotVisit"]); } if (await _subjectVisitRepository.AnyAsync(x => x.Id == taskinfo.SourceSubjectVisitId && x.IsBaseLine)) { - throw new BusinessValidationFailedException("当前是基线任务,无法拆分和合并病灶"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_CantSplit"]); } } @@ -332,13 +332,13 @@ namespace IRaCIS.Application.Services { if (await _visitTaskRepository.AnyAsync(x => x.Id == visitTaskid && x.ReadingTaskState == ReadingTaskState.HaveSigned)) { - throw new BusinessValidationFailedException($"当前任务已经签名!"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_BeSigned"]); } if (await _visitTaskRepository.AnyAsync(x => x.Id == visitTaskid && x.TaskState != TaskState.Effect)) { - throw new BusinessValidationFailedException($"当前任务已失效!"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_Beinvalid"]); } } @@ -813,7 +813,7 @@ namespace IRaCIS.Application.Services if (rowsInfo.Count() != 2) { - throw new BusinessValidationFailedException("合并的病灶并非同一个访视任务"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_NotaTask"]); } @@ -938,7 +938,7 @@ namespace IRaCIS.Application.Services if (await _readingTableAnswerRowInfoRepository.AnyAsync(x => x.SplitRowId == deleteRowInfo.Id && x.MergeRowId == deleteRowInfo.Id)) { - throw new BusinessValidationFailedException($"当前病灶分裂出其他病灶或者其他病灶合并到了当前病灶,删除失败"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_DeleteError"]); } var index = await _readingCalculateService.GetDeleteLesionStatrIndex(inDto); @@ -1072,7 +1072,7 @@ namespace IRaCIS.Application.Services { if (!(await _dicomInstanceRepository.AnyAsync(x => x.Id == inDto.InstanceId && x.SeriesId == inDto.SeriesId))) { - throw new BusinessValidationFailedException($"InstanceId和SeriesId不对应!"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_Idnotcorrespond"]); } } @@ -1090,7 +1090,7 @@ namespace IRaCIS.Application.Services if (tableQuestionIdGroup.Any(x => x.Count > 1)) { - throw new BusinessValidationFailedException($"相同问题传入两次!"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_Twice"]); } if (inDto.RowIndex % 1 == 0) @@ -1104,7 +1104,7 @@ namespace IRaCIS.Application.Services && x.QuestionId == inDto.QuestionId ).CountAsync()) + 1)) { - throw new BusinessValidationFailedException($"当前提交问题最大问题数为{questionInfo.MaxQuestionCount}!"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_MaxQuestion", questionInfo.MaxQuestionCount]); } } @@ -1123,7 +1123,7 @@ namespace IRaCIS.Application.Services Dictionary errorMsgDic = new Dictionary() { - {CriterionType.RECIST1Pointt1, $"按照RECIST1.1的相关规则,同一器官的靶病灶数量不超过{item.MaxRowCount.Value}个,请确认!"}, + {CriterionType.RECIST1Pointt1, _localizer["ReadingImage_Maxlesion", item.MaxRowCount.Value]}, }; string msg = string.Empty; try @@ -1133,7 +1133,7 @@ namespace IRaCIS.Application.Services catch (Exception) { - msg = $"问题{item.QuestionName}最大相同问题数为{item.MaxRowCount.Value},当前已存在{rowCount}条!"; + msg = _localizer["ReadingImage_Maximum", item.QuestionName, item.MaxRowCount.Value, rowCount] ; } throw new BusinessValidationFailedException(msg); @@ -1353,7 +1353,7 @@ namespace IRaCIS.Application.Services if (readingQuestionList.Count() > 0) { - throw new BusinessValidationFailedException($" 必填问题{string.Join(',', readingQuestionList.Select(x => x.QuestionName))}的答案为空或未保存"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_RequiredQuestion", string.Join(',', readingQuestionList.Select(x => x.QuestionName))]); } return ResponseOutput.Ok(true); } @@ -1380,7 +1380,7 @@ namespace IRaCIS.Application.Services if (readingQuestionList.Count() > 0) { - throw new BusinessValidationFailedException($" 必填问题{string.Join(',', readingQuestionList.Select(x => x.QuestionName))}的答案为空或未保存"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_RequiredQuestion", string.Join(',', readingQuestionList.Select(x => x.QuestionName))]); } await _readingCalculateService.VerifyVisitTaskQuestions(inDto); @@ -1412,7 +1412,7 @@ namespace IRaCIS.Application.Services if (isNeedReadClinicalData && !taskInfo.IsReadClinicalData) { - throw new BusinessValidationFailedException($"临床数据未阅读!"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_ClinicalRead"]); } @@ -1443,7 +1443,7 @@ namespace IRaCIS.Application.Services if (trialReadingCriterionId == null && inDto.VisitTaskId == null) { - throw new BusinessValidationFailedException("当没有任务Id的时候,标准Id必传"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_IDMust"]); } if (inDto.VisitTaskId != null) @@ -1484,7 +1484,7 @@ namespace IRaCIS.Application.Services if (currentSubject == null) { - throw new BusinessValidationFailedException("当前受试者此次阅片任务已全部完成!"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_TaskFinish"]); } task = currentSubject.UnReadTaskList.Select(x => new GetReadingTaskDto() @@ -1519,7 +1519,7 @@ namespace IRaCIS.Application.Services }).FirstOrDefaultAsync(); if (task == null) { - throw new BusinessValidationFailedException("当前受试者此次阅片任务已全部完成!"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_TaskFinish"]); } } @@ -1609,7 +1609,7 @@ namespace IRaCIS.Application.Services int timespanMin = (DateTime.Now - cacheDate).Minutes; if (timespanMin > 120 && timespanMin < 140) { - throw new BusinessValidationFailedException("您已连续阅片2个小时,请休息20分钟后,再继续阅片。"); + throw new BusinessValidationFailedException(_localizer["ReadingImage_NeedRest"]); } else if (timespanMin > 140) { diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs index e83c7da85..8756c5ccd 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs @@ -274,7 +274,7 @@ namespace IRaCIS.Application.Services { Answer = item.AfterQuestionList.Where(x => x.GlobalAnswerType == GlobalAnswerType.Reason).Select(x => x.Answer).FirstOrDefault(), QuestionType = JudgeReadingQuestionType.VisitRemark, - QuestionName = "全局阅片备注", + QuestionName = "", }); judgeReadingInfo.VisitTaskInfoList.Add(judgeReadingQuestion); @@ -309,7 +309,7 @@ namespace IRaCIS.Application.Services { Answer = twoItem.AfterQuestionList.Where(x => x.GlobalAnswerType == GlobalAnswerType.Reason).Select(x => x.Answer).FirstOrDefault(), QuestionType = JudgeReadingQuestionType.VisitRemark, - QuestionName = "全局阅片备注", + QuestionName = "", }); judgeReadingInfo.VisitTaskInfoList.Add(rTwoJudge); @@ -375,7 +375,7 @@ namespace IRaCIS.Application.Services { if (taskInfo.SouceReadModuleId == null) { - throw new BusinessValidationFailedException($"当前裁判的全局任务的SouceId为null"); + throw new BusinessValidationFailedException(_localizer["ReadingJudge_SouceIdNull"]); } var visitId = await _readModuleRepository.Where(x => x.Id == taskInfo.SouceReadModuleId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync(); diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs index 029dc878f..bef806ba3 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs @@ -34,7 +34,7 @@ namespace IRaCIS.Application.Services if (taskInfo.ReadingCategory != ReadingCategory.Oncology) { - throw new BusinessValidationFailedException("当前任务不是肿瘤学任务"); + throw new BusinessValidationFailedException(_localizer["ReadingOncology_TaskError"]); } var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == taskInfo.TrialReadingCriterionId).FirstOrDefaultAsync(); @@ -75,7 +75,7 @@ namespace IRaCIS.Application.Services var judgeResultTaskId = await _visitTaskRepository.Where(x => x.Id == globalTaskInfo.JudgeVisitTaskId).Select(x => x.JudgeResultTaskId).FirstOrDefaultAsync(); if (judgeResultTaskId == null) { - throw new BusinessValidationFailedException("异常,裁判结果为null"); + throw new BusinessValidationFailedException(_localizer["ReadingOncology_Abnormal"]); } visitTask = await _visitTaskRepository.Where(x => x.Id == judgeResultTaskId).FirstOrDefaultAsync(); } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs index 38bee6cd1..8c8d5dbe8 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs @@ -395,7 +395,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate catch (Exception) { - throw new BusinessValidationFailedException($"PCWG3标准配置异常!"); + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_Abnormal"]); } await _visitTaskRepository.UpdatePartialFromQueryAsync(visitTaskId, x => new VisitTask() @@ -951,18 +951,18 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (measureDataList.Count() > 0) { - errorMassage += $" 病灶{ string.Join(',', measureDataList)}不存在标记,"; + errorMassage += _localizer["ReadingCalculate_NoMarker", string.Join(',', measureDataList)]; } if (tableAnswerList.Count > 0) { - errorMassage += $" 病灶{ string.Join(',', stateIsNullList)}状态为空,"; + errorMassage += _localizer["ReadingCalculate_StatusIsEmpty", string.Join(',', stateIsNullList)] ; } if (allExists.Count > 0) { - errorMassage += $" 病灶{ string.Join(',', stateIsNullList)}未做标记,且状态为空,"; + errorMassage += _localizer["ReadingCalculate_NoMarkerEmpty", string.Join(',', stateIsNullList)]; } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs index 93d68eaa8..6dcfe3ce0 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs @@ -553,18 +553,18 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (measureDataList.Count() > 0) { - errorMassage += $" 病灶{ string.Join(',', measureDataList)}不存在标记,"; + errorMassage += _localizer["ReadingCalculate_NoMarker", string.Join(',', measureDataList)]; } if (tableAnswerList.Count > 0) { - errorMassage += $" 病灶{ string.Join(',', stateIsNullList)}状态为空,"; + errorMassage += _localizer["ReadingCalculate_StatusIsEmpty", string.Join(',', stateIsNullList)]; } if (allExists.Count > 0) { - errorMassage += $" 病灶{ string.Join(',', stateIsNullList)}未做标记,且状态为空,"; + errorMassage += _localizer["ReadingCalculate_NoMarkerEmpty", string.Join(',', stateIsNullList)]; } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/ReadingCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/ReadingCalculateService.cs index 865fe1632..7d539a2c7 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/ReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/ReadingCalculateService.cs @@ -56,7 +56,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (criterionType == null) { - throw new BusinessValidationFailedException($"当前标准计算未开发好"); + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_NoDeveloped"]); } try diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index 45c21591c..5b60a1ed5 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -1,6 +1,7 @@ using BeetleX.BNR; using IRaCIS.Core.Application.Service; using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Infrastructure; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; @@ -123,7 +124,7 @@ namespace IRaCIS.Application.Services } [AllowAnonymous] - public async Task GetEnvironmentName( [FromServices] IWebHostEnvironment env) + public async Task GetEnvironmentName( [FromServices] IWebHostEnvironment env) { var a = 102.ToString().Substring(102.ToString().Length - 1); @@ -136,7 +137,7 @@ namespace IRaCIS.Application.Services //await _repository.BatchUpdateAsync(u => !u.Path.Contains(".dcm"), t => new DicomInstance() { Path = $"/{StaticData.Folder.IRaCISDataFolder}/{StaticData.Folder.TrialDataFolder}/{t.TrialId}/{t.SiteId}/{t.SubjectId}/{t.SubjectVisitId}/{StaticData.Folder.DicomFolder}/{t.StudyId}/{t.Id}" }); - return new { env.EnvironmentName , EMailConfig= _systemEmailConfig.CurrentValue,BasicConfig= _basicConfig.CurrentValue} ; + //return new { env.EnvironmentName , EMailConfig= _systemEmailConfig.CurrentValue,BasicConfig= _basicConfig.CurrentValue} ; // Load a document. @@ -200,8 +201,10 @@ namespace IRaCIS.Application.Services //var d = _dicRepository.UpdateFromDTOAsync(new AddOrEditBasicDic() { Id = Guid.Parse("60d86683-c33b-4349-b672-08da1e91b622"), ParentId = null, ChildGroup = null, Code = null }, true, true).Result; //var a = 123; - //var b = _localizer["test{0}", "测试"]; - //return _localizer["test{0}", "测试"]; + throw new BusinessValidationFailedException(_localizer["TrialIsDoubleCheck{0}", "测试"]); + + var b = _localizer["test{0}", "测试"]; + return _localizer["test{0}", "测试"]; //var list = _repository.Where(t => t.Id == Guid.NewGuid()).SelectMany(t => t.VisitTaskList).ToList(); diff --git a/后端提示语.xlsx b/后端提示语.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8da8f1256f8e2fa3ff30857be5adce7db58dba14 GIT binary patch literal 15859 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 M?_-wa{PpSo03_6Dn*aa+ literal 0 HcmV?d00001