diff --git a/IRaCIS.Core.Application/Service/Doctor/DTO/TrialExperienceModel.cs b/IRaCIS.Core.Application/Service/Doctor/DTO/TrialExperienceModel.cs index 61ee612a0..61ac9d5f3 100644 --- a/IRaCIS.Core.Application/Service/Doctor/DTO/TrialExperienceModel.cs +++ b/IRaCIS.Core.Application/Service/Doctor/DTO/TrialExperienceModel.cs @@ -2,6 +2,22 @@ { public class TrialExperienceCommand { + + /// + /// 数据类型 + /// + public ExperienceDataType ExperienceDataType { get; set; } + + /// + /// 项目Id + /// + public Guid? TrialId { get; set; } + + /// + /// 适应症的枚举 + /// + public int IndicationEnum { get; set; } = -1; + public Guid? Id { get; set; } public Guid DoctorId { get; set; } @@ -35,10 +51,23 @@ } + public class GetTrialExperienceListInDto + { + public Guid DoctorId { get; set; } + public Guid? TrialId { get; set; } + } + public class TrialExperienceListDTO : TrialExperienceCommand { public string Phase { get; set; } = String.Empty; + + + /// + /// 阅片标准 + /// + public CriterionType? CriterionType { get; set; } + public List EvaluationCriteriaList { get; set; } = new List(); } diff --git a/IRaCIS.Core.Application/Service/Doctor/TrialExperienceService.cs b/IRaCIS.Core.Application/Service/Doctor/TrialExperienceService.cs index 3414753c6..8ba4740f2 100644 --- a/IRaCIS.Core.Application/Service/Doctor/TrialExperienceService.cs +++ b/IRaCIS.Core.Application/Service/Doctor/TrialExperienceService.cs @@ -24,7 +24,11 @@ namespace IRaCIS.Core.Application.Service var doctor = await _doctorRepository.Where(o => o.Id == indto.DoctorId) .ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); - trialExperience.ClinicalTrialExperienceList = await GetTrialExperienceList(indto.DoctorId); + trialExperience.ClinicalTrialExperienceList = await GetTrialExperienceList(new GetTrialExperienceListInDto() + { + DoctorId = indto.DoctorId, + TrialId = indto.TrialId, + }); if (doctor != null) { @@ -90,12 +94,41 @@ namespace IRaCIS.Core.Application.Service return doctorInfo; } - private async Task> GetTrialExperienceList(Guid doctorId) + private async Task> GetTrialExperienceList(GetTrialExperienceListInDto inDto) { - var doctorClinicalTrialExperienceList = await _trialExperienceRepository.Where(o => o.DoctorId == doctorId).OrderBy(t => t.CreateTime) - .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + if (inDto.TrialId == null) + { + var doctorClinicalTrialExperienceList = await _trialExperienceRepository + .Where(o => o.DoctorId == inDto.DoctorId) + .Where(x => x.ExperienceDataType == ExperienceDataType.System) + .OrderBy(t => t.CreateTime) + .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + return doctorClinicalTrialExperienceList; + } + else + { + // 当前项目没有则复制 + if (!(await _trialExperienceRepository.AnyAsync(x => x.TrialId == inDto.TrialId))) + { + var trialExperienceList = await _trialExperienceRepository.Where(o => o.DoctorId == inDto.DoctorId) + .Where(x => x.ExperienceDataType == ExperienceDataType.System || x.ExperienceDataType == ExperienceDataType.SystemAuto).ToListAsync(); + foreach (var item in trialExperienceList) + { + item.Trial = null; + item.TrialId = inDto.TrialId; + item.ExperienceDataType = ExperienceDataType.Trial; + } + } - return doctorClinicalTrialExperienceList; + var doctorClinicalTrialExperienceList = await _trialExperienceRepository + .Where(o => o.DoctorId == inDto.DoctorId) + .Where(x => x.ExperienceDataType == ExperienceDataType.Trial|| x.ExperienceDataType == ExperienceDataType.TrialAuto) + .Where(x => x.TrialId == inDto.TrialId.Value) + .OrderBy(t => t.CreateTime) + .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + return doctorClinicalTrialExperienceList; + } + } /// 添加或更新医生临床经验列表项 diff --git a/IRaCIS.Core.Application/Service/Doctor/_MapConfig.cs b/IRaCIS.Core.Application/Service/Doctor/_MapConfig.cs index 2a72750f1..0fbb4c2e1 100644 --- a/IRaCIS.Core.Application/Service/Doctor/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Doctor/_MapConfig.cs @@ -95,6 +95,12 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.RealName, u => u.MapFrom(user => string.IsNullOrEmpty(user.FirstName) ? user.LastName : user.LastName + " / " + user.FirstName)); CreateMap() + .ForMember(x=>x.VisitReadingCount, u => u.MapFrom(t => (t.ExperienceDataType==ExperienceDataType.TrialAuto||t.ExperienceDataType==ExperienceDataType.SystemAuto)? + + // 统计数量 + t.Trial.VisitTaskList.Where(x=>x.ReadingTaskState==ReadingTaskState.HaveSigned&&x.TaskState== TaskState.Effect&&x.DoctorUser.DoctorId==t.DoctorId &&x.TrialReadingCriterion.CriterionType==t.CriterionType).Count(): + t.VisitReadingCount + )) .ForMember(d => d.Phase, u => u.MapFrom(t => t.Phase.Value)) .ForMember(d => d.EvaluationCriteriaList, u => u.MapFrom(t => t.ExperienceCriteriaList.Select(t => t.EvaluationCriteria.Value))) .ForMember(d => d.EvaluationCriteriaIdList, u => u.MapFrom(t => t.ExperienceCriteriaList.Select(t => t.EvaluationCriteriaId))); diff --git a/IRaCIS.Core.Application/Service/WorkLoad/EnrollService.cs b/IRaCIS.Core.Application/Service/WorkLoad/EnrollService.cs index 3d52be552..0d529950e 100644 --- a/IRaCIS.Core.Application/Service/WorkLoad/EnrollService.cs +++ b/IRaCIS.Core.Application/Service/WorkLoad/EnrollService.cs @@ -1,6 +1,8 @@ -using IRaCIS.Core.Application.Filter; +using DocumentFormat.OpenXml.Vml.Spreadsheet; +using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Service.WorkLoad.DTO; using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Infra.EFCore.Common; using Microsoft.AspNetCore.Mvc; using System.Text.RegularExpressions; @@ -16,6 +18,13 @@ namespace IRaCIS.Core.Application.Service IRepository _workloadRepository, IRepository _userRepository, IRepository _trialUserRepository, + IRepository _ReadingQuestionCriterionTrialRepository, + + IRepository _trialExperienceRepository, + + IRepository _dictionaryRepository, + + IRepository _trialExperienceCriteriaRepository, IMailVerificationService _mailVerificationService, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, IEnrollService { @@ -377,6 +386,16 @@ namespace IRaCIS.Core.Application.Service return ResponseOutput.NotOk(string.Join(',', _localizer["Enroll_EmailFormat"], errorList.Select(c => c.LastName + " / " + c.FirstName))); } + + + var readingQuestionCriterionTrial = await _ReadingQuestionCriterionTrialRepository.Where(x => x.TrialId == confirmReviewerCommand.TrialId && x.IsConfirm).ToListAsync(); + + + List trialExperienceList = new List(); + // 获取标准字典 + + var criterionTypeList = await _dictionaryRepository.Where(x => x.Parent.Code == "CriterionType").ToListAsync(); + if (confirmReviewerCommand.ConfirmState == 1) //确认入组 { foreach (var intoGroupItem in intoGroupList) @@ -412,6 +431,9 @@ namespace IRaCIS.Core.Application.Service intoGroupItem.EnrollStatus = EnrollStatus.ConfirmIntoGroup; intoGroupItem.EnrollTime = DateTime.Now; + + + } catch (Exception) { @@ -422,6 +444,50 @@ namespace IRaCIS.Core.Application.Service } } + + List dataTypes = new List() + { + ExperienceDataType.TrialAuto, + ExperienceDataType.SystemAuto, + + + }; + + // 添加临床试验经历 + if (trial.TrialType == TrialType.OfficialTrial) + { + foreach (var doctorId in confirmReviewerCommand.DoctorIdArray) + { + foreach (var item in readingQuestionCriterionTrial) + { + foreach (var dataType in dataTypes) + { + trialExperienceList.Add(new TrialExperience() + { + CriterionType = item.CriterionType, + DoctorId = doctorId, + PhaseId = trial.PhaseId, + StartTime = DateTime.Now, + IndicationEnum = trial.IndicationEnum, + ExperienceDataType = dataType, + TrialId = trial.Id, + VisitReadingCount = 0, + ExperienceCriteriaList = new List() { + + new TrialExperienceCriteria() + { + EvaluationCriteriaId=criterionTypeList.Where(x=>x.Code==item.CriterionType.GetEnumInt()).Select(x=>x.Id).FirstOrDefault() + } + } + }); + } + } + } + await _trialExperienceRepository.AddRangeAsync(trialExperienceList); + await _trialExperienceRepository.SaveChangesAsync(); + + } + } else if (confirmReviewerCommand.ConfirmState == 0)//回退上一步 { @@ -443,6 +509,9 @@ namespace IRaCIS.Core.Application.Service } + + + await _enrollRepository.SaveChangesAsync(); return ResponseOutput.Ok(); diff --git a/IRaCIS.Core.Domain/Dcotor/TrialExperience.cs b/IRaCIS.Core.Domain/Dcotor/TrialExperience.cs index af769eefd..331c4915c 100644 --- a/IRaCIS.Core.Domain/Dcotor/TrialExperience.cs +++ b/IRaCIS.Core.Domain/Dcotor/TrialExperience.cs @@ -6,8 +6,16 @@ namespace IRaCIS.Core.Domain.Models; [Table("TrialExperience")] public partial class TrialExperience : BaseFullAuditEntity { + + + + #region + [JsonIgnore] + [ForeignKey("TrialId")] + public Trial? Trial { get; set; } + [JsonIgnore] public List ExperienceCriteriaList { get; set; } #endregion @@ -59,17 +67,22 @@ public partial class TrialExperience : BaseFullAuditEntity public enum ExperienceDataType { /// - /// ϵͳ + /// ϵͳֶ /// System = 0, /// - /// Ŀ + /// Ŀֶӻͬϵͳƹ /// Trial=1, /// - /// Զ + /// ĿԶ /// - Auto = 2, + TrialAuto = 2, + + /// + /// ϵͳԶ + /// + SystemAuto = 3, } \ No newline at end of file