using IRaCIS.Core.Domain.Models; using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Application.Interfaces; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Infra.EFCore.Common; using MassTransit; using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Share; using Panda.DynamicWebApi.Attributes; using IRaCIS.Core.Application.Contracts; using Newtonsoft.Json; namespace IRaCIS.Core.Application.Service { /// /// 阅片医学审核 /// [ ApiExplorerSettings(GroupName = "Reading")] public class ReadingMedicalReviewService : BaseService, IReadingMedicalReviewService { private readonly IRepository _readingMedicineTrialQuestionRepository; private readonly IRepository _trialRepository; private readonly IRepository _visitTaskRepository; private readonly IRepository _readingTaskQuestionAnswerRepository; private readonly IRepository _readingGlobalTaskInfoRepository; private readonly IRepository _readingOncologyTaskInfoRepository; private readonly IRepository _readingCriterionDictionaryRepository; private readonly IRepository _userTaskRepository; private readonly IVisitTaskService _visitTaskService; private readonly IRepository _taskMedicalReviewRepository; private readonly IRepository _readingMedicalReviewDialogRepository; private readonly IRepository _readingQuestionCriterionTrial; private readonly IRepository _readingMedicineQuestionAnswerRepository; private readonly IRepository _readingMedicineSystemQuestionRepository; public ReadingMedicalReviewService( IRepository readingMedicineTrialQuestionRepository, IRepository trialRepository, IRepository visitTaskRepository, IRepository readingTaskQuestionAnswerRepository, IRepository readingGlobalTaskInfoRepository, IRepository readingOncologyTaskInfoRepository, IRepository readingCriterionDictionaryRepository, IRepository userTaskRepository, IVisitTaskService visitTaskService, IRepository taskMedicalReviewRepository, IRepository readingMedicalReviewDialogRepository, IRepository readingQuestionCriterionTrial, IRepository readingMedicineQuestionAnswerRepository, IRepository readingMedicineSystemQuestionRepository ) { this._readingMedicineTrialQuestionRepository = readingMedicineTrialQuestionRepository; this._trialRepository = trialRepository; this._visitTaskRepository = visitTaskRepository; this._readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository; this._readingGlobalTaskInfoRepository = readingGlobalTaskInfoRepository; this._readingOncologyTaskInfoRepository = readingOncologyTaskInfoRepository; this._readingCriterionDictionaryRepository = readingCriterionDictionaryRepository; this._userTaskRepository = userTaskRepository; this._visitTaskService = visitTaskService; this._taskMedicalReviewRepository = taskMedicalReviewRepository; this._readingMedicalReviewDialogRepository = readingMedicalReviewDialogRepository; this._readingQuestionCriterionTrial = readingQuestionCriterionTrial; this._readingMedicineQuestionAnswerRepository = readingMedicineQuestionAnswerRepository; this._readingMedicineSystemQuestionRepository = readingMedicineSystemQuestionRepository; } /// /// 获取医学审核任务信息 /// /// /// [HttpPost] public async Task GetMedicalReviewReadingTask(GetMedicalReviewReadingTaskInDto inDto) { MedicalReviewInfo reviewInfo= await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId) .ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); var taskInfo = await _visitTaskRepository.Where(x => x.Id == reviewInfo.VisitTaskId).Include(x=>x.DoctorUser).Include(x => x.Subject).FirstNotNullAsync(); //if (taskInfo.TaskState != TaskState.Effect) //{ // throw new BusinessValidationFailedException("当前医学审核已失效!"); //} inDto.TrialReadingCriterionId = taskInfo.TrialReadingCriterionId; var medicalReviewInfo = await _readingQuestionCriterionTrial.Where(x => x.Id == taskInfo.TrialReadingCriterionId).Select(x => new GetMedicalReviewReadingTaskOutDto() { ReadingType=x.ReadingType, IsReadingTaskViewInOrder=x.IsReadingTaskViewInOrder, }).FirstNotNullAsync(); medicalReviewInfo.MedicalReviewInfo = reviewInfo; medicalReviewInfo.VisitTaskId = taskInfo.Id; medicalReviewInfo.ArmEnum = taskInfo.ArmEnum; medicalReviewInfo.SubjectCode = taskInfo.Subject.Code; medicalReviewInfo.TaskBlindName = taskInfo.TaskBlindName; medicalReviewInfo.ReadingUser = taskInfo.DoctorUser.FirstName + taskInfo.DoctorUser.LastName; medicalReviewInfo.IsClosedDialog = medicalReviewInfo.MedicalReviewInfo.IsClosedDialog; medicalReviewInfo.AuditState = medicalReviewInfo.MedicalReviewInfo.AuditState; medicalReviewInfo.IsSendMessage = medicalReviewInfo.MedicalReviewInfo.IsSendMessage; medicalReviewInfo.QuestionAnswerList = await this.GetMedicalQuestionAnswer(inDto); var result = await _readingMedicineQuestionAnswerRepository.SaveChangesAsync(); #region 取任务 // 先判断是否是肿瘤学任务 if (taskInfo.ReadingCategory == ReadingCategory.Oncology) { var oncologyList = await _readingOncologyTaskInfoRepository.Where(x => x.OncologyTaskId == taskInfo.Id).ToListAsync(); var taskIds= oncologyList.Select(x=>x.VisitTaskId).ToList(); medicalReviewInfo.TaskList = await _visitTaskRepository.Where(x=> taskIds.Contains(x.Id) ).OrderBy(x => x.VisitTaskNum).Select(x => new TaskInfo() { TaskId = x.Id, IsCurrentTask = x.Id == taskInfo.Id, ReadingCategory = x.ReadingCategory, TaskBlindName = x.TaskBlindName, ArmEnum = x.ArmEnum, TaskName = x.TaskName, SouceReadModuleId = x.SouceReadModuleId, SourceSubjectVisitId = x.SourceSubjectVisitId, JudgeVisitTaskId = x.JudgeVisitTaskId, JudgeResultArm = x.JudgeResultTask.ArmEnum, SubjectId = x.SubjectId, }).ToListAsync(); medicalReviewInfo.TaskList.ForEach(x => { var oncologyInfo = oncologyList.Where(y => y.VisitTaskId == x.TaskId).FirstOrDefault(); if (oncologyInfo != null) { x.OncologyEvaluationResult = oncologyInfo.EvaluationResult; x.OncologyEvaluationReason = oncologyInfo.EvaluationReason; } }); medicalReviewInfo.OncologyAssessTypeList = await _readingCriterionDictionaryRepository.Where(x => x.CriterionId == taskInfo.TrialReadingCriterionId && x.ParentCode == ReadingCommon.CriterionDictionary.OncologyAssess ) .Select(x => new CriterionDictionaryInfo() { Id = x.Id, DictionaryId = x.DictionaryId, ChildGroup = x.Dictionary.ChildGroup, Code = x.Dictionary.Code, Description = x.Dictionary.Description, ShowOrder = x.Dictionary.ShowOrder, ParentCode = x.Dictionary.Parent.Code, Value = x.Dictionary.Value, ValueCN = x.Dictionary.ValueCN }).OrderBy(x => x.ParentCode).ThenBy(x => x.ShowOrder).ToListAsync(); } else { // 有序 if (medicalReviewInfo.IsReadingTaskViewInOrder) { medicalReviewInfo.TaskList = await _visitTaskRepository .WhereIf(taskInfo.ArmEnum == Arm.JudgeArm, x => x.ArmEnum == Arm.JudgeArm) .WhereIf(taskInfo.ArmEnum != Arm.JudgeArm, x => x.ArmEnum != Arm.JudgeArm) .Where(x => x.IsAnalysisCreate == taskInfo.IsAnalysisCreate) .Where(x => x.TaskState == TaskState.Effect) .Where(x => x.SubjectId == taskInfo.SubjectId && x.ArmEnum == taskInfo.ArmEnum && x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && x.DoctorUserId == taskInfo.DoctorUserId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ReReadingApplyState != ReReadingApplyState.Agree ).OrderBy(x => x.VisitTaskNum).Select(x => new TaskInfo() { TaskId = x.Id, IsCurrentTask = x.Id == taskInfo.Id, ReadingCategory = x.ReadingCategory, TaskBlindName = x.TaskBlindName, ArmEnum = x.ArmEnum, TaskName = x.TaskName, SouceReadModuleId = x.SouceReadModuleId, SourceSubjectVisitId = x.SourceSubjectVisitId, JudgeVisitTaskId = x.JudgeVisitTaskId, JudgeResultArm = x.JudgeResultTask.ArmEnum, SubjectId = x.SubjectId, // 这里先只查裁判任务 访视和全局任务到后面查询 JudgeQuestionAnswerInfoList = x.JudgeResultTask.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.IsJudgeQuestion).Select(y => new JudgeQuestionAnswerInfo() { VisitTaskId = y.VisitTaskId, Answer = y.Answer, QuestionName = y.ReadingQuestionTrial.QuestionName, ShowOrder = y.ReadingQuestionTrial.ShowOrder, DictionaryCode = y.ReadingQuestionTrial.DictionaryCode, QuestionGenre = y.ReadingQuestionTrial.QuestionGenre, }).OrderBy(x => x.ShowOrder).ToList(), }).ToListAsync(); List otherTask = await _visitTaskRepository.Where(x => x.ArmEnum != Arm.JudgeArm && x.SubjectId == taskInfo.SubjectId && x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId &&x.TaskState==TaskState.Effect && x.DoctorUserId != taskInfo.DoctorUserId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ReReadingApplyState != ReReadingApplyState.Agree) .Where(x => x.IsAnalysisCreate == taskInfo.IsAnalysisCreate) .OrderBy(x => x.VisitTaskNum).Select(x => new TaskInfo() { TaskId = x.Id, IsCurrentTask = x.Id == taskInfo.Id, ReadingCategory = x.ReadingCategory, TaskBlindName = x.TaskBlindName, ArmEnum = x.ArmEnum, TaskName = x.TaskName, SouceReadModuleId = x.SouceReadModuleId, SourceSubjectVisitId = x.SourceSubjectVisitId, }).ToListAsync(); medicalReviewInfo.TaskList.ForEach(x => { var otherTaskInfo = otherTask.Where(y => y.SouceReadModuleId == x.SouceReadModuleId && y.SourceSubjectVisitId == x.SourceSubjectVisitId).FirstOrDefault(); if (otherTaskInfo != null) { x.OtherTaskId = otherTaskInfo.TaskId; x.OtherArmEnum = otherTaskInfo.ArmEnum; } }); } // 无序 else { medicalReviewInfo.TaskList = await _visitTaskRepository.Where(x => x.Id == taskInfo.Id).Select(x => new TaskInfo() { TaskId = x.Id, IsCurrentTask = x.Id == taskInfo.Id, ReadingCategory = x.ReadingCategory, TaskBlindName = x.TaskBlindName, ArmEnum = x.ArmEnum, TaskName = x.TaskName, SouceReadModuleId = x.SouceReadModuleId, SourceSubjectVisitId = x.SourceSubjectVisitId, SubjectId = x.SubjectId, // 这里先只查裁判任务 访视和全局任务到后面查询 JudgeQuestionAnswerInfoList = x.JudgeResultTask.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.IsJudgeQuestion).Select(y => new JudgeQuestionAnswerInfo() { VisitTaskId = y.VisitTaskId, Answer = y.Answer, QuestionName = y.ReadingQuestionTrial.QuestionName, ShowOrder = y.ReadingQuestionTrial.ShowOrder, DictionaryCode = y.ReadingQuestionTrial.DictionaryCode, QuestionGenre = y.ReadingQuestionTrial.QuestionGenre, }).OrderBy(x => x.ShowOrder).ToList(), }).ToListAsync(); List otherTask = await _visitTaskRepository.Where(x => x.ArmEnum != Arm.JudgeArm && x.SouceReadModuleId == taskInfo.SouceReadModuleId && x.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && x.DoctorUserId != taskInfo.DoctorUserId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ReReadingApplyState != ReReadingApplyState.Agree && x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && x.TaskState==TaskState.Effect ) .Where(x => x.IsAnalysisCreate == taskInfo.IsAnalysisCreate) .OrderBy(x => x.VisitTaskNum).Select(x => new TaskInfo() { TaskId = x.Id, IsCurrentTask = x.Id == taskInfo.Id, ReadingCategory = x.ReadingCategory, TaskBlindName = x.TaskBlindName, ArmEnum = x.ArmEnum, TaskName = x.TaskName, SouceReadModuleId = x.SouceReadModuleId, SourceSubjectVisitId = x.SourceSubjectVisitId, }).ToListAsync(); medicalReviewInfo.TaskList.ForEach(x => { var otherTaskInfo = otherTask.Where(y => y.SouceReadModuleId == x.SouceReadModuleId && y.SourceSubjectVisitId == x.SourceSubjectVisitId).FirstOrDefault(); if(otherTaskInfo!=null) { x.OtherTaskId = otherTaskInfo.TaskId; x.OtherArmEnum = otherTaskInfo.ArmEnum; } }); } // 这里处理 访视和全局任务 以及肿瘤学 if (taskInfo.ArmEnum != Arm.JudgeArm) { var taskIds = medicalReviewInfo.TaskList.Select(x => x.TaskId).ToList(); // 找访视 var visitTaskAnswer = await _readingTaskQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId) && x.ReadingQuestionTrial.IsJudgeQuestion).Select(x => new JudgeQuestionAnswerInfo { Answer = x.Answer, VisitTaskId = x.VisitTaskId, DictionaryCode = x.ReadingQuestionTrial.DictionaryCode, ShowOrder = x.ReadingQuestionTrial.ShowOrder, QuestionGenre = x.ReadingQuestionTrial.QuestionGenre, QuestionName = x.ReadingQuestionTrial.QuestionName }).ToListAsync(); var globalTaskAnswer = await (from global in _readingGlobalTaskInfoRepository.Where(x => taskIds.Contains(x.GlobalTaskId) && x.GlobalAnswerType == GlobalAnswerType.Question && x.TrialReadingQuestion.IsJudgeQuestion).Include(x=>x.TrialReadingQuestion) join taskAnswer in _readingTaskQuestionAnswerRepository.AsQueryable() on new { TaskId= global.TaskId, QuestionId=global.QuestionId??default(Guid),TaskNum=global.GlobalVisitTask.VisitTaskNum- 0.03m } equals new { TaskId=taskAnswer.VisitTaskId, QuestionId=taskAnswer.ReadingQuestionTrialId , TaskNum=taskAnswer.VisitTask.VisitTaskNum } select new JudgeQuestionAnswerInfo() { Answer = global.Answer.Trim().IsNullOrEmpty()? taskAnswer.Answer: global.Answer, VisitTaskId = global.GlobalTaskId, DictionaryCode = global.TrialReadingQuestion.DictionaryCode, ShowOrder = global.TrialReadingQuestion.ShowOrder, QuestionGenre = global.TrialReadingQuestion.QuestionGenre, QuestionName = global.TrialReadingQuestion.QuestionName }).ToListAsync(); visitTaskAnswer.AddRange(globalTaskAnswer); var globalChangeAnswer = await _readingGlobalTaskInfoRepository.Where(x => taskIds.Contains(x.GlobalTaskId) && x.GlobalAnswerType == GlobalAnswerType.Question).ToListAsync(); medicalReviewInfo.TaskList.ForEach(x => { x.IsGlobalChange = globalChangeAnswer.Any(y => y.TaskId == x.TaskId); x.JudgeQuestionAnswerInfoList = visitTaskAnswer.Where(y => y.VisitTaskId == x.TaskId).OrderBy(y => y.ShowOrder).ToList(); }); } } medicalReviewInfo.TaskList.ForEach(x => { x.IsCurrentTask = x.TaskId == taskInfo.Id; }); #endregion return medicalReviewInfo; } #region 问题 private async Task> GetMedicalQuestionAnswer(GetMedicalReviewReadingTaskInDto inDto) { var medicalReview = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); var taskInfo = await _visitTaskRepository.Where(x => x.Id == medicalReview.VisitTaskId).FirstNotNullAsync(); var questionQuery = from data in _readingMedicineTrialQuestionRepository.Where(x => x.TrialId == inDto.TrialId && x.IsConfirm && x.IsEnable&&x.ReadingCategory==taskInfo.ReadingCategory&&x.TrialReadingCriterionId==inDto.TrialReadingCriterionId) join questionAnswer in _readingMedicineQuestionAnswerRepository.Where(x => x.TaskMedicalReviewId == inDto.TaskMedicalReviewId) on data.Id equals questionAnswer.ReadingMedicineQuestionId into questionAnswerTemp from leftquestionAnswer in questionAnswerTemp.DefaultIfEmpty() select new ReadingMedicineQuestion() { Id = data.Id, Type = data.Type, ParentTriggerValue = data.ParentTriggerValue, IsEnable = data.IsEnable, IsConfirm = data.IsConfirm, QuestionName = data.QuestionName, IsRequired = data.IsRequired, ShowOrder = data.ShowOrder, ParentId = data.ParentId, TypeValue = data.TypeValue, Answer = leftquestionAnswer.Answer }; var questionList = await questionQuery.OrderBy(x=>x.ShowOrder).ToListAsync(); List medicineQuestionList = questionList.Where(x => x.ParentId == null).ToList(); medicineQuestionList.ForEach(x => { FindChildQuestion(x, questionList); }); return medicineQuestionList; } private void FindChildQuestion(ReadingMedicineQuestion medicineQuestionList, List questionlists) { medicineQuestionList.Childrens = questionlists.Where(x => x.ParentId == medicineQuestionList.Id).ToList(); if (medicineQuestionList.Childrens != null && medicineQuestionList.Childrens.Count != 0) { medicineQuestionList.Childrens.ForEach(x => { this.FindChildQuestion(x, questionlists); }); } } #endregion /// /// 保存医学审核问题 答案 /// /// [HttpPost] public async Task SaveMedicineQuestion(SaveMedicineQuestionInDto inDto) { var medicalReviewInfo = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (medicalReviewInfo.IsInvalid) { throw new BusinessValidationFailedException(_localizer["MedicalReview_invalid"]); } await _readingMedicineQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.TaskMedicalReviewId == inDto.TaskMedicalReviewId); List questionAnswerList = inDto.QuestionAnswerList.Select(x => new ReadingMedicineQuestionAnswer() { Answer = x.Answer, ReadingMedicineQuestionId = x.Id, TaskMedicalReviewId = inDto.TaskMedicalReviewId, VisitTaskId = inDto.VisitTaskId, }).ToList(); await _readingMedicineQuestionAnswerRepository.AddRangeAsync(questionAnswerList); await _taskMedicalReviewRepository.UpdatePartialFromQueryAsync(inDto.TaskMedicalReviewId, x => new TaskMedicalReview() { SaveQuestionTime = DateTime.Now, AuditState = MedicalReviewAuditState.Auditing, }); var result = await _readingMedicineQuestionAnswerRepository.SaveChangesAsync(); return ResponseOutput.Result(result); } /// /// 保存医学审核 结论 /// /// /// public async Task SaveMedicalReviewInfo(SaveMedicalReviewInfoInDto inDto) { var medicalReviewInfo = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (medicalReviewInfo.IsInvalid) { throw new BusinessValidationFailedException(_localizer["MedicalReview_invalid"]); } if ((await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).Select(x => x.SaveQuestionTime).FirstOrDefaultAsync()) == null) { return ResponseOutput.NotOk(_localizer["MedicalReview_SaveQuestion"]); } await _taskMedicalReviewRepository.UpdatePartialFromQueryAsync(inDto.TaskMedicalReviewId, x => new TaskMedicalReview() { IsHaveQuestion = inDto.IsHaveQuestion, Questioning = inDto.Questioning, IsSendMessage = inDto.IsSendDialog && inDto.IsHaveQuestion, ImagePath = JsonConvert.SerializeObject(inDto.FileList), AuditAdviceEnum = inDto.AuditAdviceEnum, SaveConclusionTime = DateTime.Now, }); var medicalReview = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (inDto.IsSendDialog&& !medicalReview.IsSendMessage && inDto.IsHaveQuestion) { await _readingMedicalReviewDialogRepository.AddAsync(new ReadingMedicalReviewDialog() { AuditAdviceEnum = inDto.AuditAdviceEnum, TaskMedicalReviewId = inDto.TaskMedicalReviewId, UserTypeShortName = _userInfo.UserTypeShortName, IsHaveQuestion=inDto.IsHaveQuestion, Questioning=inDto.Questioning, VisitTaskId= medicalReview.VisitTaskId, UserTypeEnumInt = _userInfo.UserTypeEnumInt, ImagePath = JsonConvert.SerializeObject(inDto.FileList), }); } var result = await _taskMedicalReviewRepository.SaveChangesAsync(); return ResponseOutput.Result(result); } /// /// 关闭医学审核对话 /// /// [HttpPost] public async Task ClosedMedicalReviewDialog(ClosedMedicalReviewDialogInDto inDto) { await _taskMedicalReviewRepository.UpdatePartialFromQueryAsync(inDto.TaskMedicalReviewId, x => new TaskMedicalReview() { IsClosedDialog = inDto.IsClosedDialog, MedicalDialogCloseEnum=inDto.MedicalDialogCloseEnum, DialogCloseReason=inDto.DialogCloseReason, }); ReadingMedicalReviewDialog dialog = new ReadingMedicalReviewDialog() { TaskMedicalReviewId = inDto.TaskMedicalReviewId, UserTypeShortName = _userInfo.UserTypeShortName, Content = inDto.MedicalDialogCloseEnum.GetDescription()+ (inDto.DialogCloseReason.IsNullOrEmpty()? inDto.DialogCloseReason:","+ inDto.DialogCloseReason), UserTypeEnumInt = _userInfo.UserTypeEnumInt, }; await _readingMedicalReviewDialogRepository.AddAsync(dialog); var result = await _taskMedicalReviewRepository.SaveChangesAsync(); return ResponseOutput.Result(result); } /// /// 发送对话消息 /// /// /// public async Task SendMedicalReviewDialog(SendMedicalReviewDialogInDto inDto) { var medicalReviewInfo = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (medicalReviewInfo.IsInvalid) { throw new BusinessValidationFailedException(_localizer["MedicalReview_invalid"]); } var visitTaskId = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).Select(x => x.VisitTaskId).FirstOrDefaultAsync(); ReadingMedicalReviewDialog dialog = new ReadingMedicalReviewDialog() { TaskMedicalReviewId = inDto.TaskMedicalReviewId, UserTypeShortName = _userInfo.UserTypeShortName, Content = inDto.Content, UserTypeEnumInt = _userInfo.UserTypeEnumInt, VisitTaskId = visitTaskId, AuditAdviceEnum=inDto.AuditAdviceEnum, IsHaveQuestion=inDto.IsHaveQuestion, Questioning=inDto.Questioning, }; await _readingMedicalReviewDialogRepository.AddAsync(dialog); var result=await _readingMedicalReviewDialogRepository.SaveChangesAsync(); return ResponseOutput.Result(result); } /// /// IR发送消息 /// /// /// public async Task IRSendMedicalReviewDialog(IRSendMedicalReviewDialogInDto inDto) { var medicalReviewInfo = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (medicalReviewInfo.IsInvalid) { 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) { await _visitTaskService.ApplyReReading(new ApplyReReadingCommand() { IsCopyOrigenalForms = inDto.IsCopyOrigenalForms??false, IsCopyFollowForms=inDto.IsCopyFollowForms ?? false, RequestReReadingReason = inDto.RequestReReadingReason, RequestReReadingType = RequestReReadingType.DocotorApply, TrialId = inDto.TrialId, TaskIdList = new List() { visitTaskId } }); await _taskMedicalReviewRepository.BatchUpdateNoTrackingAsync(x => !x.IsClosedDialog && x.Id == inDto.TaskMedicalReviewId, x => new TaskMedicalReview() { IsClosedDialog = true, MedicalDialogCloseEnum = MedicalDialogClose.IRApplyReReading, }); } await _taskMedicalReviewRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.TaskMedicalReviewId, x => new TaskMedicalReview() { DoctorUserIdeaEnum = inDto.DoctorUserIdeaEnum, }); ReadingMedicalReviewDialog dialog = new ReadingMedicalReviewDialog() { TaskMedicalReviewId = inDto.TaskMedicalReviewId, UserTypeShortName = _userInfo.UserTypeShortName, Content = inDto.Content, ImagePath=inDto.ImagePath, UserTypeEnumInt = _userInfo.UserTypeEnumInt, VisitTaskId = visitTaskId, FileName=inDto.FileName, DisagreeReason = inDto.DisagreeReason, DoctorUserIdeaEnum = inDto.DoctorUserIdeaEnum, IsApplyHeavyReading = inDto.IsApplyHeavyReading, }; await _readingMedicalReviewDialogRepository.AddAsync(dialog); var result = await _readingMedicalReviewDialogRepository.SaveChangesAsync(); return ResponseOutput.Result(result); } /// /// 获取医学审核对话 /// /// /// [HttpPost] public async Task<(List,object)> GetMedicalReviewDialog(GetMedicalReviewDialogInDto inDto) { var taskMedicalReview = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); List result = await _readingMedicalReviewDialogRepository.Where(x => x.TaskMedicalReviewId == inDto.TaskMedicalReviewId) .ProjectTo(_mapper.ConfigurationProvider) .OrderBy(x => x.CreateTime).ToListAsync(); result.ForEach(x => { x.IsCurrentUser = x.CreateUserId == _userInfo.Id; }); return (result,new { IsIRReply= result.Any(x=>x.UserTypeEnumInt== (int)UserTypeEnum.IndependentReviewer), taskMedicalReview.IsClosedDialog, taskMedicalReview.IsHaveQuestion, }); } /// /// 完成医学审核 /// /// /// [NonDynamicMethod] public async Task FinishMedicalReview(FinishMedicalReviewInDto inDto) { var medicalReviewInfo = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (medicalReviewInfo.IsInvalid) { throw new BusinessValidationFailedException(_localizer["MedicalReview_invalid"]); } var taskmedicalReview = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).Select(x => new { x.SaveConclusionTime, x.SaveQuestionTime, x.IsClosedDialog, x.IsHaveQuestion }).FirstNotNullAsync(); if (taskmedicalReview.SaveQuestionTime == null || taskmedicalReview.SaveConclusionTime==null) { throw new BusinessValidationFailedException(_localizer["MedicalReview_NeedSave"]); } if (taskmedicalReview.IsHaveQuestion&&!taskmedicalReview.IsClosedDialog) { throw new BusinessValidationFailedException(_localizer["MedicalReview_NotClosed"]); } await _taskMedicalReviewRepository.UpdatePartialFromQueryAsync(inDto.TaskMedicalReviewId, x => new TaskMedicalReview() { AuditState = MedicalReviewAuditState.HaveSigned, AuditSignTime=DateTime.Now, }); var result = await _taskMedicalReviewRepository.SaveChangesAsync(); return ResponseOutput.Result(result); } /// /// IR回复确认医学审核 /// /// /// [HttpPost] public async Task IRConfirmMedicalReview(IRConfirmMedicalReviewInDto inDto) { var medicalReviewInfo = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).FirstNotNullAsync(); if (medicalReviewInfo.IsInvalid) { throw new BusinessValidationFailedException(_localizer["MedicalReview_invalid"]); } await _taskMedicalReviewRepository.UpdatePartialFromQueryAsync(inDto.TaskMedicalReviewId, x => new TaskMedicalReview() { DoctorUserIdeaEnum = inDto.DoctorUserIdeaEnum, DisagreeReason = inDto.DisagreeReason, IsApplyHeavyReading=inDto.IsApplyHeavyReading, }); var visitTaskId = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.TaskMedicalReviewId).Select(x => x.VisitTaskId).FirstOrDefaultAsync(); await _readingMedicalReviewDialogRepository.AddAsync(new ReadingMedicalReviewDialog() { TaskMedicalReviewId = inDto.TaskMedicalReviewId, UserTypeShortName = _userInfo.UserTypeShortName, DoctorUserIdeaEnum = inDto.DoctorUserIdeaEnum, DisagreeReason = inDto.DisagreeReason, IsApplyHeavyReading = inDto.IsApplyHeavyReading, VisitTaskId = visitTaskId, UserTypeEnumInt = _userInfo.UserTypeEnumInt, }); var result = await _taskMedicalReviewRepository.SaveChangesAsync(); return ResponseOutput.Result(result); } /// /// 获取IR医学审核信息 /// /// /// [HttpPost] public async Task> GetIRMedicalFeedbackList(GetIRMedicalFeedbackListInDto inDto) { var taskMedicalReviewquery = _taskMedicalReviewRepository.Where(x => x.TrialId == inDto.TrialId).Include(x => x.VisitTask) .Where(x => x.VisitTask.DoctorUserId == _userInfo.Id) .Where(x => x.IsHaveQuestion) .WhereIf(!inDto.TaskBlindName.IsNullOrEmpty(), x => x.VisitTask.TaskBlindName == inDto.TaskBlindName) .WhereIf(inDto.IsUrgent != null, x => x.VisitTask.IsUrgent == inDto.IsUrgent!) .WhereIf(inDto.AuditState != null, x => x.AuditState == inDto.AuditState!) .WhereIf(inDto.ReadingCategory != null, x => x.VisitTask.ReadingCategory == inDto.ReadingCategory!) .WhereIf(inDto.AuditAdviceEnum != null, x => x.AuditAdviceEnum == inDto.AuditAdviceEnum!) .WhereIf(inDto.DoctorUserIdeaEnum != null, x => x.DoctorUserIdeaEnum == inDto.DoctorUserIdeaEnum!) .WhereIf(inDto.IsClosedDialog != null, x => x.IsClosedDialog == inDto.IsClosedDialog!) .WhereIf(inDto.IsHaveQuestion != null, x => x.IsHaveQuestion == inDto.IsHaveQuestion!) .WhereIf(inDto.MedicalDialogCloseEnum != null, x => x.MedicalDialogCloseEnum == inDto.MedicalDialogCloseEnum!) .WhereIf(inDto.IsInvalid != null, x => x.IsInvalid == inDto.IsInvalid!) .WhereIf(inDto.TrialReadingCriterionId != null, x => x.VisitTask.TrialReadingCriterionId == inDto.TrialReadingCriterionId!) .Select(x => new GetIRMedicalFeedbackListOutDto { TaskState=x.VisitTask.TaskState, Id = x.Id, VisitTaskId=x.VisitTaskId, IsUrgent = x.VisitTask.IsUrgent, AuditState = x.AuditState, SubjectCode = x.VisitTask.BlindSubjectCode == string.Empty ? x.VisitTask.Subject.Code : x.VisitTask.BlindSubjectCode, TaskBlindName = x.VisitTask.TaskBlindName, ReadingCategory = x.VisitTask.ReadingCategory, FirstReplyTime = x.ReadingMedicalReviewDialogList.Min(x => x.CreateTime), LastReplyTime = x.ReadingMedicalReviewDialogList.Max(x => x.CreateTime), AuditAdviceEnum = x.AuditAdviceEnum, DoctorUserIdeaEnum = x.DoctorUserIdeaEnum, SaveConclusionTime=x.SaveConclusionTime, IsClosedDialog=x.IsClosedDialog, IsHaveQuestion=x.IsHaveQuestion, MedicalDialogCloseEnum=x.MedicalDialogCloseEnum, IsInvalid=x.IsInvalid, SubjectId=x.VisitTask.SubjectId, TrialReadingCriterionId = x.VisitTask.TrialReadingCriterion.Id, TrialReadingCriterionName =x.VisitTask.TrialReadingCriterion.CriterionName, ReadingTool= x.VisitTask.TrialReadingCriterion.ReadingTool, IsReadingTaskViewInOrder = x.VisitTask.TrialReadingCriterion.IsReadingTaskViewInOrder, IsReadingShowSubjectInfo = x.VisitTask.TrialReadingCriterion.IsReadingShowSubjectInfo, IsReadingShowPreviousResults = x.VisitTask.TrialReadingCriterion.IsReadingShowPreviousResults, DigitPlaces = x.VisitTask.TrialReadingCriterion.DigitPlaces, IseCRFShowInDicomReading = x.VisitTask.TrialReadingCriterion.IseCRFShowInDicomReading, CriterionType = x.VisitTask.TrialReadingCriterion.CriterionType, }).WhereIf(!inDto.SubjectCode.IsNullOrEmpty(), x => x.SubjectCode == inDto.SubjectCode); var result=await taskMedicalReviewquery.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField.IsNullOrEmpty() ? nameof(GetIRMedicalFeedbackListOutDto.AuditState) : inDto.SortField, inDto.Asc); return result; } } }