diff --git a/IRaCIS.Core.Application/Service/Visit/DTO/VisitPlanViewModel.cs b/IRaCIS.Core.Application/Service/Visit/DTO/VisitPlanViewModel.cs index 72582e0d..ac2ee53a 100644 --- a/IRaCIS.Core.Application/Service/Visit/DTO/VisitPlanViewModel.cs +++ b/IRaCIS.Core.Application/Service/Visit/DTO/VisitPlanViewModel.cs @@ -23,6 +23,9 @@ namespace IRaCIS.Application.Contracts public class VisitStageDTO : VisitPlanCommand { public DateTime CreateTime { get; set; } + + public bool IsHaveFirstConfirmed { get; set; } + } public class VisitPlanView @@ -60,6 +63,8 @@ namespace IRaCIS.Application.Contracts public int VisitWindowLeft { get; set; } public int VisitWindowRight { get; set; } + + public bool IsDeleted { get; set; } } diff --git a/IRaCIS.Core.Application/Service/Visit/VisitPlanService.cs b/IRaCIS.Core.Application/Service/Visit/VisitPlanService.cs index 6f141e8c..1227e424 100644 --- a/IRaCIS.Core.Application/Service/Visit/VisitPlanService.cs +++ b/IRaCIS.Core.Application/Service/Visit/VisitPlanService.cs @@ -43,7 +43,7 @@ namespace IRaCIS.Application.Services /// 获取项目访视计划 public async Task> GetTrialVisitStageList(VisitPlanQueryDTO param) { - var visitStageQuery = _visitStageRepository.Where(u => u.TrialId == param.TrialId) + var visitStageQuery = _visitStageRepository.AsQueryable(true).Where(u => u.TrialId == param.TrialId) .WhereIf(!string.IsNullOrWhiteSpace(param.Keyword), t => t.VisitName.Contains(param.Keyword)) .ProjectTo(_mapper.ConfigurationProvider); @@ -93,12 +93,12 @@ namespace IRaCIS.Application.Services { DateTime createtime = DateTime.Now; List datas = new List(); - if (!await _repository.Where(t => t.Id == visitPlan.TrialId).IgnoreQueryFilters().AnyAsync(t => t.TrialStatusStr == StaticData.TrialOngoing || t.TrialStatusStr == StaticData.TrialInitializing)) + if (!await _trialRepository.Where(t => t.Id == visitPlan.TrialId).IgnoreQueryFilters().AnyAsync(t => t.TrialStatusStr == StaticData.TrialOngoing || t.TrialStatusStr == StaticData.TrialInitializing)) { return ResponseOutput.NotOk(" only in Initializing or Ongoing State can operate "); } - var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == visitPlan.TrialId) + var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == visitPlan.TrialId,ignoreQueryFilters:true) .Select(t => new { t.Id, t.VisitNum, t.VisitDay }).OrderBy(t => t.VisitNum).ToListAsync(); //更新的时候,需要排除自己 @@ -127,20 +127,20 @@ namespace IRaCIS.Application.Services if (visitPlan.Id == Guid.Empty || visitPlan.Id == null)//add { - if (await _visitStageRepository.AnyAsync(t => t.TrialId == visitPlan.TrialId && (t.VisitName == visitPlan.VisitName || t.VisitNum == visitPlan.VisitNum))) + if (await _visitStageRepository.AnyAsync(t => t.TrialId == visitPlan.TrialId && (t.VisitName == visitPlan.VisitName || t.VisitNum == visitPlan.VisitNum), true)) { return ResponseOutput.NotOk("A visit with the same VisitName/VisitNum already existed in the current visit plan."); } - if (await _visitStageRepository.AnyAsync(t => t.TrialId == visitPlan.TrialId && t.IsBaseLine) && visitPlan.IsBaseLine) + if (await _visitStageRepository.AnyAsync(t => t.TrialId == visitPlan.TrialId && t.IsBaseLine, true) && visitPlan.IsBaseLine) { return ResponseOutput.NotOk("A visit already is baseline in the current visit plan."); } //已添加受试者 都不存在该新增的计划名称 那么该项目所有受试者都增加一个访视记录 - if (!await _repository.AnyAsync(t => t.VisitName == visitPlan.VisitName && t.TrialId == visitPlan.TrialId)) + if (!await _subjectVisitRepository.AnyAsync(t => t.VisitName == visitPlan.VisitName && t.TrialId == visitPlan.TrialId)) { - var subjectSVS = await _repository.Where(t => t.TrialId == visitPlan.TrialId).Select(t => new { t.SubjectId, t.SiteId,t.IsFinalVisit }).Distinct().ToListAsync(); + var subjectSVS = await _subjectVisitRepository.Where(t => t.TrialId == visitPlan.TrialId).Select(t => new { t.SubjectId, t.SiteId,t.IsFinalVisit }).Distinct().ToListAsync(); var subjects = subjectSVS.Select(t => new { t.SubjectId, t.SiteId }).Distinct().ToList(); @@ -198,7 +198,7 @@ namespace IRaCIS.Application.Services visitPlan.Id = result.Id; //更新项目访视计划状态为未确认 - await _repository.UpdateFromQueryAsync(u => u.Id == visitPlan.TrialId, t => new Trial() { VisitPlanConfirmed = false }); + await _trialRepository.UpdateFromQueryAsync(u => u.Id == visitPlan.TrialId, t => new Trial() { VisitPlanConfirmed = false }); await _repository.SaveChangesAsync(); @@ -211,19 +211,19 @@ namespace IRaCIS.Application.Services { - if (await _visitStageRepository.AnyAsync(t => t.TrialId == visitPlan.TrialId && (t.VisitName == visitPlan.VisitName || t.VisitNum == visitPlan.VisitNum) && t.Id != visitPlan.Id)) + if (await _visitStageRepository.AnyAsync(t => t.TrialId == visitPlan.TrialId && (t.VisitName == visitPlan.VisitName || t.VisitNum == visitPlan.VisitNum) && t.Id != visitPlan.Id,true)) { return ResponseOutput.NotOk("A visit with the same VisitName/VisitNum already existed in the current visit plan."); } - if (await _visitStageRepository.AnyAsync(t => t.TrialId == visitPlan.TrialId && t.IsBaseLine && t.Id != visitPlan.Id) && visitPlan.IsBaseLine) + if (await _visitStageRepository.AnyAsync(t => t.TrialId == visitPlan.TrialId && t.IsBaseLine && t.Id != visitPlan.Id,true) && visitPlan.IsBaseLine) { return ResponseOutput.NotOk("A visit already is baseline in the current visit plan."); } - var stage = await _visitStageRepository.FirstOrDefaultAsync(t => t.Id == visitPlan.Id); + var stage = await _visitStageRepository.FirstOrDefaultAsync(t => t.Id == visitPlan.Id,true); if (stage == null) return ResponseOutput.NotOk("None"); //修改是否是基线 @@ -240,7 +240,7 @@ namespace IRaCIS.Application.Services stage.BlindName = "B" + ((int)visitPlan.VisitNum * 10).ToString("D3"); //更新项目访视计划状态为未确认 - await _repository.UpdateFromQueryAsync(u => u.Id == visitPlan.TrialId, t => new Trial() { VisitPlanConfirmed = false }); + //await _trialRepository.UpdateFromQueryAsync(u => u.Id == visitPlan.TrialId, t => new Trial() { VisitPlanConfirmed = false }); await _repository.SaveChangesAsync(); @@ -296,11 +296,8 @@ namespace IRaCIS.Application.Services await _inspectionService.AddListInspectionRecordAsync(datas); await _repository.DeleteFromQueryAsync(t => t.TrialId == visitPlan.TrialId && t.VisitName == visitPlan.VisitName); - - var result = await _visitStageRepository.DeleteFromQueryAsync(u => u.Id == id); - return ResponseOutput.Result(result); } @@ -363,7 +360,7 @@ namespace IRaCIS.Application.Services //访视计划 整体状态变更为 确认 - await _visitStageRepository.UpdateFromQueryAsync(u => u.TrialId == trialId, t => new VisitStage() { IsConfirmed = true }); + await _visitStageRepository.UpdateFromQueryAsync(u => u.TrialId == trialId, t => new VisitStage() { IsConfirmed = true ,IsHaveFirstConfirmed = true}); var stat = new VisitPlanInfluenceStat() { TrialId = trialId }; diff --git a/IRaCIS.Core.Domain/Visit/VisitStage.cs b/IRaCIS.Core.Domain/Visit/VisitStage.cs index d8688cf5..37943243 100644 --- a/IRaCIS.Core.Domain/Visit/VisitStage.cs +++ b/IRaCIS.Core.Domain/Visit/VisitStage.cs @@ -4,7 +4,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace IRaCIS.Core.Domain.Models { [Table("VisitStage")] - public class VisitStage : Entity, IAuditUpdate, IAuditAdd + public class VisitStage : Entity, IAuditUpdate, IAuditAdd,ISoftDelete { public Trial Trial { get; set; } public Guid TrialId { get; set; } @@ -23,7 +23,6 @@ namespace IRaCIS.Core.Domain.Models public bool IsBaseLine { get; set; } = false; - //public string AnonymousVisitName { get; set; } = string.Empty; public int VisitWindowLeft { get; set; } public int VisitWindowRight { get; set; } @@ -33,5 +32,12 @@ namespace IRaCIS.Core.Domain.Models public DateTime CreateTime { get; set; } public Guid UpdateUserId { get; set; } public DateTime UpdateTime { get; set; } + + public bool IsDeleted { get; set; } + public bool IsHaveFirstConfirmed { get; set; } + + + public DateTime? DeletedTime { get; set; } + } } diff --git a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs index cb4c5ae9..812eeefb 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore.ChangeTracking; using System.Reflection; using IRaCIS.Core.Domain.Share; +using Microsoft.EntityFrameworkCore.Infrastructure; using UserTypeGroup = IRaCIS.Core.Domain.Models.UserTypeGroup; namespace IRaCIS.Core.Infra.EFCore @@ -32,7 +33,8 @@ namespace IRaCIS.Core.Infra.EFCore //比数据库上下文构造函数先执行 不能构造函数注入的方式使用配置文件 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { - optionsBuilder.UseLoggerFactory(MyLoggerFactory); + optionsBuilder.UseLoggerFactory(MyLoggerFactory) + .ReplaceService(); //var config = new ConfigurationBuilder() // .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).Build(); @@ -40,10 +42,47 @@ namespace IRaCIS.Core.Infra.EFCore //optionsBuilder.AddInterceptors(new AuditingInterceptor(connectionString)); } + #region IModelCacheKeyFactory + + //public class DynamicModelCacheKeyFactory : IModelCacheKeyFactory + //{ + // public object Create(DbContext context) + // => context is IRaCISDBContext dynamicContext + // ? (context.GetType(), dynamicContext._userInfo.IsEn_Us) + // : (object)context.GetType(); + //} + + public class DynamicModelCacheKeyFactoryDesignTimeSupport : IModelCacheKeyFactory + { + public object Create(DbContext context, bool designTime) + => context is IRaCISDBContext dynamicContext + ? (context.GetType(), dynamicContext._userInfo.IsEn_Us, designTime) + : (object)context.GetType(); + + public object Create(DbContext context) + => Create(context, false); + } + + #endregion + + protected override void OnModelCreating(ModelBuilder modelBuilder) { //modelBuilder.Entity().HasMany(s => s.TrialSiteUserSurveyList).WithOne(sv => sv.TrialSiteSurvey); //modelBuilder.Entity().HasMany(s => s.TrialSiteEquipmentSurveyList).WithOne(sv => sv.TrialSiteSurvey); + //modelBuilder.Entity().Ignore(t => t.MappedValue); + //modelBuilder.Entity().Property(t => t.MappedValue).HasComputedColumnSql(_userInfo.IsEn_Us? "[Value]":"[ValueCN]"); + //modelBuilder.Entity()// .HasQueryFilter(t => t.IsDeleted == false); + + + if (_userInfo.IsEn_Us) + { + modelBuilder.Entity().Property(t => t.MappedValue).HasColumnName( "Value" ); + } + else + { + modelBuilder.Entity().Property(t => t.MappedValue).HasColumnName( "ValueCN"); + } //遍历实体模型手动配置 var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(q => q.GetInterface(typeof(IEntityTypeConfiguration<>).FullName) != null); @@ -56,13 +95,11 @@ namespace IRaCIS.Core.Infra.EFCore base.OnModelCreating(modelBuilder); - //modelBuilder.Entity().Ignore(t => t.MappedValue); - //modelBuilder.Entity().Property(t => t.MappedValue).HasComputedColumnSql(_userInfo.IsEn_Us? "[Value]":"[ValueCN]"); + //modelBuilder.Entity().Property(t => t.MappedValue).HasColumnName(_userInfo.IsEn_Us ? "Value" : "ValueCN").UsePropertyAccessMode(PropertyAccessMode.Property); - //modelBuilder.Entity() - // .HasQueryFilter(t => t.IsDeleted == false); + // 软删除配置 foreach (var entityType in modelBuilder.Model.GetEntityTypes())