diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index d50f73857..892a3ca17 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -388,6 +388,11 @@ 系统模板文档配置表 + + + TrialEmailNoticeConfigService + + 指定资源Id,渲染Dicom检查的Jpeg预览图像 Dicom检查的Id @@ -4896,6 +4901,15 @@ 接口名 + + TrialEmailNoticeConfigView 列表视图模型 + + + TrialEmailNoticeConfigQuery 列表查询参数模型 + + + TrialEmailNoticeConfigAddOrEdit 列表查询参数模型 + SystemAnonymizationView 列表视图模型 @@ -5349,6 +5363,11 @@ IFrontAuditConfigService + + + ITrialEmailNoticeConfigService + + ISystemAnonymizationService diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index 04943044b..ce7df7e00 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -64,8 +64,8 @@ namespace IRaCIS.Core.Application.Service.Allocation public async Task> GetTrialCriterionList(Guid trialId) { - var list= await _repository.Where(t => t.TrialId == trialId && t.IsConfirm).OrderBy(t=>t.ShowOrder) - .Select(t => new TrialReadingCriterionDto() { TrialReadingCriterionId = t.Id, TrialReadingCriterionName = t.CriterionName,CriterionType=t.CriterionType,ReadingType=t.ReadingType }) + var list = await _repository.Where(t => t.TrialId == trialId && t.IsConfirm).OrderBy(t => t.ShowOrder) + .Select(t => new TrialReadingCriterionDto() { TrialReadingCriterionId = t.Id, TrialReadingCriterionName = t.CriterionName, CriterionType = t.CriterionType, ReadingType = t.ReadingType }) .ToListAsync(); if (list.Count == 0) @@ -87,10 +87,10 @@ namespace IRaCIS.Core.Application.Service.Allocation var subjectQuery = _subjectRepository.Where(t => t.TrialId == querySubjectAssign.TrialId && t.SubjectVisitTaskList.Any()) .WhereIf(querySubjectAssign.SiteId != null, t => t.SiteId == querySubjectAssign.SiteId) .WhereIf(querySubjectAssign.SubjectId != null, t => t.Id == querySubjectAssign.SubjectId) - .WhereIf(querySubjectAssign.DoctorUserId != null, t => t.SubjectDoctorList.Any(t=>t.DoctorUserId==querySubjectAssign.DoctorUserId && t.TrialReadingCriterionId==querySubjectAssign.TrialReadingCriterionId)) + .WhereIf(querySubjectAssign.DoctorUserId != null, t => t.SubjectDoctorList.Any(t => t.DoctorUserId == querySubjectAssign.DoctorUserId && t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId)) .WhereIf(!string.IsNullOrEmpty(querySubjectAssign.SubjectCode), t => t.Code.Contains(querySubjectAssign.SubjectCode)) - .ProjectTo(_mapper.ConfigurationProvider,new { trialReadingCriterionId=querySubjectAssign.TrialReadingCriterionId }); + .ProjectTo(_mapper.ConfigurationProvider, new { trialReadingCriterionId = querySubjectAssign.TrialReadingCriterionId }); var pageList = await subjectQuery.ToPagedListAsync(querySubjectAssign.PageIndex, querySubjectAssign.PageSize, string.IsNullOrWhiteSpace(querySubjectAssign.SortField) ? nameof(querySubjectAssign.SubjectId) : querySubjectAssign.SortField, querySubjectAssign.Asc); @@ -177,13 +177,13 @@ namespace IRaCIS.Core.Application.Service.Allocation /// /// /// - public async Task<(List,object)> GetDoctorSubjectStat(Guid trialId, Guid trialReadingCriterionId ) + public async Task<(List, object)> GetDoctorSubjectStat(Guid trialId, Guid trialReadingCriterionId) { var list = await _taskAllocationRuleRepository.Where(t => t.TrialId == trialId) - .Where( t => t.Enroll.EnrollReadingCategoryList.Any(t => t.TrialReadingCriterionId == trialReadingCriterionId)) - .ProjectTo(_mapper.ConfigurationProvider,new { trialReadingCriterionId= trialReadingCriterionId }).ToListAsync(); + .Where(t => t.Enroll.EnrollReadingCategoryList.Any(t => t.TrialReadingCriterionId == trialReadingCriterionId)) + .ProjectTo(_mapper.ConfigurationProvider, new { trialReadingCriterionId = trialReadingCriterionId }).ToListAsync(); - var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == trialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder,x.ReadingType }).FirstOrDefaultAsync()).IfNullThrowException(); + var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == trialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder, x.ReadingType }).FirstOrDefaultAsync()).IfNullThrowException(); return (list, criterionConfig); } @@ -195,13 +195,13 @@ namespace IRaCIS.Core.Application.Service.Allocation /// /// /// - public async Task<(List,object)> GetSubjectAssignedDoctorList(Guid subjectId, Guid trialReadingCriterionId) + public async Task<(List, object)> GetSubjectAssignedDoctorList(Guid subjectId, Guid trialReadingCriterionId) { - var list = await _subjectUserRepository.Where(t => t.SubjectId == subjectId && t.OrignalSubjectUserId == null && t.IsConfirmed && t.TrialReadingCriterionId==trialReadingCriterionId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + var list = await _subjectUserRepository.Where(t => t.SubjectId == subjectId && t.OrignalSubjectUserId == null && t.IsConfirmed && t.TrialReadingCriterionId == trialReadingCriterionId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == trialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder, x.ReadingType }).FirstOrDefaultAsync()).IfNullThrowException(); - return (list, criterionConfig); + return (list, criterionConfig); } @@ -859,7 +859,7 @@ namespace IRaCIS.Core.Application.Service.Allocation //var isReadingTaskViewInOrder = await _trialRepository.Where(x => x.Id == iRUnReadSubjectQuery.TrialId).Select(x => x.IsReadingTaskViewInOrder).FirstOrDefaultAsync(); - var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == iRUnReadSubjectQuery.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder } ).FirstOrDefaultAsync()).IfNullThrowException(); + var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == iRUnReadSubjectQuery.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder }).FirstOrDefaultAsync()).IfNullThrowException(); var readingTool = criterionConfig.ReadingTool; var isReadingTaskViewInOrder = criterionConfig.IsReadingTaskViewInOrder; @@ -1197,7 +1197,7 @@ namespace IRaCIS.Core.Application.Service.Allocation { throw new BusinessValidationFailedException("当前重阅任务状态不为已申请状态,不允许进行处理,请刷新页面"); } - + } private async Task SetMedicalReviewInvalidAsync(List influenceTaskList, bool isPMApply = true) @@ -1266,6 +1266,13 @@ namespace IRaCIS.Core.Application.Service.Allocation var origenalTask = (await _visitTaskRepository.Where(t => item.OriginalReReadingTaskId == t.Id).FirstOrDefaultAsync()).IfNullThrowException(); + + if (origenalTask.TaskState != TaskState.Effect) + { + return ResponseOutput.NotOk("当前申请重阅任务的状态,已被其他任务重阅已影响,不允许对该状态下的任务进行重阅同意与否操作"); + } + + var criterionConfig = await _trialReadingCriterionRepository.Where(x => x.Id == origenalTask.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder }).FirstOrDefaultAsync(); @@ -1498,15 +1505,10 @@ namespace IRaCIS.Core.Application.Service.Allocation RequestReReadingResultEnum = RequestReReadingResult.Agree, }); - await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == origenalTask.SubjectId && - t.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed && - t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId && - t.IsAnalysisCreate == origenalTask.IsAnalysisCreate && - t.VisitTaskNum == origenalTask.VisitTaskNum && - t.Id != origenalTask.Id, u => new VisitTask() - { - ReReadingApplyState = ReReadingApplyState.Agree - }); + await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == origenalTask.Id, u => new VisitTask() + { + ReReadingApplyState = ReReadingApplyState.Agree + }); #endregion @@ -1685,7 +1687,7 @@ namespace IRaCIS.Core.Application.Service.Allocation if (influenceTask.Id == origenalTask.Id) { ReReadingTaskTrackingDeal(influenceTask, agreeReReadingCommand); - + await SetMedicalReviewInvalidAsync(influenceTaskList, false); trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Return }); @@ -1797,7 +1799,7 @@ namespace IRaCIS.Core.Application.Service.Allocation { throw new BusinessValidationFailedException("当前重阅任务状态不为已申请状态,不允许进行处理,请刷新页面"); } - + } } @@ -2169,8 +2171,10 @@ namespace IRaCIS.Core.Application.Service.Allocation /// 申请记录的Id /// [HttpGet("{taskId:guid}/{isReReading:bool}")] - public async Task> GetReReadingOrBackInfluenceTaskList(Guid taskId, bool isReReading, Guid? applyId) + public async Task<(List, object)> GetReReadingOrBackInfluenceTaskList(Guid taskId, bool isReReading, Guid? applyId) { + var isIRAppyTaskInfluenced = false; + var filterObj = (await _visitTaskRepository.FirstOrDefaultNoTrackingAsync(t => t.Id == taskId)).IfNullThrowException(); var trialId = filterObj.TrialId; @@ -2307,6 +2311,12 @@ namespace IRaCIS.Core.Application.Service.Allocation default: throw new BusinessValidationFailedException("不支持重阅的任务类型"); } + + if( await _visitTaskReReadingRepository.AnyAsync(t=>t.RequestReReadingType==RequestReReadingType.DocotorApply && t.RequestReReadingResultEnum==RequestReReadingResult.Default && + t.OriginalReReadingTask.VisitTaskNum >=filterObj.VisitTaskNum &&t.OriginalReReadingTask.SubjectId==filterObj.SubjectId && t.OriginalReReadingTask.TrialReadingCriterionId ==filterObj.TrialReadingCriterionId && t.OriginalReReadingTask.IsAnalysisCreate == filterObj.IsAnalysisCreate)) + { + isIRAppyTaskInfluenced = true; + } } //无序 else @@ -2325,8 +2335,7 @@ namespace IRaCIS.Core.Application.Service.Allocation { throw new BusinessValidationFailedException("当前用户查看列表未定义"); } - - + } @@ -2510,7 +2519,7 @@ namespace IRaCIS.Core.Application.Service.Allocation #endregion - return list; + return (list, new { IsIRAppyTaskInfluenced = isIRAppyTaskInfluenced }); } diff --git a/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs b/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs new file mode 100644 index 000000000..ea4943db0 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs @@ -0,0 +1,85 @@ +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2022-10-20 11:52:31 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- +using System; +using IRaCIS.Core.Domain.Share; +using System.Collections.Generic; +namespace IRaCIS.Core.Application.ViewModel +{ + /// TrialEmailNoticeConfigView 列表视图模型 + public class TrialEmailNoticeConfigView : TrialEmailNoticeConfigAddOrEdit + { + + public Guid UpdateUserId { get; set; } + + public DateTime UpdateTime { get; set; } + + public DateTime CreateTime { get; set; } + + public DateTime CreateUserId { get; set; } + } + + ///TrialEmailNoticeConfigQuery 列表查询参数模型 + public class TrialEmailNoticeConfigQuery + { + public string AuthorizationCode { get; set; } + + public string ReceiveEmail { get; set; } + + public string Code { get; set; } + + public string CopyEmail { get; set; } + + public string FromEmail { get; set; } + + public string FilePath { get; set; } + + public string FileName { get; set; } + + } + + /// TrialEmailNoticeConfigAddOrEdit 列表查询参数模型 + public class TrialEmailNoticeConfigAddOrEdit + { + public Guid? Id { get; set; } + + public int BusinessScenarioEnum { get; set; } + + public string Code { get; set; } + + public Guid TrialId { get; set; } + + public string AuthorizationCode { get; set; } + + + + public List ReceiveEmailList { get; set; } + public List CopyEmailList { get; set; } + + + public string ReceiveEmailsStr { get; set; } + public string CopyEmailsStr { get; set; } + + + public string FromEmail { get; set; } + + public bool IsUrgent { get; set; } + + public bool IsAutoSend { get; set; } + + public bool IsDistinguishCriteria { get; set; } + + public bool IsReturnRequired { get; set; } + + public string FilePath { get; set; } + public string FileName { get; set; } + + + } + + +} + + diff --git a/IRaCIS.Core.Application/Service/Document/Interface/ITrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/Interface/ITrialEmailNoticeConfigService.cs new file mode 100644 index 000000000..7acbf3313 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Document/Interface/ITrialEmailNoticeConfigService.cs @@ -0,0 +1,25 @@ +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2022-10-20 11:52:48 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- + +using IRaCIS.Core.Application.ViewModel; +namespace IRaCIS.Core.Application.Interfaces +{ + /// + /// ITrialEmailNoticeConfigService + /// + public interface ITrialEmailNoticeConfigService + { + + + Task> GetTrialEmailNoticeConfigList(TrialEmailNoticeConfigQuery inQuery); + + Task AddOrUpdateTrialEmailNoticeConfig(TrialEmailNoticeConfigAddOrEdit addOrEditTrialEmailNoticeConfig); + + Task DeleteTrialEmailNoticeConfig(Guid trialEmailNoticeConfigId); + + + } +} diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs new file mode 100644 index 000000000..ac059f141 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -0,0 +1,61 @@ +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2022-10-20 11:52:17 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- + +using IRaCIS.Core.Domain.Models; +using Microsoft.AspNetCore.Mvc; +using IRaCIS.Core.Application.Interfaces; +using IRaCIS.Core.Application.ViewModel; +namespace IRaCIS.Core.Application.Service +{ + /// + /// TrialEmailNoticeConfigService + /// + [ApiExplorerSettings(GroupName = "Test")] + public class TrialEmailNoticeConfigService : BaseService, ITrialEmailNoticeConfigService + { + + private readonly IRepository _trialEmailNoticeConfigRepository; + + public TrialEmailNoticeConfigService(IRepository trialEmailNoticeConfigRepository) + { + _trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository; + } + + + public async Task> GetTrialEmailNoticeConfigList(TrialEmailNoticeConfigQuery inQuery) + { + + + var trialEmailNoticeConfigQueryable = _trialEmailNoticeConfigRepository + .ProjectTo(_mapper.ConfigurationProvider); + + return await trialEmailNoticeConfigQueryable.ToListAsync(); + } + + + public async Task AddOrUpdateTrialEmailNoticeConfig(TrialEmailNoticeConfigAddOrEdit addOrEditTrialEmailNoticeConfig) + { + + addOrEditTrialEmailNoticeConfig.ReceiveEmailsStr = String.Join('|', addOrEditTrialEmailNoticeConfig.ReceiveEmailList); + addOrEditTrialEmailNoticeConfig.CopyEmailsStr = String.Join('|', addOrEditTrialEmailNoticeConfig.CopyEmailList); + + var entity = await _trialEmailNoticeConfigRepository.InsertOrUpdateAsync(addOrEditTrialEmailNoticeConfig, true); + + return ResponseOutput.Ok(entity.Id.ToString()); + + } + + + [HttpDelete("{trialEmailNoticeConfigId:guid}")] + public async Task DeleteTrialEmailNoticeConfig(Guid trialEmailNoticeConfigId) + { + var success = await _trialEmailNoticeConfigRepository.DeleteFromQueryAsync(t => t.Id == trialEmailNoticeConfigId, true); + return ResponseOutput.Ok(); + } + + + } +} diff --git a/IRaCIS.Core.Application/Service/Document/_MapConfig.cs b/IRaCIS.Core.Application/Service/Document/_MapConfig.cs index 12a87216d..035e6b1bb 100644 --- a/IRaCIS.Core.Application/Service/Document/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Document/_MapConfig.cs @@ -2,6 +2,7 @@ using AutoMapper.EquivalencyExpression; using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Contracts; +using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Models; namespace IRaCIS.Core.Application.Service @@ -66,6 +67,10 @@ namespace IRaCIS.Core.Application.Service CreateMap().EqualityComparison((odto, o) => odto == o.NeedConfirmUserTypeId) .ForMember(d => d.NeedConfirmUserTypeId, c => c.MapFrom(t => t)) .ForMember(d => d.SystemDocumentId, c => c.Ignore()); + + + CreateMap(); + } } diff --git a/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs b/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs new file mode 100644 index 000000000..d3c9d4b45 --- /dev/null +++ b/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs @@ -0,0 +1,87 @@ + +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2022-10-20 11:51:58 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +using System; +using IRaCIS.Core.Domain.Share; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Collections.Generic; +using System.Linq; + +namespace IRaCIS.Core.Domain.Models +{ + /// + ///TrialEmailNoticeConfig + /// + [Table("TrialEmailNoticeConfig")] + public class TrialEmailNoticeConfig : Entity, IAuditUpdate, IAuditAdd + { + + [Required] + public Guid TrialId { get; set; } + + [Required] + public string AuthorizationCode { get; set; } = string.Empty; + + + public string ReceiveEmailsStr { get; set; } = string.Empty; + public string CopyEmailsStr { get; set; } = string.Empty; + + + [NotMapped] + public List ReceiveEmailList => ReceiveEmailsStr.Split('|', StringSplitOptions.RemoveEmptyEntries).Select(t=>t.Trim()).ToList(); + + [NotMapped] + public List CopyEmailList => CopyEmailsStr.Split('|', StringSplitOptions.RemoveEmptyEntries).Select(t => t.Trim()).ToList(); + + [Required] + public bool IsUrgent { get; set; } + + + [Required] + public string Code { get; set; } = string.Empty; + + + + [Required] + public bool IsReturnRequired { get; set; } + + [Required] + public string FromEmail { get; set; } + + [Required] + public bool IsAutoSend { get; set; } + + + [Required] + public bool IsDistinguishCriteria { get; set; } + + [Required] + public int BusinessScenarioEnum { get; set; } + + public CriterionType CriterionTypeEnum { get; set; } + + [Required] + public string FilePath { get; set; } = string.Empty; + + [Required] + public string FileName { get; set; } = string.Empty; + + [Required] + public Guid CreateUserId { get; set; } + + [Required] + public DateTime CreateTime { get; set; } + + [Required] + public Guid UpdateUserId { get; set; } + + [Required] + public DateTime UpdateTime { get; set; } + + + } + +} diff --git a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs index d1a8d7a79..16b46f940 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs @@ -663,6 +663,7 @@ namespace IRaCIS.Core.Infra.EFCore public virtual DbSet SubjectCanceDoctor { get; set; } + public virtual DbSet TrialEmailNoticeConfig { get; set; } diff --git a/IRaCIS.Core.Test/DbHelper.ttinclude b/IRaCIS.Core.Test/DbHelper.ttinclude index 5c66ebf5c..050d882f1 100644 --- a/IRaCIS.Core.Test/DbHelper.ttinclude +++ b/IRaCIS.Core.Test/DbHelper.ttinclude @@ -4,7 +4,7 @@ public static readonly string ConnectionString = "Server=123.56.94.154,1433\\MSSQLSERVER;Database=IRaCIS_New_Tet;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true"; public static readonly string DbDatabase = "IRaCIS_New_Tet"; //ַ,ƴ - public static readonly string TableName = "TrialConfigDictionary"; + public static readonly string TableName = "TrialEmailNoticeConfig"; //ļ service Ƿҳ } #> diff --git a/IRaCIS.Core.Test/IRaCIS.Core.Test.csproj b/IRaCIS.Core.Test/IRaCIS.Core.Test.csproj index af84782b3..5f49abc87 100644 --- a/IRaCIS.Core.Test/IRaCIS.Core.Test.csproj +++ b/IRaCIS.Core.Test/IRaCIS.Core.Test.csproj @@ -109,6 +109,7 @@ +