//-------------------------------------------------------------------- // 此代码由T4模板自动生成 byzhouhang 20210918 // 生成时间 2022-06-29 10:59:39 // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 //-------------------------------------------------------------------- using IRaCIS.Core.Domain.Models; using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Application.Interfaces; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Domain.Share; namespace IRaCIS.Core.Application.Service { /// /// 任务医学审核 /// [ApiExplorerSettings(GroupName = "Trial")] public class TaskMedicalReviewService : BaseService, ITaskMedicalReviewService { private readonly IRepository _taskMedicalReviewRepository; private readonly IRepository _trialRepository; private readonly IRepository _trialUserRepository; private readonly IRepository _visitTaskRepository; private readonly IRepository _taskMedicalReviewRuleRepository; public TaskMedicalReviewService(IRepository taskMedicalReviewRepository, IRepository trialRepository, IRepository trialUserRepository, IRepository visitTaskRepository, IRepository taskMedicalReviewRuleRepository) { _taskMedicalReviewRepository = taskMedicalReviewRepository; this._trialRepository = trialRepository; _trialUserRepository = trialUserRepository; _visitTaskRepository = visitTaskRepository; _taskMedicalReviewRuleRepository = taskMedicalReviewRuleRepository; } /// /// PM 医学审核(挑选任务生成后的列表) /// /// /// [HttpPost] public async Task> GetMedicalReviewTaskList(TaskMedicalReviewQuery inQuery) { var taskMedicalReviewQueryable = _taskMedicalReviewRepository.Where(t => t.VisitTask.TrialId == inQuery.TrialId) .WhereIf(inQuery.SiteId != null, t => t.VisitTask.Subject.SiteId == inQuery.SiteId) .WhereIf(inQuery.SubjectId != null, t => t.VisitTask.SubjectId == inQuery.SubjectId) .WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => t.VisitTask.Subject.Code.Contains(inQuery.SubjectCode)) .WhereIf(!string.IsNullOrEmpty(inQuery.TaskName), t => t.VisitTask.TaskName.Contains(inQuery.TaskName) || t.VisitTask.TaskBlindName.Contains(inQuery.TaskName)) .WhereIf(inQuery.IsUrgent != null, t => t.VisitTask.IsUrgent == inQuery.IsUrgent) .WhereIf(inQuery.DoctorUserId != null, t => t.VisitTask.DoctorUserId == inQuery.DoctorUserId) .WhereIf(!string.IsNullOrEmpty(inQuery.TrialSiteCode), t => (t.VisitTask.BlindTrialSiteCode.Contains(inQuery.TrialSiteCode) && t.VisitTask.IsAnalysisCreate) || (t.VisitTask.Subject.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode) && t.VisitTask.IsAnalysisCreate == false)) .WhereIf(inQuery.ReadingCategory != null, t => t.VisitTask.ReadingCategory == inQuery.ReadingCategory) .WhereIf(inQuery.ReadingTaskState != null, t => t.VisitTask.ReadingTaskState == inQuery.ReadingTaskState) .ProjectTo(_mapper.ConfigurationProvider); var pageList = await taskMedicalReviewQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TaskMedicalReviewView.Id) : inQuery.SortField, inQuery.Asc); return pageList; } /// /// 产生医学审核列表 /// /// /// [HttpPost] public async Task> GetGenerateMedicalReviewTaskList(GenerateMedicalReviewTaskQuery inQuery) { var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == inQuery.TrialId) .Where(t => t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect && t.ReadingTaskState == ReadingTaskState.HaveSigned) .WhereIf(inQuery.SiteId != null, t => t.Subject.SiteId == inQuery.SiteId) .WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId) .WhereIf(inQuery.IsUrgent != null, t => t.IsUrgent == inQuery.IsUrgent) .WhereIf(inQuery.DoctorUserId != null, t => t.DoctorUserId == inQuery.DoctorUserId) .WhereIf(inQuery.ReadingCategory != null, t => t.ReadingCategory == inQuery.ReadingCategory) .WhereIf(inQuery.ReadingTaskState != null, t => t.ReadingTaskState == inQuery.ReadingTaskState) .WhereIf(inQuery.IsGeneratedJudge != null, t => t.JudgeVisitTaskId != null) .WhereIf(inQuery.IsGlobalHaveUpdate != null, t => t.IsGlobalHaveUpdate == inQuery.IsGlobalHaveUpdate) .WhereIf(!string.IsNullOrEmpty(inQuery.TaskName), t => t.TaskName.Contains(inQuery.TaskName) || t.TaskBlindName.Contains(inQuery.TaskName)) .WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => t.Subject.Code.Contains(inQuery.SubjectCode)) .ProjectTo(_mapper.ConfigurationProvider); var defalutSortArray = new string[] { nameof(TaskMedicalReviewView.IsUrgent) + " desc", nameof(TaskMedicalReviewView.SubjectId) }; var pageList = await visitTaskQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc, string.IsNullOrWhiteSpace(inQuery.SortField), defalutSortArray); return pageList; } /// /// 手动生成并分配医学审核 /// /// /// public async Task ManuallyGeneratedAndAssignedMedicalReview(ManuallyGeneratedAndAssignedMedicalReviewCommand command) { foreach (var taskId in command.TaskIdList) { await _taskMedicalReviewRepository.AddAsync(new TaskMedicalReview() { TrialId = command.TrialId, VisitTaskId = taskId, MedicalManagerUserId = command.MedicalManagerUserId, AllocateTime = DateTime.Now }); } await _taskMedicalReviewRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } /// /// MIM 医学审核 /// /// /// [HttpPost] public async Task<(PageOutput, object)> GetMIMMedicalReviewTaskList(TaskMedicalReviewQuery inQuery) { var taskMedicalReviewQueryable = _taskMedicalReviewRepository.Where(t => t.VisitTask.TrialId == inQuery.TrialId && t.MedicalManagerUserId == _userInfo.Id) .WhereIf(inQuery.SiteId != null, t => t.VisitTask.Subject.SiteId == inQuery.SiteId) .WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => t.VisitTask.Subject.Code.Contains(inQuery.SubjectCode)) .WhereIf(inQuery.IsUrgent != null, t => t.VisitTask.IsUrgent == inQuery.IsUrgent) .WhereIf(inQuery.DoctorUserId != null, t => t.VisitTask.DoctorUserId == inQuery.DoctorUserId) .WhereIf(inQuery.ReadingCategory != null, t => t.VisitTask.ReadingCategory == inQuery.ReadingCategory) .WhereIf(inQuery.ReadingTaskState != null, t => t.VisitTask.ReadingTaskState == inQuery.ReadingTaskState) .ProjectTo(_mapper.ConfigurationProvider); var pageList = await taskMedicalReviewQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TaskMedicalReviewView.Id) : inQuery.SortField, inQuery.Asc); return (pageList, new { IsConfirmMedicineQuestion = await _trialRepository.Where(x => x.Id == inQuery.TrialId).Select(x => x.IsConfirmMedicineQuestion).FirstOrDefaultAsync() }); } /// /// 设置医学审核失效 /// /// /// [HttpPost] public async Task SetMedicalReviewInvalid(SetMedicalReviewInvalidCommand command) { if (await _taskMedicalReviewRepository.Where(t => command.MedicalReviewIdList.Contains(t.Id)).AnyAsync(t => t.AuditState == MedicalReviewAuditState.HaveSigned)) { return ResponseOutput.NotOk("已签名的不允许设置为失效"); } await _taskMedicalReviewRepository.UpdatePartialFromQueryAsync(t => command.MedicalReviewIdList.Contains(t.Id), c => new TaskMedicalReview() { IsInvalid = true },true); return ResponseOutput.Ok(); } /// /// 123 分别是 分配,重新分配,取消分配 /// /// /// [UnitOfWork] [HttpPost] public async Task AssignMedicalReviewTask(AssignMedicalReviewTaskCommand command) { foreach (var id in command.IdList) { var task = await _taskMedicalReviewRepository.FirstOrDefaultAsync(t => t.Id == id); if (command.TaskOptType == MedicalReviewTaskOptType.Assign) { if (task.MedicalManagerUserId != null && task.MedicalManagerUserId != command.MedicalManagerUserId) { throw new BusinessValidationFailedException("当前有任务已分配给其他人,不允许分配,请刷新列表"); } task.MedicalManagerUserId = command.MedicalManagerUserId; task.AllocateTime = DateTime.Now; } else if (command.TaskOptType == MedicalReviewTaskOptType.ReAssign) { task.MedicalManagerUserId = command.MedicalManagerUserId; task.AllocateTime = DateTime.Now; } else if (command.TaskOptType == MedicalReviewTaskOptType.CancelAssign) { task.MedicalManagerUserId = null; task.AllocateTime = null; } } await _taskMedicalReviewRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } /// /// 获取医学经理列表 /// /// [HttpGet("{trialId:guid}")] public async Task> GetMIMUserList(Guid trialId) { var query = _trialUserRepository.Where(t => t.User.UserTypeEnum == Domain.Share.UserTypeEnum.MIM && t.TrialId == trialId).Select(t => t.User).ProjectTo(_mapper.ConfigurationProvider); return await query.ToListAsync(); } } }