irc-netcore-api/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs

4036 lines
161 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.Extention;
using MassTransit;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.ChangeTracking.Internal;
using Newtonsoft.Json;
namespace IRaCIS.Core.Infra.EFCore.Common
{
public interface IAuditingData
{
Task InsertAddEntitys(List<EntityEntry> entitys);
}
public static class AuditOpt
{
public static readonly string Add = "Add";
public static readonly string Update = "Update";
public static readonly string Deleted = "Deleted";
}
/// <summary>
/// 添加稽查稽查数据
/// </summary>
public class AuditingData : IAuditingData
{
/// <summary>
/// 数据库对象o
/// </summary>
public IRaCISDBContext _dbContext { get; set; }
/// <summary>
/// 用户信息
/// </summary>
public IUserInfo _userInfo { get; set; }
/// <summary>
/// 构造方法
/// </summary>
/// <param name="dbContext"></param>
/// <param name="userInfo"></param>
public AuditingData(IRaCISDBContext dbContext, IUserInfo userInfo)
{
_dbContext = dbContext;
_userInfo = userInfo;
_userInfo.BatchId = _userInfo.BatchId == null ? NewId.NextGuid() : _userInfo.BatchId;
}
/// <summary>
/// 特殊删除
/// </summary>
private List<Type> NodeleteTableTypes
{
get
{
return new List<Type>()
{
typeof(TrialUserRole),
typeof(TrialIdentityUser),
typeof(TrialSiteSurvey),
typeof(TrialSiteUserRole),
typeof(VisitStage),
typeof(TrialSite)
};
}
}
// 修改为删除
private List<Type> UpdateIsDelete
{
get
{
return new List<Type>()
{
typeof(TrialDocument)
};
}
}
public string GetEntityAuditOpt(EntityEntry entityEntry)
{
if (entityEntry.State == EntityState.Added)
{
return AuditOpt.Add;
}
else if (
UpdateIsDelete.Contains(entityEntry.Entity.GetType())
&& entityEntry.State == EntityState.Modified
&& (bool)entityEntry.Entity.GetType().GetProperty(nameof(ISoftDelete.IsDeleted)).GetValue(entityEntry.Entity)
)
{
return AuditOpt.Deleted;
}
else if (entityEntry.State == EntityState.Deleted ||
(entityEntry.State == EntityState.Modified
&& typeof(ISoftDelete).IsAssignableFrom(entityEntry.Entity.GetType())
&& (bool)entityEntry.Entity.GetType().GetProperty(nameof(ISoftDelete.IsDeleted)).GetValue(entityEntry.Entity)
&& entityEntry.State == EntityState.Modified
&& !NodeleteTableTypes.Contains(entityEntry.Entity.GetType())
)
)
{
return AuditOpt.Deleted;
}
else
{
return AuditOpt.Update;
}
}
/// <summary>
/// 插入Add的实体
/// </summary>
/// <param name="entitys"></param>
public async Task InsertAddEntitys(List<EntityEntry> entitys)
{
// 项目
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(Trial)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as Trial;
var extraIdentification = string.Empty;
//阅片标准
var criterionNameList = await _dbContext.ReadingQuestionCriterionTrial.Where(t => t.TrialId == entity.Id && t.IsConfirm).OrderBy(t => t.ShowOrder).Select(t => t.CriterionName).ToListAsync();
var memoryCriterionNameList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingQuestionCriterionTrial)).Select(t => t.Entity as ReadingQuestionCriterionTrial)
.Where(t => t.TrialId == entity.Id && t.IsConfirm).OrderBy(t => t.ShowOrder).Select(t => t.CriterionName).ToList();
//临床数据配置
var clinicalDataSetNameList = await _dbContext.ClinicalDataTrialSet.Where(t => t.TrialId == entity.Id && t.IsConfirm).Select(t => _userInfo.IsEn_Us ? t.ClinicalDataSetEnName : t.ClinicalDataSetName).ToListAsync();
var memoryClinicalDataSetNameList = entitys.Where(x => x.Entity.GetType() == typeof(ClinicalDataTrialSet)).Select(t => t.Entity as ClinicalDataTrialSet)
.Where(t => t.TrialId == entity.Id && t.IsConfirm).Select(t => _userInfo.IsEn_Us ? t.ClinicalDataSetEnName : t.ClinicalDataSetName).ToList();
Guid id = entity.Id;
var oldentity = await _dbContext.Trial.Where(x => x.Id == id).Select(t => new
{
t.IsTrialBasicLogicConfirmed,
t.IsTrialProcessConfirmed,
t.IsTrialUrgentConfirmed,
t.IsConfigureEmail,
t.IsTrialPACSConfirmed,
}).FirstOrDefaultAsync();
switch (_userInfo.RequestUrl)
{
case "configTrialBasicInfo/ConfigTrialBasicInfoConfirm":
extraIdentification = $"/{oldentity.IsTrialBasicLogicConfirmed.ToString()}";
break;
case "configTrialBasicInfo/ConfigTrialProcessInfoConfirm":
extraIdentification = $"/{oldentity.IsTrialProcessConfirmed.ToString()}";
break;
case "configTrialBasicInfo/ConfigTrialUrgentInfoConfirm":
extraIdentification = $"/{oldentity.IsTrialUrgentConfirmed.ToString()}";
break;
case "configTrialBasicInfo/ConfigTrialPACSInfoConfirm":
extraIdentification = $"/{oldentity.IsTrialPACSConfirmed.ToString()}";
break;
case "TrialEmailNoticeConfig/setTrialEmail":
extraIdentification = oldentity.IsConfigureEmail ? "/EmailUpdate" : "/EmailSave";
break;
}
await InsertInspection<Trial>(item.Entity as Trial, type, x => new InspectionConvertDTO()
{
TrialId = x.Id,
ExtraIndentification = extraIdentification,
}, new
{
//TrialDicList = string.Join(",", trialDics)
ImageFormatListStr = string.Join("|", entity.ImageFormatList),
StudyNamesStr = string.Join("|", entity.StudyNameList.Where(x => x.IsChoose).Select(x=>_userInfo.IsEn_Us?x.EnName:x.Name )),
CriterionNames = string.Join(",", criterionNameList.Union(memoryCriterionNameList).Distinct()),
ClinicalDataSetNames = string.Join(",", clinicalDataSetNameList.Union(memoryClinicalDataSetNameList).Distinct().OrderBy(t => t)),
}); ;
}
#region 已修改
#region 阅片单元配置
//系统阅片标准
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingQuestionCriterionSystem)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingQuestionCriterionSystem;
var extraIdentification = string.Empty;
if (_dbContext.Entry(entity).Property(t => t.IsMustGlobalReading).IsModified == true)
{
extraIdentification = $"/IsGlobalReading";
}
if (_dbContext.Entry(entity).Property(t => t.IsOncologyReading).IsModified == true)
{
extraIdentification = $"/IsOncologyReading";
}
await InsertInspection<ReadingQuestionCriterionSystem>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = /*type == AuditOpt.Update ? true :*/ false,
ExtraIndentification = extraIdentification
});
}
//项目阅片标准
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingQuestionCriterionTrial)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingQuestionCriterionTrial;
var isDistinctionInterface = false;
//设置项目配置 肿瘤学配置 和阅片标准配置
if (_userInfo.RequestUrl == "TrialConfig/setOncologySet"
//现在废弃 没用
|| _userInfo.RequestUrl == "TrialConfig/setTrialReadingCriterion"
//项目流程确认
|| _userInfo.RequestUrl == "configTrialBasicInfo/ConfigTrialProcessInfoConfirm"
//确认医学审核问题
|| _userInfo.RequestUrl == "ReadingMedicineQuestion/ConfirmReadingMedicineQuestion"
//阅片单元 保存阅片规则
|| _userInfo.RequestUrl == "TrialConfig/setCriterionReadingInfo"
|| _userInfo.RequestUrl == "configTrialBasicInfo/TrialReadingInfoSign")
{
isDistinctionInterface = true;
}
//同步的数据 后面加"/Auto" 因为同步的地方可能会改 所以取反
var extraIdentification = string.Empty;
if (_userInfo.RequestUrl != "ReadingQuestion/addOrUpdateReadingQuestionCriterionTrial" && type == AuditOpt.Add)
{
extraIdentification = "/Auto";
}
//保存肿瘤学配置哪里 强行要将 评估结果(中间字典表的多条数据)存到标准稽查上
var dicIdList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingSystemCriterionDictionary)).Select(t => t.Entity as ReadingSystemCriterionDictionary).Where(t => t.CriterionId == entity.Id).Select(t => t.DictionaryId).ToList();
var dicValueList = new List<string>();
if (dicIdList.Count() == 0)
{
dicValueList = await _dbContext.ReadingSystemCriterionDictionary.Where(t => t.CriterionId == entity.Id).Select(t => t.Dictionary.Value).ToListAsync();
}
else
{
dicValueList = await _dbContext.Dictionary.Where(t => dicIdList.Contains(t.Id)).Select(t => t.Value).ToListAsync();
}
// 附加评估
var addtionalAssesementList = await _dbContext.TrialCriterionAdditionalAssessmentType.Where(t => t.TrialReadingCriterionId == entity.Id && t.IsSelected != null)
.Select(t => new { t.AdditionalAssessmentType, t.IsSelected }).ToListAsync();
var oncologyAssessIdsStr = string.Empty;
var allList = new List<ReadingTrialCriterionDictionary>();
if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingTrialCriterionDictionary)))
{
allList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTrialCriterionDictionary))
.Select(t => t.Entity as ReadingTrialCriterionDictionary).ToList().Where(x =>
x.CriterionId == entity.Id &&
x.ParentCode == ReadingCommon.CriterionDictionary.OncologyAssess).ToList();
}
else
{
allList = await _dbContext.ReadingTrialCriterionDictionary.Where(x =>
x.CriterionId == entity.Id &&
x.ParentCode == ReadingCommon.CriterionDictionary.OncologyAssess).ToListAsync();
}
//查询出字典的Value ValueCN Des 保存
var diclistOncologyAssess = allList.Select(t => t.DictionaryId).ToList();
var selectList = await _dbContext.Dictionary.Where(x => diclistOncologyAssess.Contains(x.Id)).Select(t => t.ValueCN).ToListAsync();
oncologyAssessIdsStr = string.Join(",", selectList);
await InsertInspection<ReadingQuestionCriterionTrial>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = isDistinctionInterface,
TrialReadingCriterionId = entity.Id,
ObjectRelationParentId = x.TrialId,
ExtraIndentification = extraIdentification
}, new
{
OncologyAssessIdsStr = oncologyAssessIdsStr,
EvaluationResultTypes = dicValueList.Count > 0 ? string.Join(",", dicValueList) : string.Empty,
AdditionalAssessmentTypeList = addtionalAssesementList
});
}
// PACS直连
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialSiteDicomAE)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialSiteDicomAE;
await InsertInspection<TrialSiteDicomAE>(entity, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = entity.TrialSiteId,
});
}
// PACS直连
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialDicomAE)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialDicomAE;
await InsertInspection<TrialDicomAE>(entity, type, x => new InspectionConvertDTO()
{
});
}
//系统标准问题
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingQuestionSystem)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingQuestionSystem;
int? parentQuestionShowOrder = null;
int? relavantQuestionShowOrder = null;
if (entity.ParentId != null)
{
parentQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.ParentId).Select(t => t.ShowOrder).FirstOrDefaultAsync();
}
if (entity.RelevanceId != null)
{
relavantQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.RelevanceId).Select(t => t.ShowOrder).FirstOrDefaultAsync();
}
await InsertInspection<ReadingQuestionSystem>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false
}, new { ParentQuestionShowOrder = parentQuestionShowOrder, RelavantQuestionShowOrder = relavantQuestionShowOrder });
}
//项目标准问题
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingQuestionTrial)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingQuestionTrial;
var isDistinctionInterface = false;
var extraIdentification = string.Empty;
//同步的数据 后面加"/Auto" 因为同步的地方可能会改 所以取反
if (_userInfo.RequestUrl != "ReadingQuestion/addOrUpdateReadingQuestionTrial" && type == AuditOpt.Add)
{
extraIdentification = "/Auto";
}
//重置仲裁规则
var cloneEntity = entity.Clone();
if (_userInfo.RequestUrl == "ReadingImageTask/setTrialCriterionJudgeQuestionAnswerGroup")
{
isDistinctionInterface = true;
if (entity.JudgeType == JudgeTypeEnum.None)
{
extraIdentification = "/Reset";
}
//翻译 可能自己填写的 也有可能是从字典中获取的
if (entity.QuestionGenre == TableQuestionType.Dictionary && !string.IsNullOrWhiteSpace(entity.DictionaryCode))
{
var translateList = _dbContext.Dictionary.Where(t => t.Code == entity.DictionaryCode.Trim()).SelectMany(t => t.ChildList).Select(t => new { t.Code, t.Value, t.ValueCN }).ToList();
foreach (var translateItem in translateList)
{
cloneEntity.AnswerCombination = cloneEntity.AnswerCombination.Replace($"\"{translateItem.Code}\"", $"\"{translateItem.Value}\"");
cloneEntity.AnswerGroup = cloneEntity.AnswerGroup.Replace($"|{translateItem.Code}|", $"|{translateItem.Value}|");
}
}
}
int? parentQuestionShowOrder = null;
int? relavantQuestionShowOrder = null;
if (entity.ParentId != null)
{
parentQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.ParentId).Select(t => t.ShowOrder).FirstOrDefaultAsync();
}
if (entity.RelevanceId != null)
{
relavantQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.RelevanceId).Select(t => t.ShowOrder).FirstOrDefaultAsync();
}
await InsertInspection<ReadingQuestionTrial>(cloneEntity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = isDistinctionInterface,
TrialReadingCriterionId = entity.ReadingQuestionCriterionTrialId,
ObjectRelationParentId = x.TrialId,
ExtraIndentification = extraIdentification
}, new { ParentQuestionShowOrder = parentQuestionShowOrder, RelavantQuestionShowOrder = relavantQuestionShowOrder });
}
//系统标准表格问题
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionSystem)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingTableQuestionSystem;
int? dependQuestionShowOrder = null;
int? parentQuestionShowOrder = null;
int? relavantQuestionShowOrder = null;
if (entity.ParentId != null)
{
parentQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.ParentId).Select(t => t.ShowOrder).FirstOrDefaultAsync();
}
if (entity.RelevanceId != null)
{
relavantQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.RelevanceId).Select(t => t.ShowOrder).FirstOrDefaultAsync();
}
if (entity.DependParentId != null)
{
dependQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.DependParentId).Select(t => t.ShowOrder).FirstOrDefaultAsync();
}
await InsertInspection<ReadingTableQuestionSystem>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false
}, new { ParentQuestionShowOrder = parentQuestionShowOrder, RelavantQuestionShowOrder = relavantQuestionShowOrder, DependQuestionShowOrder = dependQuestionShowOrder });
}
//项目标准表格问题
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionTrial)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingTableQuestionTrial;
//同步的数据 后面加"/Auto" 因为同步的地方可能会改 所以取反
var extraIdentification = string.Empty;
if (_userInfo.RequestUrl != "ReadingQuestion/addOrUpdateReadingTableQuestionTrial" && type == AuditOpt.Add)
{
extraIdentification = "/Auto";
}
int? dependQuestionShowOrder = null;
int? parentQuestionShowOrder = null;
int? relavantQuestionShowOrder = null;
if (entity.ParentId != null)
{
parentQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.ParentId).Select(t => t.ShowOrder).FirstOrDefaultAsync();
}
if (entity.RelevanceId != null)
{
relavantQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.RelevanceId).Select(t => t.ShowOrder).FirstOrDefaultAsync();
}
if (entity.DependParentId != null)
{
dependQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.DependParentId).Select(t => t.ShowOrder).FirstOrDefaultAsync();
}
await InsertInspection<ReadingTableQuestionTrial>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
TrialId = x.TrialId,
TrialReadingCriterionId = entity.TrialCriterionId,
ObjectRelationParentId = x.TrialId,
ExtraIndentification = extraIdentification
}, new { ParentQuestionShowOrder = parentQuestionShowOrder, RelavantQuestionShowOrder = relavantQuestionShowOrder, DependQuestionShowOrder = dependQuestionShowOrder });
}
//系统器官
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(OrganInfo)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as OrganInfo;
await InsertInspection<OrganInfo>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ObjectRelationParentId = entity.SystemCriterionId
});
}
//项目器官
if (entitys.Any(x => x.Entity.GetType() == typeof(OrganTrialInfo)))
{
var organTrialEntityEnrtyList = entitys.Where(x => x.Entity.GetType() == typeof(OrganTrialInfo));
var extraIdentification = string.Empty;
//同步添加
if (_userInfo.RequestUrl != "OrganInfo/batchAddTrialOrgan" && organTrialEntityEnrtyList.Any(t => GetEntityAuditOpt(t) == AuditOpt.Add))
{
extraIdentification = "/Auto";
var list = organTrialEntityEnrtyList.Select(t => t.Entity as OrganTrialInfo);
var organIdList = list.Select(t => t.OrganInfoId).ToList();
var organList = await _dbContext.OrganInfo.Where(x => organIdList.Contains(x.Id)).ToListAsync();
var firstEntity = list.FirstOrDefault();
var cloneEntity = firstEntity.Clone();
//保证Id 唯一
cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.TrialId.ToString(), firstEntity.TrialCriterionId.ToString());
await InsertInspection<OrganTrialInfo>(cloneEntity, AuditOpt.Add, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
TrialReadingCriterionId = cloneEntity.TrialCriterionId,
ObjectRelationParentId = cloneEntity.TrialCriterionId,
ObjectRelationParentId2 = cloneEntity.OrganInfoId,
ExtraIndentification = extraIdentification
}, new
{
QuestionAnswerList = list.Join(organList, t => t.OrganInfoId, u => u.Id, (t, u) => u).OrderBy(t => t.ShowOrder).ToList(),
});
}
else
{
//手动操作
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(OrganTrialInfo)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as OrganTrialInfo;
await InsertInspection<OrganTrialInfo>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
TrialReadingCriterionId = entity.TrialCriterionId,
ObjectRelationParentId = entity.TrialCriterionId,
ObjectRelationParentId2 = entity.OrganInfoId,
ExtraIndentification = extraIdentification
});
}
}
}
// 项目 系统公用表
//病灶管理 区分项目 还是系统的
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(CriterionNidusSystem)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as CriterionNidusSystem;
await InsertInspection<CriterionNidusSystem>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ObjectRelationParentId = entity.CriterionId,
});
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(CriterionNidusTrial)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as CriterionNidusTrial;
var extraIdentification = string.Empty;
if (_userInfo.RequestUrl != "OrganInfo/addOrUpdateCriterionNidus" && type == AuditOpt.Add)
{
extraIdentification = "/Auto";
}
await InsertInspection<CriterionNidusTrial>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ObjectRelationParentId = entity.CriterionId,
TrialReadingCriterionId = entity.CriterionId,
ExtraIndentification = extraIdentification
});
}
//疗效评估
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TumorAssessment_RECIST1Point1)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TumorAssessment_RECIST1Point1;
await InsertInspection<TumorAssessment_RECIST1Point1>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
//ObjectRelationParentId = entity.CriterionId
});
}
// 项目 系统公用表
//配置标准 病灶类型 自动计算标识 "LesionType", "QuestionType"
if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingSystemCriterionDictionary)))
{
var type = AuditOpt.Add;
var allList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingSystemCriterionDictionary)).Select(t => t.Entity as ReadingSystemCriterionDictionary).ToList();
//查询出字典的Value ValueCN Des 保存
var dicIdList = allList.Select(t => t.DictionaryId).ToList();
var selectList = await _dbContext.Dictionary.Where(x => dicIdList.Contains(x.Id)).Select(t => new { t.Id, t.Value, t.ValueCN, t.Description, t.ShowOrder }).ToListAsync();
foreach (var list in allList.GroupBy(t => t.ParentCode))
{
var firstEntity = list.First();
var cloneEntity = list.First().Clone();
//保证Id 唯一
cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.CriterionId.ToString(), firstEntity.ParentCode.ToString());
var extraIdentification = string.Empty;
extraIdentification = $"/{cloneEntity.ParentCode}";
await InsertInspection<ReadingSystemCriterionDictionary>(cloneEntity, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = x.CriterionId,
TrialReadingCriterionId = x.IsSystemCriterion == false ? x.CriterionId : null,
//不显示区分接口 通过是否是系统字典 以及字典Code 区分
IsDistinctionInterface = false,
ExtraIndentification = extraIdentification
},
new
{
SelectList = selectList.Join(list, t => t.Id, u => u.DictionaryId, (t, u) =>
new
{
Value = t.Value,
t.ValueCN,
t.Description,
t.ShowOrder,
u.IsBaseLineUse,
u.IsFollowVisitUse
}
).OrderBy(t => t.ShowOrder).ToList()
});
}
}
if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingTrialCriterionDictionary)))
{
var type = AuditOpt.Add;
var allList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTrialCriterionDictionary)).Select(t => t.Entity as ReadingTrialCriterionDictionary).ToList();
//查询出字典的Value ValueCN Des 保存
var dicIdList = allList.Select(t => t.DictionaryId).ToList();
var selectList = await _dbContext.Dictionary.Where(x => dicIdList.Contains(x.Id)).Select(t => new
{
t.Id,
Value = _userInfo.IsEn_Us ? t.Value : t.ValueCN,
t.ValueCN,
t.Description,
t.ShowOrder
}).ToListAsync();
foreach (var list in allList.GroupBy(t => t.ParentCode))
{
var firstEntity = list.First();
var cloneEntity = list.First().Clone();
//保证Id 唯一
cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.CriterionId.ToString(), firstEntity.ParentCode.ToString());
var extraIdentification = string.Empty;
extraIdentification = $"/{cloneEntity.ParentCode}/IsTrial";
await InsertInspection<ReadingTrialCriterionDictionary>(cloneEntity, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = x.CriterionId,
TrialReadingCriterionId = x.CriterionId,
//不显示区分接口 通过是否是系统字典 以及字典Code 区分
IsDistinctionInterface = false,
ExtraIndentification = extraIdentification
},
new
{
SelectList = selectList.Join(list, t => t.Id, u => u.DictionaryId, (t, u) =>
new
{
Value = _userInfo.IsEn_Us ? t.Value : t.ValueCN,
t.ValueCN,
t.Description,
t.ShowOrder,
u.IsBaseLineUse,
u.IsFollowVisitUse
}
).OrderBy(t => t.ShowOrder).ToList()
});
}
}
#endregion
#region 文档相关
// 系统文件签署 父层级未记录稽查(系统文档初始数据)
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SystemDocConfirmedIdentityUser)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as SystemDocConfirmedIdentityUser;
var extraIdentification = string.Empty;
if (type == AuditOpt.Update)
{
if (entity.IsDeleted == true)
{
extraIdentification = "/" + 2;
}
else
{
extraIdentification = "/" + 1;
}
}
var systemDocument = await _dbContext.SystemDocument.Where(x => x.Id == entity.SystemDocumentId).FirstOrDefaultAsync();
await InsertInspection<SystemDocConfirmedIdentityUser>(entity, type, x => new InspectionConvertDTO()
{
GeneralId = x.Id,
ExtraIndentification = extraIdentification,
ObjectRelationParentId = x.SystemDocumentId
}, new
{
FileTypeId = systemDocument.FileTypeId,
Name = systemDocument.Name,
UploadTime = systemDocument.CreateTime,
CreateUserName = _userInfo.UserName,
UserType = _userInfo.UserTypeShortName,
IsSigned = entity.ConfirmTime != null, // 是否签署 添加了就是签署了
});
}
// 项目文件签署
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialDocConfirmedIdentityUser)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialDocConfirmedIdentityUser;
var extraIdentification = string.Empty;
if (type == AuditOpt.Update)
{
if (entity.IsDeleted == true)
{
extraIdentification = "/" + 2;
}
else
{
extraIdentification = "/" + 1;
}
}
var trialDoc = await _dbContext.TrialDocument.Where(x => x.Id == entity.TrialDocumentId).FirstOrDefaultAsync();
await InsertInspection<TrialDocConfirmedIdentityUser>(entity as TrialDocConfirmedIdentityUser, type, x => new InspectionConvertDTO()
{
TrialId = trialDoc.TrialId,
ExtraIndentification = extraIdentification,
ObjectRelationParentId = x.TrialDocumentId
}, new
{
UploadTime = trialDoc.CreateTime,
CreateUserName = _userInfo.UserName,
UserType = _userInfo.UserTypeShortName,
IsSigned = entity.ConfirmTime != null
});
}
//系统文件
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SystemDocument)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as SystemDocument;
List<Guid> needConfirmedUserTypeIdList = new List<Guid>();
if (entity.NeedConfirmedUserTypeList == null)
{
needConfirmedUserTypeIdList = await _dbContext.SystemDocNeedConfirmedUserType.Where(x => x.SystemDocumentId == entity.Id).Select(t => t.NeedConfirmUserTypeId).ToListAsync();
}
else
{
needConfirmedUserTypeIdList = entity.NeedConfirmedUserTypeList.Select(t => t.NeedConfirmUserTypeId).ToList();
}
var userTypeNameList = await _dbContext.UserType.Where(x => needConfirmedUserTypeIdList.Contains(x.Id)).Select(x => x.UserTypeShortName).ToListAsync();
var userTypeName = string.Join(",", userTypeNameList);
await InsertInspection<SystemDocument>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false
}, new
{
NeedConfirmedUserType = userTypeName,
});
}
// 项目文档
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialDocument)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialDocument;
List<Guid> needConfirmedUserTypeIdList = new List<Guid>();
if (entity.NeedConfirmedUserTypeList == null)
{
needConfirmedUserTypeIdList = await _dbContext.TrialDocNeedConfirmedUserType.Where(x => x.TrialDocumentId == entity.Id).Select(t => t.NeedConfirmUserTypeId).ToListAsync();
}
else
{
needConfirmedUserTypeIdList = entity.NeedConfirmedUserTypeList.Select(t => t.NeedConfirmUserTypeId).ToList();
}
var usertypeNames = await _dbContext.UserType.Where(x => needConfirmedUserTypeIdList.Contains(x.Id)).Select(x => x.UserTypeShortName).ToListAsync();
var usertypeName = string.Join(",", usertypeNames);
await InsertInspection<TrialDocument>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ObjectRelationParentId = x.TrialId
},
new
{
NeedConfirmedUserType = usertypeName,
});
}
//项目标准自动发送邮件配置
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialEmailNoticeConfig)))
{
var type = GetEntityAuditOpt(item);
var extraIdentification = string.Empty;
var entity = item.Entity as TrialEmailNoticeConfig;
//找到配置的用户
var configUserTypeList = entitys.Where(x => x.Entity.GetType() == typeof(TrialEmailNoticeUser)).Select(t => t.Entity as TrialEmailNoticeUser)
.Where(t => t.TrialEmailNoticeConfigId == entity.Id).Select(t =>
new { t.TrialEmailNoticeConfigId, t.EmailUserType, t.UserType }).ToList();
await InsertInspection<TrialEmailNoticeConfig>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ObjectRelationParentId = x.TrialReadingCriterionId,
ExtraIndentification = extraIdentification
},
new
{
ToUserTypes = configUserTypeList.Where(t => t.EmailUserType == EmailUserType.To).Select(t => t.UserType).ToList(),
CopyUserTypes = configUserTypeList.Where(t => t.EmailUserType == EmailUserType.Copy).Select(t => t.UserType).ToList(),
});
}
#endregion
#region 热键 模板 个性化配置
if (entitys.Any(x => x.Entity.GetType() == typeof(ShortcutKey)))
{
var type = AuditOpt.Add;
var list = entitys.Where(x => x.Entity.GetType() == typeof(ShortcutKey)).Select(t => t.Entity as ShortcutKey);
var firstEntity = list.FirstOrDefault();
var cloneEntity = firstEntity.Clone();
//保证Id 唯一
cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.UserId.ToString(), firstEntity.CreateUserId.ToString());
await InsertInspection(cloneEntity, type, x => new InspectionConvertDTO()
{
//byzhouhang
ObjectRelationParentId = x.UserId,
IsDistinctionInterface = false,
}, new
{
ShortcutKeyList = list,
});
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(UserWLTemplate)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as UserWLTemplate;
var extraIdentification = string.Empty;
await InsertInspection<UserWLTemplate>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ObjectRelationParentId = entity.UserId
});
}
#endregion
#region 附加评估
// 是否参与附加评估记录表
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectCriteriaEvaluation)))
{
var type = GetEntityAuditOpt(item);
//var extraIdentification = string.Empty;
var entity = item.Entity as SubjectCriteriaEvaluation;
await InsertInspection<SubjectCriteriaEvaluation>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ObjectRelationParentId = x.SubjectId,
ObjectRelationParentId2 = x.TrialReadingCriterionId,
TrialReadingCriterionId = x.TrialReadingCriterionId,
});
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectCriteriaEvaluationVisitFilter)))
{
var type = GetEntityAuditOpt(item);
var extraIdentification = string.Empty;
var entity = item.Entity as SubjectCriteriaEvaluationVisitFilter;
if (type == AuditOpt.Add)
{
if (entity.IsGeneratedTask)
{
extraIdentification = "/AutoGenerate";
}
else
{
extraIdentification = "/Add";
}
}
if (type == AuditOpt.Update)
{
//手动生成任务
if (entity.IsGeneratedTask)
{
//Update
extraIdentification = "/ManualGenerate";
}
//回退接口
else if (_userInfo.RequestUrl == "SubjectCriteriaEvaluation/confirmBackCriteriaVisitTask")
{
extraIdentification = "/Back";
}
else
{
//筛选影像保存接口
//if (_userInfo.RequestUrl == "SubjectCriteriaEvaluation/batchAddSubjectCriteriaEvaluationVisitStudyFilter")
//{
extraIdentification = "/Update";
//}
}
}
await InsertInspection<SubjectCriteriaEvaluationVisitFilter>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
IsSelfDefine = true,
ExtraIndentification = extraIdentification,
ObjectRelationParentId = x.SubjectVisitId,
ObjectRelationParentId2 = x.TrialReadingCriterionId,
TrialReadingCriterionId = x.TrialReadingCriterionId,
});
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectCriteriaEvaluationVisitStudyFilter)))
{
var type = GetEntityAuditOpt(item);
var extraIdentification = string.Empty;
var entity = item.Entity as SubjectCriteriaEvaluationVisitStudyFilter;
if (entity.IsConfirmed == true)
{
extraIdentification = "/Confirm";
}
else
{
extraIdentification = "/Save";
}
await InsertInspection<SubjectCriteriaEvaluationVisitStudyFilter>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
IsSelfDefine = true,
ExtraIndentification = extraIdentification,
ObjectRelationParentId = x.StudyId,
ObjectRelationParentId2 = x.SeriesId,//序列有的稽查没有记录所以StudyId放前面
ObjectRelationParentId3 = x.TrialReadingCriterionId,
TrialReadingCriterionId = x.TrialReadingCriterionId,
});
}
#endregion
#region 医学审核
//医学审核 问题答案
if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingMedicineQuestionAnswer)))
{
var type = AuditOpt.Add;
var list = entitys.Where(x => x.Entity.GetType() == typeof(ReadingMedicineQuestionAnswer)).Select(t => t.Entity as ReadingMedicineQuestionAnswer);
var questionIdList = list.Select(t => t.ReadingMedicineQuestionId).ToList();
var questionNameList = await _dbContext.ReadingMedicineTrialQuestion.Where(x => questionIdList.Contains(x.Id)).Select(t => new { t.QuestionName, ReadingMedicineQuestionId = t.Id, t.ShowOrder }).ToListAsync();
var firstEntity = list.FirstOrDefault();
var cloneEntity = firstEntity.Clone();
//保证Id 唯一
cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.VisitTaskId.ToString(), firstEntity.TaskMedicalReviewId.ToString());
await InsertInspection(cloneEntity, type, x => new InspectionConvertDTO()
{
VisitTaskId = x.VisitTaskId,
//byzhouhang
ObjectRelationParentId = x.TaskMedicalReviewId,
IsDistinctionInterface = false,
}, new
{
QuestionAnswerList = list.Join(questionNameList, t => t.ReadingMedicineQuestionId, u => u.ReadingMedicineQuestionId, (t, u) => new { t.Answer, u.QuestionName, u.ShowOrder }).OrderBy(t => t.ShowOrder).ToList(),
});
}
//医学审核对话
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingMedicalReviewDialog)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingMedicalReviewDialog;
var extraIdentification = string.Empty;
//失效的时候 不区分标识
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.MIM)
{
extraIdentification = $"/MIM";
}
else
{
extraIdentification = $"/IR";
}
await InsertInspection<ReadingMedicalReviewDialog>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
VisitTaskId = entity.VisitTaskId,
ObjectRelationParentId = entity.TaskMedicalReviewId,
ExtraIndentification = extraIdentification
});
}
//医学审核
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TaskMedicalReview)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TaskMedicalReview;
var extraIdentification = string.Empty;
//失效的时候 不区分标识
if (_dbContext.Entry(entity).Property(t => t.IsInvalid).IsModified == true && entity.IsInvalid == true)
{
extraIdentification = $"/Invalid";
}
await InsertInspection<TaskMedicalReview>(entity, type, x => new InspectionConvertDTO()
{
VisitTaskId = entity.VisitTaskId,
ObjectRelationParentId = entity.VisitTaskId,
ObjectRelationParentId2 = entity.MedicalManagerUserId,
ExtraIndentification = extraIdentification,
IsDistinctionInterface = (type == AuditOpt.Add || extraIdentification != String.Empty) ? false : true
});
}
//系统 医学审核问题
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingMedicineSystemQuestion)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingMedicineSystemQuestion;
var parentQuestionName = string.Empty;
if (entity.ParentId != null)
{
parentQuestionName = await _dbContext.ReadingMedicineSystemQuestion.Where(x => x.Id == entity.ParentId).Select(x => x.QuestionName).FirstOrDefaultAsync();
}
await InsertInspection<ReadingMedicineSystemQuestion>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
}, new { ParentQuestionName = parentQuestionName });
}
//项目医学审核问题
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingMedicineTrialQuestion)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingMedicineTrialQuestion;
var parentQuestionName = string.Empty;
if (entity.ParentId != null)
{
parentQuestionName = await _dbContext.ReadingMedicineTrialQuestion.Where(x => x.Id == entity.ParentId).Select(x => x.QuestionName).FirstOrDefaultAsync();
}
await InsertInspection<ReadingMedicineTrialQuestion>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ObjectRelationParentId = entity.TrialId,
TrialReadingCriterionId = x.TrialReadingCriterionId,
}, new { ParentQuestionName = parentQuestionName });
}
#endregion
#region QC 质疑 一致性核查
// Qc 问题答案
if (entitys.Any(x => x.Entity.GetType() == typeof(TrialQCQuestionAnswer)))
{
var entityEntryList = entitys.Where(x => x.Entity.GetType() == typeof(TrialQCQuestionAnswer));
var type = entityEntryList.All(t => t.State == EntityState.Added) ? AuditOpt.Add : AuditOpt.Update;
var list = entityEntryList.Select(t => t.Entity as TrialQCQuestionAnswer);
var firstEntity = list.FirstOrDefault();
var trialQuestionIdList = list.Select(t => t.TrialQCQuestionConfigureId);
var trialQuestionNameList = await _dbContext.TrialQCQuestionConfigure.Where(x => x.TrialId == firstEntity.TrialId).Select(t => new { t.QuestionName, TrialQCQuestionConfigureId = t.Id, t.ShowOrder }).ToListAsync();
var beforeAnswerList = await _dbContext.TrialQCQuestionAnswer.Where(x => x.SubjectVisitId == firstEntity.SubjectVisitId && x.CurrentQCEnum == firstEntity.CurrentQCEnum && x.QCProcessEnum == firstEntity.QCProcessEnum)
.Select(u => new { u.TrialQCQuestionConfigureId, u.Answer }).ToListAsync();
var answerList = list.Select(u => new { u.TrialQCQuestionConfigureId, u.Answer }).Union(beforeAnswerList).DistinctBy(t => t.TrialQCQuestionConfigureId);
var cloneEntity = firstEntity.Clone();
//保证Id 唯一
cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.SubjectVisitId.ToString(), ((int)firstEntity.QCProcessEnum).ToString(), ((int)firstEntity.CurrentQCEnum).ToString());
await InsertInspection(cloneEntity, type, x => new InspectionConvertDTO()
{
SubjectVisitId = x.SubjectVisitId,
//byzhouhang
ObjectRelationParentId = x.SubjectVisitId,
}, new
{
QcQuestionAnswerList = answerList.Join(trialQuestionNameList, t => t.TrialQCQuestionConfigureId, u => u.TrialQCQuestionConfigureId, (t, u) => new
{
t.Answer,
u.QuestionName,
u.ShowOrder
}).OrderBy(t => t.ShowOrder).ToList(),
});
}
//QC 质疑
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(QCChallenge)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as QCChallenge;
await InsertInspection<QCChallenge>(entity, type, x => new InspectionConvertDTO()
{
SubjectVisitId = x.SubjectVisitId,
ObjectRelationParentId = x.SubjectVisitId
}, new
{
IsOverTime = entity.IsClosed ? entity.ClosedTime > entity.DeadlineTime : DateTime.Now > entity.DeadlineTime,
});
}
// 质疑 对话
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(QCChallengeDialog)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as QCChallengeDialog;
var extraIdentification = string.Empty;
var reason = string.Empty;
// 对话消息区分用户类型
extraIdentification = "/(" + _userInfo.UserTypeShortName + ")";
if (_userInfo.RequestUrl.ToLower() == "qcoperation/closeqcchallenge")
{
reason = entity.TalkContent.Substring(entity.TalkContent.LastIndexOf(':') + 1);
}
await InsertInspection<QCChallengeDialog>(entity, type, x => new InspectionConvertDTO()
{
SubjectVisitId = x.SubjectVisitId,
//byzhouhang
ObjectRelationParentId = entity.QCChallengeId,
IsDistinctionInterface = false,
ExtraIndentification = extraIdentification,
});
}
//一致性核查 对话
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(CheckChallengeDialog)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as CheckChallengeDialog;
var extraIdentification = string.Empty;
var reason = string.Empty;
extraIdentification = "/(" + _userInfo.UserTypeShortName + ")";
if (_userInfo.RequestUrl.ToLower() == "qcoperation/closecheckchallenge")
{
reason = entity.TalkContent.Substring(entity.TalkContent.LastIndexOf(':') + 1);
}
await InsertInspection<CheckChallengeDialog>(entity, type, x => new InspectionConvertDTO()
{
SubjectVisitId = x.SubjectVisitId,
//byzhouhang
IsDistinctionInterface = false,
Reason = reason,
ExtraIndentification = extraIdentification,
ObjectRelationParentId = entity.SubjectVisitId,
}
);
}
// 一致性核查文件 是否需要单独一个表记录?
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(InspectionFile)))
{
var type = GetEntityAuditOpt(item);
await InsertInspection<InspectionFile>(item.Entity as InspectionFile, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = x.TrialId
});
}
#endregion
#region 中心调研
// 中心调研表
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialSiteSurvey)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialSiteSurvey;
if (entity.TrialSite == null)
{
entity.TrialSite = await _dbContext.TrialSite.IgnoreQueryFilters().Where(x => x.Id == entity.TrialSiteId && x.TrialId == entity.TrialId).FirstOrDefaultAsync();
}
if (entity.PreliminaryUser == null)
{
entity.PreliminaryUser = await _dbContext.User.Where(x => x.Id == entity.PreliminaryUserId).FirstOrDefaultAsync();
}
if (entity.ReviewerUser == null)
{
entity.ReviewerUser = await _dbContext.User.Where(x => x.Id == entity.ReviewerUserId).FirstOrDefaultAsync();
}
var trialSiteId = entity.TrialSite?.Id;
await InsertInspection<TrialSiteSurvey>(item.Entity as TrialSiteSurvey, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = trialSiteId,
}, new
{
//TrialSiteCode = entity.TrialSite.TrialSiteCode,
//TrialSiteAliasName = entity.TrialSite.TrialSiteAliasName,
//Phone = entity.Phone,
//Email = entity.Email,
PreliminaryUser = entity.PreliminaryUser == null ? "" : entity.PreliminaryUser.FullName,
ReviewerUser = entity.ReviewerUser == null ? "" : entity.ReviewerUser.FullName,
});
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialSiteUserSurvey)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialSiteUserSurvey;
var trialid = await _dbContext.TrialSiteSurvey.Where(x => x.Id == entity.TrialSiteSurveyId).Select(x => x.TrialId).FirstOrDefaultAsync();
await InsertInspection<TrialSiteUserSurvey>(entity, type, x => new InspectionConvertDTO()
{
TrialId = trialid,
IsDistinctionInterface = false
});
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialSiteEquipmentSurvey)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialSiteEquipmentSurvey;
var trialid = await _dbContext.TrialSiteSurvey.Where(x => x.Id == entity.TrialSiteSurveyId).Select(x => x.TrialId).FirstOrDefaultAsync();
await InsertInspection<TrialSiteEquipmentSurvey>(entity, type, x => new InspectionConvertDTO()
{
TrialId = trialid,
IsDistinctionInterface = false
});
}
#endregion
//系统 Qc 问题
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(QCQuestion)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as QCQuestion;
int? parentQuestionOrder = null;
string parentQuestionName = string.Empty;
if (entity.ParentId != null)
{
var question = await _dbContext.QCQuestionConfigure.Where(x => x.Id == entity.ParentId).Select(x => new { x.Id, x.ShowOrder, x.QuestionName }).FirstOrDefaultAsync();
parentQuestionOrder = question?.ShowOrder;
parentQuestionName = question?.QuestionName;
}
await InsertInspection<QCQuestion>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false
}, new
{
ParentQuestionName = parentQuestionName,
ParentQuestionOrder = parentQuestionOrder
});
}
// 项目QC问题
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialQCQuestion)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialQCQuestion;
int? parentQuestionOrder = null;
string parentQuestionName = string.Empty;
if (entity.ParentId != null)
{
var question = entitys.Where(x => x.Entity.GetType() == typeof(TrialQCQuestion)).Select(t => t.Entity as TrialQCQuestion).Select(x => new { x.Id, x.ShowOrder, x.QuestionName }).FirstOrDefault(t => t.Id == entity.ParentId);
question = question ?? await _dbContext.TrialQCQuestionConfigure.Where(x => x.Id == entity.ParentId).Select(x => new { x.Id, x.ShowOrder, x.QuestionName }).FirstOrDefaultAsync();
parentQuestionOrder = question?.ShowOrder;
parentQuestionName = question?.QuestionName;
}
await InsertInspection<TrialQCQuestion>(entity, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = x.TrialId,
IsDistinctionInterface = false
}, new
{
ParentQuestionName = parentQuestionName,
ParentQuestionOrder = parentQuestionOrder
});
}
// 签名模板
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SystemBasicData)))
{
var type = GetEntityAuditOpt(item);
var extraIdentification = string.Empty;
var basicData = item.Entity as SystemBasicData;
extraIdentification = (basicData.ParentId == null ? "/parent" : string.Empty);
await InsertInspection<SystemBasicData>(item.Entity as SystemBasicData, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ExtraIndentification = extraIdentification
});
}
#region 项目参与人员 项目site
// 项目中心 Site未稽查
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialSite)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialSite;
if (entity.Site == null && entity.SiteId != null)
{
entity.Site = await _dbContext.Site.Where(x => x.Id == entity.SiteId).FirstOrDefaultAsync();
}
await InsertInspection<TrialSite>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = type == AuditOpt.Update ? true : false,
TrialId = x.TrialId,
ObjectRelationParentId = x.TrialId
}, new
{
//兼容之前的配置 冗余该字段
SiteCode = entity.TrialSiteCode,
//Site 没记录稽查 必须查询存
SiteName = entity.TrialSiteName
});
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(UserRole)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as UserRole;
//var user = await _dbContext.Users.Include(x => x.UserTypeRole).FirstOrDefaultAsync(x => x.Id == entity.UserId);
await InsertInspection<UserRole>(entity, type, x => new InspectionConvertDTO
{
IsDistinctionInterface = type == AuditOpt.Update ? true : false,
});
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(IdentityUser)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as IdentityUser;
await InsertInspection<IdentityUser>(entity, type, x => new InspectionConvertDTO
{
IsDistinctionInterface = type == AuditOpt.Update ? true : false,
});
}
// 项目参与人员
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialIdentityUser)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialIdentityUser;
string extraIndentification = string.Empty;
var identityUser = await _dbContext.IdentityUser.AsNoTracking().Where(x => x.Id == entity.IdentityUserId).FirstOrDefaultAsync();
// 变更维护数据,会维护数据,不能插入稽查
if (_userInfo.IsNotNeedInspection == false)
{
await InsertInspection<TrialIdentityUser>(entity, type, x => new InspectionConvertDTO
{
//IsDistinctionInterface = true ,
TrialId = x.TrialId,
IsDistinctionInterface = false,
ObjectRelationParentId = x.TrialId,
ExtraIndentification = extraIndentification,
//ObjectRelationParentId2 = x.IdentityUserId,
}, new
{
identityUser.FullName,
identityUser.EMail,
identityUser.Code,
identityUser.UserCode,
identityUser.UserName,
identityUser.DepartmentName,
identityUser.Phone,
identityUser.OrganizationName,
});
}
}
// 项目人员
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialUserRole)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialUserRole;
string extraIndentification = string.Empty;
if (type == AuditOpt.Update)
{
extraIndentification = "/" + entity.IsDeleted.ToString();
}
var userTypeEnum = await _dbContext.Users.Where(x => x.Id == entity.UserId).Select(x => x.UserTypeEnum).FirstOrDefaultAsync();
//var user = await _dbContext.Users.Include(x => x.UserTypeRole).FirstOrDefaultAsync(x => x.Id == entity.UserId);
await InsertInspection<TrialUserRole>(entity, type, x => new InspectionConvertDTO
{
IsDistinctionInterface = false,
TrialId = x.TrialId,
ObjectRelationParentId = x.TrialId,
ExtraIndentification = extraIndentification,
ObjectRelationParentId2 = x.UserId,
}, new
{
UserTypeEnum = userTypeEnum,
});
}
// 项目中心人员
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialSiteUserRole)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialSiteUserRole;
if (entity.TrialSite == null)
{
entity.TrialSite = await _dbContext.TrialSite.Where(x => x.Id == entity.TrialSiteId).IgnoreQueryFilters().FirstOrDefaultAsync();
}
await InsertInspection<TrialSiteUserRole>(item.Entity as TrialSiteUserRole, type, x => new InspectionConvertDTO
{
IsDistinctionInterface = type == AuditOpt.Update ? true : false,
TrialId = x.TrialId,
ObjectRelationParentId = entity.TrialSite.Id,
ObjectRelationParentId2 = x.UserId,
});
}
#endregion
// 受试者
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(Subject)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as Subject;
var finalSubjectVisitName = await _dbContext.SubjectVisit.AsNoTracking().Where(x => x.Id == entity.FinalSubjectVisitId && entity.FinalSubjectVisitId != null).Select(x => x.VisitName).FirstOrDefaultAsync();
await InsertInspection<Subject>(entity, type, x => new InspectionConvertDTO()
{
SubjectId = x.Id,
TrialSiteId = x.TrialSiteId,
//项目的信息 找离的最近的项目稽查信息
ObjectRelationParentId = entity.TrialSiteId,
}, new
{
FinalSubjectVisitName = finalSubjectVisitName,
//变换名称 兼容之前做的稽查 冗余
SubjectCode = entity.Code,
});
}
// 访视计划
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(VisitStage)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as VisitStage;
await InsertInspection<VisitStage>(item.Entity as VisitStage, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = x.TrialId
});
#region Old
//var visitPlanStatus = await this._dbContext.Trial.Where(x => x.Id == entity.TrialId).Select(x => x.VisitPlanConfirmed).FirstOrDefaultAsync();
//if (type == "Add")
//{
// visitPlanStatus = false;
//}
//await InsertInspection<VisitStage>(item.Entity as VisitStage, type, x => new InspectionConvertDTO()
//{
// ObjectRelationParentId = x.TrialId
//}, new
//{
// VisitPlanStatus = visitPlanStatus,
//});
#endregion
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectVisitImageBackRecord)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as SubjectVisitImageBackRecord;
var extraIdentification = string.Empty;
var isDistinctionInterface = true;
var reason = string.Empty;
#region 处理标识
#endregion
var SubjectId = await _dbContext.SubjectVisit.Where(x => x.Id == entity.SubjectVisitId).Select(x => x.SubjectId).FirstOrDefaultAsync();
await InsertInspection<SubjectVisitImageBackRecord>(item.Entity as SubjectVisitImageBackRecord, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = isDistinctionInterface,
Reason = reason,
//Subject的信息 找离的最近的Subject稽查信息
ObjectRelationParentId = x.SubjectVisitId,
SubjectId = SubjectId,
SubjectVisitId = x.Id,
ExtraIndentification = extraIdentification,
}
);
}
// 访视
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectVisit)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as SubjectVisit;
var extraIdentification = string.Empty;
var isDistinctionInterface = true;
var reason = string.Empty;
#region 处理标识
switch (_userInfo.RequestUrl.ToLower())
{
//待处理?
case "qcoperation/qcpassedorfailed":
extraIdentification = "/" + (40 % (int)entity.AuditState).ToString();
break;
//设置核查通过
case "qcoperation/setcheckpass":
reason = entity.ManualPassReason;
break;
//领取或者取消QC任务
case "qcoperation/obtainorcancelqctask":
type = type + "/" + entity.IsTake.ToString();
break;
//确认重阅 区分用户类型
case "visittask/confirmrereading":
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM)
{
type = type + "/" + 1;
}
else
{
//SPM
type = type + "/" + 2;
}
break;
}
if (entity.CheckChallengeState == CheckChanllengeTypeEnum.CRCWaitPMReply || entity.CheckChallengeState == CheckChanllengeTypeEnum.PMWaitCRCReply)
{
//发送对话 修改质疑状态 不需要区分接口
isDistinctionInterface = false;
extraIdentification = "/ModifyCheckChallengeState";
}
#endregion
await InsertInspection<SubjectVisit>(item.Entity as SubjectVisit, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = isDistinctionInterface,
Reason = reason,
//Subject的信息 找离的最近的Subject稽查信息
ObjectRelationParentId = x.SubjectId,
SubjectId = x.SubjectId,
SubjectVisitId = x.Id,
TrialSiteId = x.TrialSiteId,
ExtraIndentification = extraIdentification,
},
//兼容之前的配置名
new { SubjectVisitName = entity.VisitName }
);
}
#region Dicom 非Dicom 既往手术史..临床数据
// Dicom
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(DicomStudy)))
{
var type = GetEntityAuditOpt(item);
var extraIdentification = string.Empty;
switch (_userInfo.RequestUrl)
{
case "QCOperation/updateModality":
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator)
{
extraIdentification = "/2";
}
break;
}
await InsertInspection<DicomStudy>(item.Entity as DicomStudy, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = x.SubjectVisitId,
ExtraIndentification = extraIdentification
});
}
// 后处理Dicom影像
// TaskStudy
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TaskStudy)))
{
var entity = item.Entity as TaskStudy;
var type = GetEntityAuditOpt(item);
var armEnum = await _dbContext.VisitTask.Where(x => x.Id == entity.VisitTaskId).Select(x => x.ArmEnum).FirstOrDefaultAsync();
await InsertInspection<TaskStudy>(item.Entity as TaskStudy, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = x.VisitTaskId,
}, new
{
ArmEnum = armEnum,
});
}
// 序列
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(DicomSeries)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as DicomSeries;
await InsertInspection<DicomSeries>(item.Entity as DicomSeries, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = x.StudyId
}
);
}
//
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(DicomInstance)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as DicomInstance;
await InsertInspection<DicomInstance>(item.Entity as DicomInstance, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = x.SeriesId,
ObjectRelationParentId2 = x.StudyId,
}
);
}
// 非Dicom
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(NoneDicomStudy)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as NoneDicomStudy;
var extraIdentification = string.Empty;
if (_userInfo.RequestUrl.ToLower() == "nonedicomstudy/addorupdatenonedicomstudy")
{
extraIdentification = "/(" + _userInfo.UserTypeShortName + ")";
}
await InsertInspection<NoneDicomStudy>(item.Entity as NoneDicomStudy, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = x.SubjectVisitId,
ExtraIndentification = extraIdentification
});
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(NoneDicomStudyFile)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as NoneDicomStudyFile;
var extraIdentification = string.Empty;
Arm armEnum = Arm.SingleReadingArm;
if (entity.VisitTaskId != null)
{
extraIdentification = "/VisitTask";
armEnum = await _dbContext.VisitTask.Where(x => x.Id == entity.VisitTaskId).Select(x => x.ArmEnum).FirstOrDefaultAsync();
}
var noneDicomStudy = await _dbContext.NoneDicomStudy.Where(x => x.Id == entity.NoneDicomStudyId).IgnoreQueryFilters().FirstNotNullAsync();
await InsertInspection<NoneDicomStudyFile>(item.Entity as NoneDicomStudyFile, type, x => new InspectionConvertDTO()
{
SubjectVisitId = noneDicomStudy.SubjectVisitId,
SubjectId = noneDicomStudy.SubjectId,
ObjectRelationParentId = x.VisitTaskId,
ExtraIndentification = extraIdentification
}, new
{
ArmEnum = armEnum,
});
}
// 既往手术史
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(PreviousSurgery)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as PreviousSurgery;
await InsertInspection<PreviousSurgery>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
SubjectVisitId = x.SubjectVisitId,
ObjectRelationParentId = x.SubjectVisitId,
ObjectRelationParentId2 = x.ClinicalDataTrialSetId,
}, new
{
ClinicalDataLevel = ClinicalLevel.Subject,
Type = ClinicalFileType.PreviousSurgery
});
}
// 既往放疗史
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(PreviousHistory)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as PreviousHistory;
await InsertInspection<PreviousHistory>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
SubjectVisitId = x.SubjectVisitId,
ObjectRelationParentId2 = x.ClinicalDataTrialSetId,
ObjectRelationParentId = x.SubjectVisitId,
}, new
{
ClinicalDataLevel = ClinicalLevel.Subject,
Type = ClinicalFileType.PreviousHistory
});
}
// 其他治疗史
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(PreviousOther)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as PreviousOther;
await InsertInspection<PreviousOther>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
SubjectVisitId = x.SubjectVisitId,
ObjectRelationParentId2 = x.ClinicalDataTrialSetId,
ObjectRelationParentId = x.SubjectVisitId,
}, new
{
ClinicalDataLevel = ClinicalLevel.Subject,
Type = ClinicalFileType.PreviousOther
});
}
#endregion
#region 阅片人入组
//阅片人入组 父层级未记录稽查(医生)
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(Enroll)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as Enroll;
var doctor = await _dbContext.Doctor.FirstOrDefaultAsync(x => x.Id == entity.DoctorId);
var readingCategoryList = await _dbContext.EnrollReadingCategory.Where(x => x.EnrollId == entity.Id).Select(t => t.ReadingCategory).ToListAsync();
await InsertInspection<Enroll>(item.Entity as Enroll, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = x.TrialId
}, new
{
//父层级的数据 暂时没有记录稽查 所以这里必须查
Name = doctor.FullName,
ChineseName = doctor.ChineseName,
Email = doctor.EMail,
IsUploadedACKSOW = entity.AttachmentId != Guid.Empty,
//子层级的数据 记录到父层级 必须查询 不然找上一条时数据不准
ReadingCategoryList = readingCategoryList
});
}
//独立阅片人 设置阅片类型 这里对于操作人 不区分 添加 编辑 删除 只有设置(相当于更新)
if (entitys.Any(x => x.Entity.GetType() == typeof(EnrollReadingCategory)))
{
var type = AuditOpt.Update;
var addList = entitys.Where(x => x.Entity.GetType() == typeof(EnrollReadingCategory) && x.State == EntityState.Added).Select(t => t.Entity as EnrollReadingCategory).ToList();
var deleteList = entitys.Where(x => x.Entity.GetType() == typeof(EnrollReadingCategory) && x.State == EntityState.Deleted).Select(t => t.Entity as EnrollReadingCategory).ToList();
var first = addList.Union(deleteList).FirstOrDefault();
var enrollId = first.EnrollId;
Guid? trialId = Guid.Empty;
if (first.Enroll != null)
{
trialId = first.Enroll.TrialId;
}
else
{
trialId = await _dbContext.Enroll.Where(x => x.Id == enrollId).Select(t => t.TrialId).FirstOrDefaultAsync();
}
await InsertInspection<EnrollReadingCategory>(first, type, x => new InspectionConvertDTO()
{
//GeneralId 和ObjectRelationParentId 一样 会成环 所以查询的时候 需要排除自身
GeneralId = enrollId,
TrialId = trialId,
ObjectRelationParentId = enrollId,
IsDistinctionInterface = false
}, new
{
ReadingCategoryList = addList.Select(t => t.ReadingCategory).ToList(),
});
}
#endregion
#region 阅片期临床数据
//临床数据上传PDF
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingClinicalDataPDF)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingClinicalDataPDF;
var clinicalData = await _dbContext.ReadingClinicalData.Where(t => t.Id == entity.ReadingClinicalDataId).FirstOrDefaultAsync();
if (clinicalData != null)
{
var clinicalDataTrialSet = await _dbContext.ClinicalDataTrialSet.Where(t => t.Id == clinicalData.ClinicalDataTrialSetId).FirstOrDefaultAsync();
SubjectVisit? visit = await _dbContext.SubjectVisit.Where(x => x.Id == clinicalData.ReadingId).FirstOrDefaultAsync();
TrialSite? siteInfo = null;
Subject? subject = null;
//阅片标准
var trialReadingCriterionIdList = await _dbContext.TrialClinicalDataSetCriterion.Where(t => t.TrialClinicalDataSetId == clinicalDataTrialSet.Id).Select(t => t.TrialReadingCriterionId).ToListAsync();
//阅片标准
var criterionNameList = await _dbContext.ReadingQuestionCriterionTrial.Where(t => trialReadingCriterionIdList.Contains(t.Id)).OrderBy(t => t.ShowOrder).Select(t => t.CriterionName).ToListAsync();
if (visit != null)
{
siteInfo = await _dbContext.TrialSite.Where(x => x.Id == visit.TrialSiteId).FirstOrDefaultAsync();
subject = await _dbContext.Subject.Where(x => x.Id == clinicalData.SubjectId).FirstOrDefaultAsync();
}
Guid? subjectVisitId = visit == null ? null : visit.Id;
await InsertInspection<ReadingClinicalDataPDF>(entity, type, x => new InspectionConvertDTO()
{
TrialId = clinicalData.TrialId,
SubjectId = clinicalData.SubjectId,
SubjectVisitId = subjectVisitId,
}, new
{
SiteCode = siteInfo == null ? "" : siteInfo.TrialSiteCode,
SubjectCode = subject == null ? "" : subject.Code,
VisitName = visit == null ? "" : visit.VisitName,
clinicalDataTrialSet.ClinicalDataSetName,
clinicalDataTrialSet.ClinicalDataLevel,
clinicalDataTrialSet.ClinicalUploadType,
CriterionNames = string.Join(",", criterionNameList.Distinct()),
FileCount = 1,
});
}
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ClinicalForm)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ClinicalForm;
var clinicalDataTrialSet = await _dbContext.ClinicalDataTrialSet.Where(t => t.Id == entity.ClinicalDataTrialSetId).FirstOrDefaultAsync();
SubjectVisit? visit = await _dbContext.SubjectVisit.Where(x => x.Id == entity.ReadingId).FirstOrDefaultAsync();
TrialSite? siteInfo = null;
Subject? subject = null;
//阅片标准
var trialReadingCriterionIdList = await _dbContext.TrialClinicalDataSetCriterion.Where(t => t.TrialClinicalDataSetId == clinicalDataTrialSet.Id).Select(t => t.TrialReadingCriterionId).ToListAsync();
//阅片标准
var criterionNameList = await _dbContext.ReadingQuestionCriterionTrial.Where(t => trialReadingCriterionIdList.Contains(t.Id)).OrderBy(t => t.ShowOrder).Select(t => t.CriterionName).ToListAsync();
if (visit != null)
{
siteInfo = await _dbContext.TrialSite.Where(x => x.Id == visit.TrialSiteId).FirstOrDefaultAsync();
subject = await _dbContext.Subject.Where(x => x.Id == entity.SubjectId).FirstOrDefaultAsync();
}
Guid? subjectVisitId = visit == null ? null : visit.Id;
await InsertInspection<ClinicalForm>(entity, type, x => new InspectionConvertDTO()
{
TrialId = entity.TrialId,
SubjectId = entity.SubjectId,
SubjectVisitId = subjectVisitId,
}, new
{
SiteCode = siteInfo == null ? "" : siteInfo.TrialSiteCode,
SubjectCode = subject == null ? "" : subject.Code,
VisitName = visit == null ? "" : visit.VisitName,
clinicalDataTrialSet.ClinicalDataSetName,
clinicalDataTrialSet.ClinicalDataLevel,
clinicalDataTrialSet.ClinicalUploadType,
CriterionNames = string.Join(",", criterionNameList.Distinct()),
});
}
//系统临床数据配置
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ClinicalDataSystemSet)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ClinicalDataSystemSet;
await InsertInspection<ClinicalDataSystemSet>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
});
}
//项目临床数据配置
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ClinicalDataTrialSet)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ClinicalDataTrialSet;
var extraIdentification = string.Empty;
if (_userInfo.RequestUrl == "configTrialBasicInfo/ConfigTrialProcessInfoConfirm")
{
extraIdentification = "/ConfirmSelect";
}
else if (_userInfo.RequestUrl == "ClinicalDataSet/applyTrialClinical")
{
extraIdentification = "/applyTrialClinical";
}
//获取配置的标准名称
//List<string> trialDics = new List<string>();
//var dictionaryIds = new List<Guid>();
//if (entity.TrialDicList == null || entity.TrialDicList.Count == 0)
//{
// dictionaryIds = await this._dbContext.TrialDictionary.Where(x => x.TrialId == entity.Id && x.KeyName == "Criterion").Select(x => x.DictionaryId).ToListAsync();
//}
//else
//{
// dictionaryIds = entity.TrialDicList.Select(x => x.DictionaryId).ToList();
//}
//trialDics = await this._dbContext.Dictionary.Where(x => dictionaryIds.Contains(x.Id)).Select(x => x.ValueCN).ToListAsync();
var trialReadingCritiralIdList = new List<Guid>();
var criterionNameList = new List<string>();
if (entity.TrialClinicalDataSetCriteriaList == null || entity.TrialClinicalDataSetCriteriaList.Count() == 0)
{
criterionNameList = await _dbContext.TrialClinicalDataSetCriterion.Where(t => t.TrialClinicalDataSetId == entity.Id).Select(t => t.TrialReadingCriterion.CriterionName).ToListAsync();
}
else
{
var ids = entity.TrialClinicalDataSetCriteriaList.Select(t => t.TrialReadingCriterionId).ToList();
criterionNameList = await _dbContext.ReadingQuestionCriterionTrial.Where(t => ids.Contains(t.Id)).Select(t => t.CriterionName).ToListAsync();
}
await InsertInspection<ClinicalDataTrialSet>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ObjectRelationParentId = entity.TrialId,
ExtraIndentification = extraIdentification,
}, new
{
CriterionNames = criterionNameList?.Count() > 0 ? string.Join(",", criterionNameList) : string.Empty
});
}
//临床数据问题
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialClinicalQuestion)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialClinicalQuestion;
var trialId = await _dbContext.ClinicalDataTrialSet.Where(t => t.Id == entity.TrialClinicalId).Select(t => t.TrialId).FirstOrDefaultAsync();
var GroupName = entity.GroupId == null ? entity.QuestionName : _dbContext.TrialClinicalQuestion.Where(t => t.Id == entity.GroupId).Select(t => t.QuestionName).FirstOrDefault();
var GroupEnName = entity.GroupId == null ? entity.QuestionEnName : _dbContext.TrialClinicalQuestion.Where(t => t.Id == entity.GroupId).Select(t => t.QuestionEnName).FirstOrDefault();
await InsertInspection<TrialClinicalQuestion>(entity, type, x => new InspectionConvertDTO()
{
TrialId = trialId,
},
new
{
GroupName = GroupName,
GroupEnName = GroupEnName,
}
);
}
//临床数据表格问题
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialClinicalTableQuestion)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TrialClinicalTableQuestion;
var trialId = await _dbContext.ClinicalDataTrialSet.Where(t => t.Id == entity.TrialClinicalId).Select(t => t.TrialId).FirstOrDefaultAsync();
await InsertInspection<TrialClinicalTableQuestion>(entity, type, x => new InspectionConvertDTO()
{
TrialId = trialId,
}
);
}
// CRC PM 临床数据
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingClinicalData)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingClinicalData;
var config = await _dbContext.ClinicalDataTrialSet.FindAsync(entity.ClinicalDataTrialSetId);
await InsertInspection<ReadingClinicalData>(item.Entity as ReadingClinicalData, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = type == AuditOpt.Update ? true : false,
SubjectVisitId = x.IsVisit ? x.ReadingId : null,
ObjectRelationParentId = entity.ClinicalDataTrialSetId,
//ObjectRelationParentId2 = x.IsVisit == false?x.ReadingId:null
}, new { FileCountViewStr = config?.ClinicalDataLevel == ClinicalLevel.Subject && config?.ClinicalUploadType == ClinicalUploadType.Table ? "NA" : entity.FileCount.ToString() });
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingConsistentClinicalData)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingConsistentClinicalData;
var config = await _dbContext.ClinicalDataTrialSet.FindAsync(entity.ClinicalDataTrialSetId);
await InsertInspection<ReadingConsistentClinicalData>(item.Entity as ReadingConsistentClinicalData, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = type == AuditOpt.Update ? true : false,
SubjectVisitId = x.IsVisit ? x.ReadingId : null,
ObjectRelationParentId = entity.ClinicalDataTrialSetId,
//ObjectRelationParentId2 = x.IsVisit == false?x.ReadingId:null
}, new { FileCountViewStr = config?.ClinicalDataLevel == ClinicalLevel.Subject && config?.ClinicalUploadType == ClinicalUploadType.Table ? "NA" : entity.FileCount.ToString() });
}
//阅片期计划
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingPeriodSet)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingPeriodSet;
var siteCodes = string.Empty;
if (entity.ReadingScope == ReadingScopeEnum.Site)
{
var siteIds = entity.ReadingPeriodSites.Select(t => t.TrialSiteId).ToList();
var nameList = _dbContext.TrialSite.Where(c => c.TrialId == entity.TrialId && siteIds.Contains(c.Id)).Select(t => t.TrialSiteCode).ToList();
siteCodes = String.Join(',', nameList);
}
await InsertInspection<ReadingPeriodSet>(item.Entity as ReadingPeriodSet, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = x.VisitStageId,
ObjectRelationParentId2 = entity.TrialReadingCriterionId,
}, new
{
SiteCodes = siteCodes
});
}
#region 阅片期临时数据不记录
//foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingPeriodPlan)))
//{
// var entity = item.Entity as ReadingPeriodPlan;
// if (entity.ReadingPeriodSet == null)
// {
// entity.ReadingPeriodSet = _dbContext.ReadingPeriodSet.Find(entity.ReadingPeriodSetId);
// }
// await InsertInspection<ReadingPeriodPlan>(item.Entity as ReadingPeriodPlan, type, x => new InspectionConvertDTO()
// {
// GeneralId = x.Id,
// SubjectVisitId = x.SubjectVisitId,
// }, new
// {
// entity.ReadingPeriodSet.ReadingPeriodName,
// entity.ReadingPeriodSet.EffectOfTime,
// entity.ReadingPeriodSet.ExpirationDate
// });
//}
#endregion
//阅片期
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadModule)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadModule;
string extraIndentification = string.Empty;
object objData = new { };
//临床数据表单确认
if (_userInfo.RequestUrl == "ClinicalAnswer/cRCConfirmClinical")
{
extraIndentification = "/" + _userInfo.RequestUrl;
var readModuleCriterionFromList = entitys.Where(x => x.Entity.GetType() == typeof(ReadModuleCriterionFrom)).ToList();
if (readModuleCriterionFromList.Count() > 0)
{
var readModuleCriterionFrom = readModuleCriterionFromList.FirstOrDefault().Entity as ReadModuleCriterionFrom;
var clinicalFormIds = new List<Guid>();
var criterionIds = new List<Guid>();
readModuleCriterionFromList.ForEach(x =>
{
var form = x.Entity as ReadModuleCriterionFrom;
clinicalFormIds.Add(form.ClinicalFormId);
});
var clinicalFormList = await _dbContext.ClinicalForm.Where(t => clinicalFormIds.Contains(t.Id)).ToListAsync();
var clinicalDataTrialSetIds = clinicalFormList.Select(x => x.ClinicalDataTrialSetId).ToList().Distinct();
var readModule = await _dbContext.ReadModule.Where(t => t.Id == readModuleCriterionFrom.ReadModuleId).Include(x => x.SubjectVisit).FirstOrDefaultAsync();
var latestScanDate = readModule.SubjectVisit.LatestScanDate;
var clinicalDataTrialSetList = await _dbContext.ClinicalDataTrialSet.Where(t => clinicalDataTrialSetIds.Contains(t.Id)).ToListAsync();
var clinicalSetIds = clinicalDataTrialSetList.Select(x => x.Id).ToList();
// 项目临床数据和标准的关联
var trialReadingCriterionIdList = await _dbContext.TrialClinicalDataSetCriterion.Where(x => clinicalSetIds.Contains(x.TrialClinicalDataSetId)).Select(x => x.TrialReadingCriterionId).Distinct().ToListAsync();
// 标准
var criterionNameList = await _dbContext.ReadingQuestionCriterionTrial.Where(t => trialReadingCriterionIdList.Contains(t.Id)).OrderBy(t => t.ShowOrder).Select(t => t.CriterionName).ToListAsync();
Subject subject = await _dbContext.Subject.Where(x => x.Id == readModule.SubjectId).FirstOrDefaultAsync();
TrialSite siteInfo = await _dbContext.TrialSite.Where(x => x.Id == subject.TrialSiteId).FirstOrDefaultAsync();
var clinicalDataSetNameList = clinicalDataTrialSetList.Select(x => x.ClinicalDataSetName).ToList();
objData = new
{
SiteCode = siteInfo == null ? "" : siteInfo.TrialSiteCode,
SubjectCode = subject == null ? "" : subject.Code,
LatestScanDate = latestScanDate,
ClinicalDataSetName = string.Join(",", clinicalDataSetNameList),
ClinicalDataLevel = clinicalDataTrialSetList.Select(x => x.ClinicalDataLevel).FirstOrDefault(),
ClinicalUploadType = clinicalDataTrialSetList.Select(x => x.ClinicalUploadType).FirstOrDefault(),
CriterionNames = string.Join(",", criterionNameList.Distinct()),
RecordNumber = readModuleCriterionFromList.Count(),
};
}
}
List<string> urlList = new List<string>() {
"ClinicalAnswer/cRCCancelConfirmClinical",
"ClinicalAnswer/PMConfirmClinical"
};
if (urlList.Contains(_userInfo.RequestUrl))
{
extraIndentification = "/" + _userInfo.RequestUrl;
string status = string.Empty;
if (!entity.IsCRCConfirm && _userInfo.RequestUrl == "ClinicalAnswer/PMConfirmClinical")
{
status = "已撤回";
extraIndentification += "/revocation";
}
else if (entity.IsPMConfirm && _userInfo.RequestUrl == "ClinicalAnswer/PMConfirmClinical")
{
status = "已核对";
extraIndentification += "/Confirm";
}
var readModuleCriterionFrom = await _dbContext.ReadModuleCriterionFrom.Where(t => t.ReadModuleId == entity.Id).FirstOrDefaultAsync();
var latestScanDate = await _dbContext.ReadModule.Where(t => t.Id == entity.Id).Select(x => x.SubjectVisit.LatestScanDate).FirstOrDefaultAsync();
TrialSite? siteInfo = null;
Subject? subject = null;
//阅片标准
var clinicalFormIds = await _dbContext.ReadModuleCriterionFrom.Where(x => x.ReadModuleId == entity.Id).Select(x => x.ClinicalFormId).ToListAsync();
var clinicalDataTrialSetIds = await _dbContext.ClinicalForm.Where(x => clinicalFormIds.Contains(x.Id)).Select(x => x.ClinicalDataTrialSetId).Distinct().ToListAsync();
// 临床数据
var clinicalDataTrialSetList = await _dbContext.ClinicalDataTrialSet.Where(x => clinicalDataTrialSetIds.Contains(x.Id)).ToListAsync();
var clinicalSetIds = clinicalDataTrialSetList.Select(x => x.Id).ToList();
// 项目临床数据和标准的关联
var trialReadingCriterionIdList = await _dbContext.TrialClinicalDataSetCriterion.Where(x => clinicalSetIds.Contains(x.TrialClinicalDataSetId)).Select(x => x.TrialReadingCriterionId).Distinct().ToListAsync();
// 标准
var criterionNameList = await _dbContext.ReadingQuestionCriterionTrial.Where(t => trialReadingCriterionIdList.Contains(t.Id)).OrderBy(t => t.ShowOrder).Select(t => t.CriterionName).ToListAsync();
subject = await _dbContext.Subject.Where(x => x.Id == entity.SubjectId).FirstOrDefaultAsync();
siteInfo = await _dbContext.TrialSite.Where(x => x.Id == subject.TrialSiteId).FirstOrDefaultAsync();
var clinicalDataSetNameList = clinicalDataTrialSetList.Select(x => x.ClinicalDataSetName).ToList().Distinct();
objData = new
{
SiteCode = siteInfo == null ? "" : siteInfo.TrialSiteCode,
SubjectCode = subject == null ? "" : subject.Code,
LatestScanDate = latestScanDate,
ClinicalDataSetName = string.Join(",", clinicalDataSetNameList),
ClinicalDataLevel = clinicalDataTrialSetList.Select(x => x.ClinicalDataLevel).FirstOrDefault(),
ClinicalUploadType = clinicalDataTrialSetList.Select(x => x.ClinicalUploadType).FirstOrDefault(),
CriterionNames = string.Join(",", criterionNameList.Distinct()),
RecordNumber = clinicalFormIds.Count(),
Status = status,
};
}
await InsertInspection<ReadModule>(item.Entity as ReadModule, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = entity.SubjectVisitId,
ObjectRelationParentId2 = entity.TrialReadingCriterionId,
ExtraIndentification = extraIndentification,
//SubjectVisitId = x.SubjectVisitId,
IsDistinctionInterface = false,
}, objData);
}
#endregion
#region 阅片
//用户添加
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(UserRole)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as UserRole;
var extraIdentification = string.Empty;
//保存其他个性化配置
if (_userInfo.RequestUrl == "UserWLTemplate/setAutoCutNextTask")
{
extraIdentification = "/Personalization";
}
await InsertInspection<UserRole>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ExtraIndentification = extraIdentification
}, new
{
UserRealName = entity.FullName,
}
);
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(IdentityUser)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as IdentityUser;
var extraIdentification = string.Empty;
//保存其他个性化配置
if (_userInfo.RequestUrl == "UserWLTemplate/setAutoCutNextTask")
{
extraIdentification = "/Personalization";
}
await InsertInspection<IdentityUser>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ExtraIndentification = extraIdentification
}, new
{
UserRealName = entity.FullName,
}
);
}
//分配规则
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TaskAllocationRule)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TaskAllocationRule;
var userRealName = await _dbContext.User.Where(x => x.Id == entity.DoctorUserId).Select(x => x.FullName).FirstOrDefaultAsync();
await InsertInspection<TaskAllocationRule>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ObjectRelationParentId = entity.EnrollId,
ObjectRelationParentId2 = entity.DoctorUserId
}, new
{
UserRealName = userRealName
});
}
// suject 医生绑定关系
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectUser)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as SubjectUser;
await InsertInspection<SubjectUser>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = false,
ObjectRelationParentId = entity.SubjectId,
ObjectRelationParentId2 = entity.DoctorUserId,
ObjectRelationParentId3 = entity.TrialReadingCriterionId,
}, new { ArmToTask = entity.ArmEnum });
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectCanceDoctor)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as SubjectCanceDoctor;
await InsertInspection<SubjectCanceDoctor>(entity, type, x => new InspectionConvertDTO()
{
ObjectRelationParentId = entity.SubjectId,
ObjectRelationParentId3 = entity.TrialReadingCriterionId,
}, new { });
}
//申请重阅记录表
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(VisitTaskReReading)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as VisitTaskReReading;
var extraIdentification = string.Empty;
var reason = entity.RequestReReadingReason;
switch (_userInfo.RequestUrl)
{
case "VisitTask/applyReReading":
extraIdentification = "/" + (int)entity.RequestReReadingType;
break;
case "VisitTask/ConfirmReReading":
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM)
{
extraIdentification = "/" + 1;
}
else
{
extraIdentification = "/" + 2;
}
reason = entity.RequestReReadingRejectReason;
if (entity.RequestReReadingResultEnum == RequestReReadingResult.Agree)
{
extraIdentification = extraIdentification + "/" + 1;
}
else if (entity.RequestReReadingResultEnum == RequestReReadingResult.Reject)
{
extraIdentification = extraIdentification + "/" + 2;
}
break;
}
await InsertInspection<VisitTaskReReading>(entity, type, x => new InspectionConvertDTO()
{
VisitTaskId = entity.OriginalReReadingTaskId,
Reason = reason,
ObjectRelationParentId = entity.OriginalReReadingTaskId,
ExtraIndentification = extraIdentification,
});
}
//一致性分析规则
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TaskConsistentRule)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as TaskConsistentRule;
var extraIdentification = string.Empty;
//自身一致性分析
if (entity.IsSelfAnalysis == true)
{
extraIdentification = "/" + 1;
}
//组件一致性分析
else
{
extraIdentification = "/" + 2;
}
await InsertInspection<TaskConsistentRule>(entity, type, x => new InspectionConvertDTO()
{
IsDistinctionInterface = true,
ObjectRelationParentId = entity.TrialId,
ObjectRelationParentId2 = entity.TrialReadingCriterionId,
ExtraIndentification = extraIdentification,
});
}
#endregion
#region 阅片结果
#region 暂时不区分标准
//保存影像质量 多条记录,只记录一条稽查
if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingTaskQuestionAnswer)))
{
//判断是否不需要记录稽查
if (_userInfo.IsNotNeedInspection)
{
_userInfo.IsNotNeedInspection = false;
}
else
{
// 保存影像质量 、 修改整体肿瘤评估结果 、 非dicom 保存访视阅片结果 、附加评估
if (_userInfo.RequestUrl == "ReadingImageTask/changeDicomReadingQuestionAnswer"
|| _userInfo.RequestUrl == "ReadingImageTask/saveImageQuality"
|| _userInfo.RequestUrl.Contains("SaveTaskQuestion")
|| _userInfo.RequestUrl == "ReadingImageTask/saveVisitTaskQuestions"
|| _userInfo.RequestUrl == "ReadingImageTask/changeCalculationAnswer"
|| _userInfo.RequestUrl == "ReadingImageTask/submitTaskAdditionalQuestion")
{
var type = AuditOpt.Add;
List<UnitData> unitDataList = (await _dbContext.Dictionary.Where(x => x.Parent.Code == "ValueUnit").Where(x => x.Code != "0").ToListAsync()).Select(x => new UnitData()
{
Unit = (ValueUnit)int.Parse(x.Code),
UnitName = x.Value.ToString(),
}).ToList();
var extraIdentification = string.Empty;
//具体的答案
var taskQuestionAnswerList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTaskQuestionAnswer)).Select(t => t.Entity as ReadingTaskQuestionAnswer).ToList();
//获取问题名称 组合成数组
var quesionList = await _dbContext.ReadingQuestionTrial.Where(t => taskQuestionAnswerList.Select(k => k.ReadingQuestionTrialId).Contains(t.Id)).IgnoreQueryFilters().Select(t => new
{
QuestionName = t.QuestionName,
t.QuestionEnName,
QuestionId = t.Id,
t.DictionaryCode,
t.Unit,
t.ShowOrder,
AnswerType = t.Type,
}).OrderBy(t => t.ShowOrder).ToListAsync();
var firstEntity = taskQuestionAnswerList.First();
var cloneEntity = firstEntity.Clone();
//保证Id 唯一
cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.ReadingQuestionCriterionTrialId.ToString(), firstEntity.ReadingQuestionTrialId.ToString(), firstEntity.VisitTaskId.ToString());
dynamic tableQuesionAndAnswerList = null;
//自定义特有标识
if (await _dbContext.ReadingQuestionCriterionTrial.AnyAsync(t => t.Id == firstEntity.ReadingQuestionCriterionTrialId && t.CriterionType == CriterionType.SelfDefine))
{
extraIdentification = "/Self";
//还会把病灶问题答案更新
var tableQuestionAnswerList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionAnswer)).Select(t => t.Entity as ReadingTableQuestionAnswer).ToList();
//获取表格问题名称 组合成数组
var tableQuesionList = await _dbContext.ReadingTableQuestionTrial.Where(t => tableQuestionAnswerList.Select(k => k.TableQuestionId).Contains(t.Id)).Select(t =>
new
{
TrialReadingCriterionId = t.ReadingQuestionTrial.ReadingQuestionCriterionTrialId, //标准Id
Type = t.ReadingQuestionTrial.QuestionName, //病灶类型
t.ReadingQuestionTrial.Unit,
t.ReadingQuestionTrial.CustomUnit,
t.DictionaryCode,
t.QuestionName,
t.QuestionEnName,
QuestionId = t.Id,
t.ShowOrder,
AnswerType = t.Type,
})
.OrderBy(t => t.ShowOrder).ToListAsync();
tableQuesionAndAnswerList = tableQuestionAnswerList.Join(tableQuesionList, t => t.TableQuestionId, u => u.QuestionId, (t, u) =>
new
{
//如果问题类型是附件 特殊处理 方便前端解析
Answer = u.AnswerType == "upload" ? "❄❅❆❇❈❉❊" + t.Answer : t.Answer,
u.QuestionName,
u.QuestionEnName,
u.DictionaryCode,
u.ShowOrder,
t.RowId
}
).OrderBy(t => t.RowId).ThenBy(t => t.ShowOrder).ToList();
}
await InsertInspection<ReadingTaskQuestionAnswer>(cloneEntity, type, x => new InspectionConvertDTO()
{
VisitTaskId = x.VisitTaskId,
ObjectRelationParentId = x.VisitTaskId,
TrialReadingCriterionId = x.ReadingQuestionCriterionTrialId,
ExtraIndentification = extraIdentification,
}, new
{
QuestionAnswerList = taskQuestionAnswerList.Join(quesionList,
t => t.ReadingQuestionTrialId,
u => u.QuestionId,
(t, u) =>
new
{
Answer = u.AnswerType == "upload" ? "❄❅❆❇❈❉❊" + t.Answer : t.Answer + unitDataList.Where(y => y.Unit == u.Unit).Select(x => x.UnitName).FirstIsNullReturnEmpty()
,
u.DictionaryCode,
u.QuestionName,
u.QuestionEnName,
u.ShowOrder
}).OrderBy(t => t.ShowOrder).ToList()
,
TableQuestionAndAnswerList = tableQuesionAndAnswerList
}
);
}
}
}
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingTaskQuestionMark)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingTaskQuestionMark;
var answer = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionAnswer)).Select(x => x.Entity as ReadingTableQuestionAnswer)
.Where(x => x.RowId == entity.RowId && x.TableQuestionId == entity.TableQuestionId).Select(x => x.Answer).FirstOrDefault();
var liverSegmentation = await _dbContext.ReadingTableQuestionAnswer.Where(x => x.RowId == entity.RowId && x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.liverSegmentation).Select(x => x.Answer).FirstOrDefaultAsync();
await InsertInspection<ReadingTaskQuestionMark>(entity, type, x => new InspectionConvertDTO()
{
VisitTaskId = entity.VisitTaskId,
ObjectRelationParentId = entity.VisitTaskId,
}, new
{
Answer = answer,
LiverSegmentation = liverSegmentation,
});
}
//病灶这里操作 ReadingTableAnswerRowInfo ReadingTableQuestionAnswer
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableAnswerRowInfo)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as ReadingTableAnswerRowInfo;
var tableQuestionAnswerList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionAnswer)).Select(t => t.Entity as ReadingTableQuestionAnswer).Where(t => t.RowId == entity.Id).ToList();
List<UnitData> unitDataList = (await _dbContext.Dictionary.Where(x => x.Parent.Code == "ValueUnit").Where(x => x.Code != "0").ToListAsync()).Select(x => new UnitData()
{
Unit = (ValueUnit)int.Parse(x.Code),
}).ToList();
//获取表格问题名称 组合成数组
var tableQuesionList = await _dbContext.ReadingTableQuestionTrial.Where(t => tableQuestionAnswerList.Select(k => k.TableQuestionId).Contains(t.Id)).Select(t =>
new
{
TrialReadingCriterionId = t.ReadingQuestionTrial.ReadingQuestionCriterionTrialId, //标准Id
Type = t.ReadingQuestionTrial.QuestionName, //病灶类型
t.ReadingQuestionTrial.Unit,
t.ReadingQuestionTrial.CustomUnit,
t.DictionaryCode,
t.QuestionName,
t.QuestionEnName,
QuestionId = t.Id,
t.ShowOrder,
AnswerType = t.Type,
})
.OrderBy(t => t.ShowOrder).ToListAsync();
var trialReadingCriterionId = tableQuesionList.FirstOrDefault()?.TrialReadingCriterionId;
//获取表名称 类型名称(病灶类型) 不用查 从项目问题的稽查记录里面去取
//var tableName = await _dbContext.ReadingQuestionTrial.Where(t => t.Id == entity.QuestionId).Select(t => t.QuestionName).FirstOrDefaultAsync();
//分裂病灶 需要原病灶的标识
//if (_userInfo.RequestUrl == " ReadingImageTask/splitLesion")
var originalRowMark = string.Empty;
if (entity.SplitRowId != null)
{
originalRowMark = await _dbContext.ReadingTableAnswerRowInfo.Where(t => t.Id == entity.SplitRowId).Select(t => t.RowMark).FirstOrDefaultAsync();
}
//处理标识 因为触发器在稽查后才进行操作
if (entity.OrderMark == string.Empty)
{
entity.OrderMark = await _dbContext.ReadingQuestionTrial.Where(x => x.Id == entity.QuestionId).Select(x => x.OrderMark).FirstOrDefaultAsync();
}
entity.RowMark = entity.OrderMark + entity.RowIndex.GetLesionMark();
await InsertInspection<ReadingTableAnswerRowInfo>(entity, type, x => new InspectionConvertDTO()
{
VisitTaskId = x.VisitTaskId,
ObjectRelationParentId = x.VisitTaskId,
TrialReadingCriterionId = trialReadingCriterionId,
ObjectRelationParentId2 = x.QuestionId
}, new
{
OriginalRowMark = originalRowMark,
//TableName = tableName,
QuestionAnswerList =
//需要手动添加病灶类型
tableQuestionAnswerList.Join(tableQuesionList, t => t.TableQuestionId, u => u.QuestionId, (t, u) =>
new
{
//如果问题类型是附件 特殊处理 方便前端解析
Answer = u.AnswerType == "upload" ? "❄❅❆❇❈❉❊" + t.Answer : t.Answer + unitDataList.Where(y => y.Unit == u.Unit).Select(x => x.UnitName).FirstIsNullReturnEmpty(),
//t.Answer /*u.Unit==ValueUnit.Custom? t.Answer+u.CustomUnit:(u.Unit != ValueUnit.None|| u.Unit != null)*/,
u.QuestionName,
u.QuestionEnName,
u.DictionaryCode,
u.ShowOrder
}
).OrderBy(t => t.ShowOrder).ToList()
},_userInfo.AuditIdentification);
////添加/修改病灶接口 只会对单个病灶进行操作
//if (_userInfo.RequestUrl == "ReadingImageTask/submitTableQuestion")
//{
//}
////删除病灶接口 里面也有更新
//if (_userInfo.RequestUrl == "ReadingImageTask/deleteReadingRowAnswer")
//{
// //有删除 有修改 多条稽查记录
// var deleteList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionAnswer) && GetEntityAuditOpt(x) == AuditOpt.Deleted).Select(t => t.Entity as ReadingTableQuestionAnswer).ToList();
// var updateList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionAnswer) && GetEntityAuditOpt(x) == AuditOpt.Update).Select(t => t.Entity as ReadingTableQuestionAnswer).ToList();
//}
}
#endregion
#region 肿瘤学阅片结果 记录表格 废弃
//if (entitys.Any(x => x.entity.gettype() == typeof(readingoncologytaskinfo)))
//{
// var type = auditopt.add;
// var oncologyanswerlist = entitys.where(x => x.entity.gettype() == typeof(readingoncologytaskinfo)).select(t => t.entity as readingoncologytaskinfo);
// var visittaskidlist = oncologyanswerlist.select(t => t.visittaskid).tolist();
// var visittasklist = await _dbcontext.visittask.where(t => visittaskidlist.contains(t.id)).select(t => new { visittaskid = t.id, t.taskname, t.taskblindname, t.visittasknum, t.subjectid }).tolistasync();
// var modifyvisitlist = await _dbcontext.readingglobaltaskinfo.where(t => visittaskidlist.contains(t.taskid) && t.visittask.taskstate == taskstate.effect).groupby(t => t.taskid).select(g => new
// {
// visittaskid = g.key,
// globalresult = g.select(c => new { c.answer, c.questionid })
// }).tolistasync();
// //var oncologyanswervisitlist = visittasklist.join(oncologyanswerlist, t => t.visittaskid, u => u.visittaskid, (t, u) => new { t.visittaskid, t.taskblindname, t.taskname, u.evaluationreason, u.evaluationresult }).tolist();
// var query = from answer in oncologyanswerlist
// join visittask in visittasklist on answer.visittaskid equals visittask.visittaskid
// join modifyvisit in modifyvisitlist on answer.visittaskid equals modifyvisit.visittaskid into cc
// from modifyvisit in cc.defaultifempty()
// select new
// {
// visittask.taskblindname,
// visittask.taskname,
// answer.evaluationreason,
// answer.evaluationresult,
// isglobalmodify = modifyvisit != null,
// reason = modifyvisit != null ? modifyvisit.globalresult.where(t => t.questionid == null).firstordefault()?.answer : string.empty
// };
// var result = query.tolist();
// var oncologyanswer = oncologyanswerlist.first();
// var cloneentity = oncologyanswer.clone();
// cloneentity.id = newid.nextguid();
// await insertinspection<readingoncologytaskinfo>(oncologyanswer, type, x => new inspectionconvertdto()
// {
// visittaskid = oncologyanswer.visittaskid,
// objectrelationparentid = oncologyanswer.visittaskid,
// }, new { oncologyanswerlist = result });
//}
#endregion
// 全局 阅片结果
if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingGlobalTaskInfo)))
{
var type = AuditOpt.Add;
var list = entitys.Where(x => x.Entity.GetType() == typeof(ReadingGlobalTaskInfo)).Select(t => t.Entity as ReadingGlobalTaskInfo);
//不是固定问题的问题
var firstEntity = list.First();
var cloneEntity = firstEntity.Clone();
var criterion = await _dbContext.VisitTask.Where(t => t.Id == cloneEntity.GlobalTaskId).Select(t => new { t.TrialReadingCriterionId, t.TrialReadingCriterion.CriterionType }).FirstOrDefaultAsync();
//保证Id 唯一
cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.GlobalTaskId.ToString(), criterion.TrialReadingCriterionId.ToString());
var extraIdentification = string.Empty;
var objList = new List<object>();
foreach (var group in list.GroupBy(t => t.TaskId))
{
var questionAnswerList = group.Where(t => t.QuestionId != null).ToList();
var questionIdList = questionAnswerList.Select(t => t.QuestionId).ToList();
var quesionList = await _dbContext.ReadingQuestionTrial.Where(t => questionIdList.Contains(t.Id)).Select(t => new
{
QuestionName = t.QuestionName,
t.QuestionEnName,
QuestionId = t.Id,
t.DictionaryCode,
t.ShowOrder
}).OrderBy(t => t.ShowOrder).ToListAsync();
//pcwg3 的问题没有提交过来,是通过固定的方式去查询出来
if (criterion.CriterionType == CriterionType.PCWG3)
{
extraIdentification = "/PCWG3";
//获取访视的评估结果 也要记录稽查
var visitAnswerList = await _dbContext.ReadingTaskQuestionAnswer.Where(t => t.VisitTaskId == group.Key && t.ReadingQuestionTrial.GlobalReadingShowType != GlobalReadingShowType.NotShow).Select(u => new
{
TaskBlindName = u.VisitTask.TaskBlindName,
QuestionId = u.ReadingQuestionTrialId,
QuestionName = u.ReadingQuestionTrial.QuestionName,
u.ReadingQuestionTrial.QuestionEnName,
u.ReadingQuestionTrial.DictionaryCode,
u.ReadingQuestionTrial.ShowOrder,
u.Answer
}).OrderBy(t => t.ShowOrder).ToListAsync();
var obj = new
{
TaskBlindName = visitAnswerList.Select(t => t.TaskBlindName).FirstOrDefault(),
VisitQuestionAnswerList = visitAnswerList,
Reason = group.Where(t => t.QuestionId == null && t.GlobalAnswerType == GlobalAnswerType.Reason).FirstOrDefault()?.Answer,
QuestionAnswerList = questionAnswerList.Join(quesionList, t => t.QuestionId, u => u.QuestionId, (t, u) => new { t.Answer, u.QuestionName, u.QuestionEnName, u.DictionaryCode, u.ShowOrder }).OrderBy(t => t.ShowOrder).ToList()
};
objList.Add(obj);
}
else
{
//获取访视的评估结果 也要记录稽查
var visitAnswerList = await _dbContext.ReadingTaskQuestionAnswer.Where(t => t.VisitTaskId == group.Key && questionIdList.Contains(t.ReadingQuestionTrialId)).Select(u => new
{
TaskBlindName = u.VisitTask.TaskBlindName,
QuestionId = u.ReadingQuestionTrialId,
u.Answer
}).ToListAsync();
var obj = new
{
TaskBlindName = visitAnswerList.Select(t => t.TaskBlindName).FirstOrDefault(),
VisitQuestionAnswerList = visitAnswerList.Join(quesionList, t => t.QuestionId, u => u.QuestionId, (t, u) => new { t.Answer, u.QuestionName, u.DictionaryCode, u.ShowOrder }).OrderBy(t => t.ShowOrder).ToList(),
Reason = group.Where(t => t.QuestionId == null && t.GlobalAnswerType == GlobalAnswerType.Reason).FirstOrDefault()?.Answer,
AgreeOrNot = group.Where(t => t.QuestionId == null && t.GlobalAnswerType == GlobalAnswerType.AgreeOrNot).FirstOrDefault()?.Answer,
UpdateType = group.Where(t => t.QuestionId == null && t.GlobalAnswerType == GlobalAnswerType.UpdateType).FirstOrDefault()?.Answer,
QuestionAnswerList = questionAnswerList.Join(quesionList, t => t.QuestionId, u => u.QuestionId, (t, u) => new { t.Answer, u.QuestionName, u.QuestionEnName, u.DictionaryCode, u.ShowOrder }).OrderBy(t => t.ShowOrder).ToList()
};
objList.Add(obj);
}
}
await InsertInspection<ReadingGlobalTaskInfo>(cloneEntity, type, x => new InspectionConvertDTO()
{
VisitTaskId = x.GlobalTaskId,
TrialReadingCriterionId = criterion.TrialReadingCriterionId,
ObjectRelationParentId = x.TaskId,
ExtraIndentification = extraIdentification
}, new { GlobalAnswerList = objList });
}
//肿瘤学阅片结果
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingOncologyTaskInfo)))
{
var type = AuditOpt.Add;
var entity = item.Entity as ReadingOncologyTaskInfo;
await InsertInspection<ReadingOncologyTaskInfo>(entity, type, x => new InspectionConvertDTO()
{
VisitTaskId = entity.VisitTaskId,
ObjectRelationParentId = entity.VisitTaskId,
});
}
#endregion
//任务
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(VisitTask)))
{
var type = GetEntityAuditOpt(item);
var entity = item.Entity as VisitTask;
var userRealName = await _dbContext.User.Where(x => x.Id == entity.DoctorUserId).Select(x => x.FullName).FirstOrDefaultAsync();
VisitTaskAuditingDto obj = new VisitTaskAuditingDto()
{
UserRealName = userRealName,
};
var extraIdentification = string.Empty;
var isDistinctionInterface = true;
#region 标识区分
if (type == AuditOpt.Add)
{
isDistinctionInterface = false;
//生成一致性分析任务
if (entity.IsSelfAnalysis == true)
{
extraIdentification = "/SelfAnalysis";
}
else if (entity.IsSelfAnalysis == false)
{
extraIdentification = "/GroupAnalysis";
}
else
{
extraIdentification = "/NotAnalysis";
}
//区分任务类型
extraIdentification = extraIdentification + "/" + (int)entity.ReadingCategory;
}
else
{
switch (_userInfo.RequestUrl)
{
//申请重阅
case "VisitTask/applyReReading":
extraIdentification = "/" + (int)entity.ReReadingApplyState;
//PM 申请重阅区分不了是否有SPM参与
if (entity.ReReadingApplyState== ReReadingApplyState.TrialGroupHaveApplyed)
{
//var hasSPM = _dbContext.VisitTaskReReading.Any(t => t.OriginalReReadingTaskId == entity.Id);
var hasSPM = entitys.Where(x => x.Entity.GetType() == typeof(VisitTaskReReading))
.Select(t => t.Entity as VisitTaskReReading).Any(t => t.OriginalReReadingTaskId == entity.Id);
if (!hasSPM)
{
//有SPM 是5 没有SPM是6
extraIdentification = "/" + 6;
}
}
break;
//同意重阅
case "VisitTask/ConfirmReReading":
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM)
{
extraIdentification = "/" + 1;
}
else
{
extraIdentification = "/" + 2;
}
break;
case "VisitTask/PMSetTaskBack":
if (entity.PMBackReason.IsNotNullOrEmpty())
{
extraIdentification = "/" + "Reason";
}
break;
}
}
//访视任务-- 非Dicom 阅片
if (_userInfo.RequestUrl == "ReadingImageTask/SubmitVisitTaskQuestions" && entity.ReadingTaskState != ReadingTaskState.HaveSigned && type == AuditOpt.Update)
{
//提交访视任务的时候 会多次更新同一个记录 只记录最后一次
return;
}
//Dicom 阅片 签名
if (_userInfo.RequestUrl == "ReadingImageTask/SubmitDicomVisitTask")
{
//跳转阅片结果需要该参数
var subjectCode = _dbContext.Subject.Where(t => t.Id == entity.SubjectId).Select(t => t.Code).First();
obj.SubjectCode = subjectCode;
}
#region 裁判、肿瘤学、全局 都是通用的
//裁判任务 结果的保存 和签名提交
if (entity.JudgeResultTaskId != null && (_userInfo.RequestUrl == "ReadingImageTask/SaveJudgeVisitTaskResult" || _userInfo.RequestUrl == "ReadingImageTask/SubmitJudgeVisitTaskResult"))
{
var visitTaskNum = entity.VisitTaskNum - ReadingCommon.TaskNumDic[ReadingCategory.Judge];
var list = await _dbContext.VisitTask.Where(t => t.TaskState == TaskState.Effect && t.SubjectId == entity.SubjectId && t.VisitTaskNum == visitTaskNum && t.JudgeVisitTaskId == entity.Id && t.TrialReadingCriterionId == entity.TrialReadingCriterionId).Select(t => new { t.Id, t.DoctorUser.FullName, t.ArmEnum }).OrderBy(t => t.ArmEnum).ToListAsync();
var r1 = list.Where(t => t.ArmEnum == Arm.DoubleReadingArm1).FirstOrDefault();
var r2 = list.Where(t => t.ArmEnum == Arm.DoubleReadingArm2).FirstOrDefault();
obj.R1 = r1.FullName;
obj.R2 = r2.FullName;
obj.SelectResult = r1.Id == entity.JudgeResultTaskId ? "R1" : "R2";
}
#endregion
#region 通过链接跳转 2022 12-19
////肿瘤学任务
//if (entity.ReadingTaskState == ReadingTaskState.HaveSigned && _userInfo.RequestUrl == "ReadingImageTask/SubmitOncologyReadingInfo")
//{
// var oncologyAnswerList = await _dbContext.ReadingOncologyTaskInfo.Where(t => t.OncologyTaskId == entity.Id).Select(t => new { t.VisitTask.TaskBlindName, t.VisitTask.TaskName, t.EvaluationReason, t.EvaluationResult, t.VisitTask.VisitTaskNum, VisitTaskId = t.VisitTask.Id }).ToListAsync();
// var golbalTaskInfo = await _dbContext.VisitTask.Where(t => t.SubjectId == entity.SubjectId && t.ReadingCategory == ReadingCategory.Global && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == entity.IsAnalysisCreate && t.VisitTaskNum == (entity.VisitTaskNum - ReadingCommon.TaskNumDic[ReadingCategory.Oncology] + ReadingCommon.TaskNumDic[ReadingCategory.Global])).Select(t => new { GlobalTaskId = t.Id }).FirstNotNullAsync();
// var globalResultList = await _dbContext.ReadingGlobalTaskInfo.Where(t => t.GlobalTaskId == golbalTaskInfo.GlobalTaskId).ToListAsync();
// var modifyVisitList = globalResultList
// .GroupBy(t => t.TaskId).Select(g => new
// {
// VisitTaskId = g.Key,
// GlobalResult = g.Select(c => new { c.Answer, c.QuestionId })
// }).ToList();
// var query = from answer in oncologyAnswerList
// join modifyVisit in modifyVisitList on answer.VisitTaskId equals modifyVisit.VisitTaskId into cc
// from modifyVisit in cc.DefaultIfEmpty()
// select new
// {
// answer.TaskBlindName,
// answer.TaskName,
// answer.EvaluationReason,
// answer.EvaluationResult,
// IsGlobalModify = modifyVisit != null,
// Reason = modifyVisit != null ? modifyVisit.GlobalResult.Where(t => t.QuestionId == null).FirstOrDefault()?.Answer : String.Empty
// };
// var result = query.ToList();
// obj = new { OncologyAnswerList = result };
//}
////全局任务
//if (entity.ReadingTaskState == ReadingTaskState.HaveSigned && _userInfo.RequestUrl == "ReadingImageTask/SubmitGlobalReadingInfo")
//{
// var globalResultList = await _dbContext.ReadingGlobalTaskInfo.Where(t => t.GlobalTaskId == entity.Id).Select(t => new { VisitTaskId = t.TaskId, t.QuestionId, t.Answer, t.VisitTask.TaskBlindName, t.VisitTask.TaskName, t.TrialReadingQuestion.QuestionName }).ToListAsync();
// var visitTaskIdList = globalResultList.Select(t => t.VisitTaskId).ToList();
// var visitResultList = await _dbContext.ReadingTaskQuestionAnswer.Where(t => visitTaskIdList.Contains(t.VisitTaskId) && t.ReadingQuestionTrial.IsJudgeQuestion).Select(t => new { t.VisitTaskId, t.VisitTask.TaskBlindName, t.VisitTask.TaskName, t.VisitTask.VisitTaskNum, t.ReadingQuestionTrial.QuestionName, t.ReadingQuestionTrial.ShowOrder, t.Answer, t.ReadingQuestionTrialId })
// .OrderBy(t => t.VisitTaskNum).ToListAsync();
// var query = visitResultList.GroupBy(t => new { t.VisitTaskId, t.VisitTaskNum, t.TaskName, t.TaskBlindName }).Select(g => new
// {
// VisitTaskId = g.Key.VisitTaskId,
// VisitTaskNum = g.Key.VisitTaskNum,
// TaskName = g.Key.TaskName,
// TaskBlindName = g.Key.TaskBlindName,
// VisitQuestionAnswerList = g.OrderBy(t => t.ShowOrder).Select(u => new { u.QuestionName, u.Answer }).ToList(),
// GlobalQuestionAnswerList = g.OrderBy(t => t.ShowOrder).Select(u => new { u.QuestionName, Answer = globalResultList.Where(t => t.VisitTaskId == g.Key.VisitTaskId && t.QuestionId == u.ReadingQuestionTrialId).FirstOrDefault()?.Answer ?? String.Empty }).ToList(),
// Reason = globalResultList.Where(t => t.VisitTaskId == g.Key.VisitTaskId && t.QuestionId == null).FirstOrDefault()?.Answer ?? String.Empty
// });
// var result = query.ToList();
// obj = new { GlobalAnswerList = result };
//}
#endregion
#endregion
if (entity.SouceReadModuleId != null)
{
var subjectVisitId = await _dbContext.ReadModule.Where(x => x.Id == entity.SouceReadModuleId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync();
obj.CutOffVisitName = await _dbContext.SubjectVisit.Where(x => x.Id == subjectVisitId).Select(x => x.BlindName).FirstOrDefaultAsync();
}
await InsertInspection<VisitTask>(entity, type, x => new InspectionConvertDTO()
{
VisitTaskId = x.Id,
IsDistinctionInterface = isDistinctionInterface,
ExtraIndentification = extraIdentification,
ObjectRelationParentId = entity.SourceSubjectVisitId != null ? entity.SourceSubjectVisitId : entity.SouceReadModuleId,
ObjectRelationParentId2 = entity.DoctorUserId,
ObjectRelationParentId3 = entity.TrialReadingCriterionId,
}, obj);
}
#endregion
}
/// <summary>
/// 插入稽查实体
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="data">数据</param>
/// <param name="type">类型</param>
/// <param name="expression">表达式</param>
/// <param name="otherItem">其他对象</param>
/// <returns></returns>
public async Task InsertInspection<T>(T entityObj, string type, Expression<Func<T, InspectionConvertDTO>> expression = null, object otherItem = null,string auditIdentification = "") where T : Entity
{
InspectionConvertDTO inspection = new InspectionConvertDTO();
if (expression != null)
{
var f = expression.Compile();
inspection = f(entityObj);
}
//避免重复赋值 有些特殊的GeneralId
var generalId = (inspection.GeneralId != null && inspection.GeneralId != Guid.Empty) ? inspection.GeneralId : entityObj.Id;
inspection.GeneralId = generalId;
inspection.Identification = GetInspectionRecordIdentification(entityObj, type, inspection.IsDistinctionInterface, inspection.IsSelfDefine, auditIdentification) + inspection.ExtraIndentification;
//将实体对象属性 映射到稽查实体
MapEntityPropertyToAuditEntity(entityObj, inspection);
//var generalData = await GetInspectionGeneralDataAsync(inspection);
var generalData = await GetInspectionGeneralGuidAsync(inspection);
//不可少 因为稽查实体可能某些Id没有
MapEntityPropertyToAuditEntity(generalData, inspection);
#region 处理标识
var from = await _dbContext.FrontAuditConfig.FirstOrDefaultAsync(x => x.Identification == inspection.Identification);
inspection.ObjectTypeId = from?.ObjectTypeId;
inspection.OptTypeId = from?.OptTypeId;
//inspection.ChildrenTypeId = from?.ChildrenTypeId;
inspection.ModuleTypeId = from?.ModuleTypeId;
#endregion
inspection.CreateUserName = _userInfo.UserName;
inspection.CreateUserRealName = _userInfo.FullName;
inspection.RoleName = _userInfo.UserTypeShortName;
inspection.CreateUserId = _userInfo.UserRoleId;
inspection.IP = _userInfo.IP;
inspection.CreateTime = inspection.CreateTime == default(DateTime) ? DateTime.Now : inspection.CreateTime;
if (_userInfo.SignId != null)
{
inspection.SignId = _userInfo.SignId;
inspection.IsSign = true;
}
var entityName = entityObj.GetType().Name;
inspection.JsonDetail = new InspectionJsonDetail
{
//稽查实体,加上扩充的信息
//Data = AddJsonItem(entityObj, otherItem),
//通用信息 每条稽查必须记录的
//CommonData = generalData
EntityName = entityName,
//Data 仅仅记录稽查实体的信息 CommonData 存放关联数据的信息(特殊情况下会单独赋值)
//后期通过关联 就不需要把 OtherItem 并入到Data中
Data = AddJsonItem(entityObj, otherItem),
//准确来讲 此处称之为 RelationData 更贴合 为了兼容之前的数据
CommonData = new { SiteCode = generalData.SiteCode, SubjectCode = generalData.SubjectCode },
}.ToJsonStr();
inspection.BatchId = _userInfo.BatchId.Value;
inspection.EntityName = entityName;
await _dbContext.DataInspection.AddAsync(inspection);
//await AddInspectionRecordAsync( entityObj, inspection, otherItem);
}
/// <summary>
/// 将数据库实体属性,映射到稽查实体属性 避免重复赋值
/// </summary>
/// <param name="date"></param>
/// <param name="auditEntity"></param>
public void MapEntityPropertyToAuditEntity(object data, DataInspection auditEntity)
{
foreach (var auditEntityPropertyInfo in auditEntity.GetType().GetProperties())
{
var excepetNameList = typeof(Entity).GetProperties().Select(t => t.Name)
.Concat(typeof(ISoftDelete).GetProperties().Select(t => t.Name))
.Concat(typeof(IAuditAdd<>).GetProperties().Select(t => t.Name))
.Concat(typeof(IAuditUpdate<>).GetProperties().Select(t => t.Name));
var filterProperties = data.GetType().GetProperties().Where(t => !excepetNameList.Any(u => u == t.Name));
if (filterProperties.Any(t => t.Name == auditEntityPropertyInfo.Name))
{
var value = data.GetType().GetProperty(auditEntityPropertyInfo.Name).GetValue(data);
auditEntity.GetType().GetProperty(auditEntityPropertyInfo.Name).SetValue(auditEntity, value);
}
}
}
/// <summary>
/// 获取稽查通用Guid数据 (每条稽查记录必须查询的)
/// </summary>
/// <param name="inspection"></param>
/// <returns></returns>
public async Task<InspectionGeneralData> GetInspectionGeneralGuidAsync(InspectionConvertDTO inspection)
{
InspectionGeneralData generalData = new InspectionGeneralData()
{
TrialSiteId = inspection.TrialSiteId,
SubjectId = inspection.SubjectId,
SubjectVisitId = inspection.SubjectVisitId,
TrialId = inspection.TrialId,
TrialReadingCriterionId = inspection.TrialReadingCriterionId
};
if (inspection.VisitTaskId != null)
{
if (generalData.TrialId == null || generalData.TrialSiteId == null || generalData.SubjectId == null || generalData.TrialReadingCriterionId == null)
{
var info = await _dbContext.VisitTask.Where(x => x.Id == inspection.VisitTaskId).Select(x => new { SubjectCode = x.Subject.Code, TrialSiteCode = x.Subject.TrialSite.TrialSiteCode, SubjectId = x.SubjectId, x.Subject.TrialSiteId, x.TrialId, x.SourceSubjectVisitId, ReadModuleSubjectVisitId = (Guid?)x.ReadModule.SubjectVisitId, x.TrialReadingCriterionId }).FirstOrDefaultAsync();
generalData.TrialReadingCriterionId = info?.TrialReadingCriterionId ?? generalData.TrialReadingCriterionId;
generalData.TrialId = info?.TrialId ?? generalData.TrialId;
generalData.SubjectId = info?.SubjectId ?? generalData.SubjectId;
generalData.TrialSiteId = info?.TrialSiteId ?? generalData.TrialSiteId;
generalData.SubjectVisitId = info?.SourceSubjectVisitId != null ? info?.SourceSubjectVisitId : (info?.ReadModuleSubjectVisitId != null ? info?.ReadModuleSubjectVisitId : null);
//以后移除
generalData.SiteCode = info?.TrialSiteCode ?? generalData.SiteCode;
generalData.SubjectCode = info?.SubjectCode ?? generalData.SubjectCode;
}
}
if (inspection.TrialReadingCriterionId != null)
{
if (generalData.TrialId == null)
{
var info = await _dbContext.ReadingQuestionCriterionTrial.Where(x => x.Id == inspection.TrialReadingCriterionId).Select(x => new { x.TrialId }).FirstOrDefaultAsync();
generalData.TrialId = info?.TrialId ?? generalData.TrialId;
}
}
// Suject visit 都进行了设置 不用处理
if (inspection.SubjectVisitId != null)
{
if (generalData.TrialId == null || generalData.TrialSiteId == null || generalData.SubjectId == null)
{
var info = await _dbContext.SubjectVisit.Where(x => x.Id == generalData.SubjectVisitId).Select(x =>
new { x.SubjectId, x.TrialSiteId, x.TrialId, SubjectCode = x.Subject.Code, TrialSiteCode = x.Subject.TrialSite.TrialSiteCode }).FirstOrDefaultAsync();
generalData.TrialId = info?.TrialId ?? generalData.TrialId;
generalData.TrialSiteId = info?.TrialSiteId ?? generalData.TrialSiteId;
generalData.SubjectId = info?.SubjectId ?? generalData.SubjectId;
//以后移除
generalData.SiteCode = info?.TrialSiteCode ?? generalData.SiteCode;
generalData.SubjectCode = info?.SubjectCode ?? generalData.SubjectCode;
}
}
if (generalData.SubjectId != null)
{
if (generalData.TrialId == null || generalData.TrialSiteId == null)
{
var info = await _dbContext.Subject.Where(x => x.Id == generalData.SubjectId).Select(x => new { SubjectId = x.Id, x.TrialSiteId, x.TrialId, SubjectCode = x.Code, TrialSiteCode = x.TrialSite.TrialSiteCode }).FirstOrDefaultAsync();
if (info == null)
{
var subject = _dbContext.Subject.Find(generalData.SubjectId);
generalData.TrialId = subject?.TrialId;
generalData.TrialSiteId = subject?.TrialSiteId;
}
else
{
generalData.TrialId = info?.TrialId ?? generalData.TrialId;
generalData.TrialSiteId = info?.TrialSiteId ?? generalData.TrialSiteId;
}
//以后移除
generalData.SiteCode = info?.TrialSiteCode ?? generalData.SiteCode;
generalData.SubjectCode = info?.SubjectCode ?? generalData.SubjectCode;
}
}
return generalData;
}
/// <summary>
/// 获取稽查记录的标识符 部分业务会进行特殊处理
/// </summary>
/// <returns></returns>
public string GetInspectionRecordIdentification<T>(T entityObj, string type, bool IsDistinctionInterface = true, bool isSelfDefine = false,string auditIdentification="")
{
//var entityType = _dbContext.Model.FindEntityType(entityObj.GetType());
//var tableName = entityType.GetTableName();
var entityTypeName = entityObj.GetType().Name;
//文档签署这块,不区分系统和项目的 需要处理为同一个标识
//if (typeof(T) == typeof(TrialDocConfirmedUser) || typeof(T) == typeof(SystemDocConfirmedUser))
//{
// entityTypeName = "New/" + "UserSigned";
//}
string result = string.Empty;
//默认规则
if (IsDistinctionInterface)
{
//自定义 标识后面 补充由代码上层的 extraIdentification 附加
if (isSelfDefine)
{
result= $"{_userInfo.RequestUrl}/{entityTypeName}";
}
else
{
result= $"{_userInfo.RequestUrl}/{entityTypeName}/{type}";
}
}
else
{
//自定义 标识后面 补充由代码上层的 extraIdentification 附加
if (isSelfDefine)
{
result = $"{entityTypeName}";
}
else
{
result = $"{entityTypeName}/{type}";
}
}
if (auditIdentification.IsNotNullOrEmpty())
{
result = result + "/" + auditIdentification;
}
return result;
}
/// 往json里面添加属性
/// </summary>
/// <param name="jsonObj">json</param>
/// <param name="otherItem">添加对象</param>
/// <returns></returns>
public IDictionary<string, object> AddJsonItem(object jsonObj, object otherItem = null)
{
var JsonData = JsonConvert.DeserializeObject<IDictionary<string, object>>((jsonObj).ToJsonStr());
if (otherItem == null)
{
return JsonData;
}
var other = JsonConvert.DeserializeObject<IDictionary<string, object>>(otherItem.ToJsonStr());
foreach (var item in other)
{
if (JsonData.ContainsKey(item.Key))
{
JsonData[item.Key] = item.Value;
}
else
{
JsonData.Add(item.Key, item.Value);
}
}
return JsonData;
}
}
}