Merge branch 'Test.Study' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.Study
continuous-integration/drone/push Build is passing Details

Uat_Study^2
hang 2024-05-28 17:39:04 +08:00
commit 1b1ac3ee65
29 changed files with 400 additions and 224 deletions

View File

@ -32,7 +32,9 @@ namespace IRaCIS.Core.Application.Filter
if (context.Exception.GetType() == typeof(BusinessValidationFailedException)) if (context.Exception.GetType() == typeof(BusinessValidationFailedException))
{ {
context.Result = new JsonResult(ResponseOutput.NotOk(context.Exception.Message,ApiResponseCodeEnum.BusinessValidationFailed)); var error = context.Exception as BusinessValidationFailedException;
context.Result = new JsonResult(ResponseOutput.NotOk(context.Exception.Message, error!.Code));
} }
else if(context.Exception.GetType() == typeof(QueryBusinessObjectNotExistException)) else if(context.Exception.GetType() == typeof(QueryBusinessObjectNotExistException))
{ {

View File

@ -4521,6 +4521,11 @@
是否是第一次转化的任务 是否是第一次转化的任务
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetRelatedVisitTaskOutDto.IsExistsClinicalData">
<summary>
是否存在临床数据
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetGlobalReadingInfoInDto.UsingOriginalData"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetGlobalReadingInfoInDto.UsingOriginalData">
<summary> <summary>
当新答案为空的时候 是否是有原数据 当新答案为空的时候 是否是有原数据

View File

@ -364,6 +364,9 @@ namespace IRaCIS.Core.Application.ViewModel
{ {
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
public Guid? SubjectId { get; set; }
public Guid TrialReadingCriterionId { get; set; } public Guid TrialReadingCriterionId { get; set; }
public string? SubjectCode { get; set; } = null; public string? SubjectCode { get; set; } = null;

View File

@ -280,15 +280,15 @@ namespace IRaCIS.Core.Application.Service
var defaultState = trialReadingCriterionConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated; var defaultState = trialReadingCriterionConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated;
} }
}
}
await _visitTaskRepository.SaveChangesAsync(); await _visitTaskRepository.SaveChangesAsync();
} }
}
}

View File

@ -26,6 +26,7 @@ using IRaCIS.Application.Services.BackGroundJob;
using Magicodes.ExporterAndImporter.Core.Extension; using Magicodes.ExporterAndImporter.Core.Extension;
using Hangfire; using Hangfire;
using MassTransit; using MassTransit;
using static IRaCIS.Core.Domain.Models.ReadingQuestionTrial;
namespace IRaCIS.Core.Application.Service.Allocation namespace IRaCIS.Core.Application.Service.Allocation
{ {
@ -226,6 +227,8 @@ namespace IRaCIS.Core.Application.Service.Allocation
public async Task<IResponseOutput<PageOutput<PIReaingTaskView>>> GetPIReadingAuditList(VisitTaskQuery queryVisitTask) public async Task<IResponseOutput<PageOutput<PIReaingTaskView>>> GetPIReadingAuditList(VisitTaskQuery queryVisitTask)
{ {
//CriterionType? criterionType = _trialReadingCriterionRepository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t=>t.CriterionType).FirstOrDefault();
var visitTaskQueryable = GetReadingTaskQueryable(queryVisitTask) var visitTaskQueryable = GetReadingTaskQueryable(queryVisitTask)
.ProjectTo<PIReaingTaskView>(_mapper.ConfigurationProvider); .ProjectTo<PIReaingTaskView>(_mapper.ConfigurationProvider);
@ -237,6 +240,8 @@ namespace IRaCIS.Core.Application.Service.Allocation
var questionList = _readingQuestionTrialRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.ReadingQuestionCriterionTrialId == queryVisitTask.TrialReadingCriterionId) var questionList = _readingQuestionTrialRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.ReadingQuestionCriterionTrialId == queryVisitTask.TrialReadingCriterionId)
.Where(t => t.IsJudgeQuestion == true) .Where(t => t.IsJudgeQuestion == true)
//.WhereIf(criterionType!=null&& criterionType!=CriterionType.SelfDefine,t=>t.IsJudgeQuestion==true)
// .WhereIf(criterionType != null && criterionType == CriterionType.SelfDefine, t => t.AssessmentResultEnum == AssessmentResultType.AssessmentResult)
.Select(t => new { QuestionId = t.Id, QuestionName = _userInfo.IsEn_Us ? t.QuestionEnName : t.QuestionName ,t.DictionaryCode}).ToList(); .Select(t => new { QuestionId = t.Id, QuestionName = _userInfo.IsEn_Us ? t.QuestionEnName : t.QuestionName ,t.DictionaryCode}).ToList();
trialTaskConfig!.OtherObj = questionList; trialTaskConfig!.OtherObj = questionList;
@ -658,7 +663,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
var visitQuery = _visitTaskRepository var visitQuery = _visitTaskRepository
.Where(x => x.TrialId == inDto.TrialId && x.TaskState == TaskState.Effect) .Where(x => x.TrialId == inDto.TrialId && x.TaskState == TaskState.Effect)
.WhereIf(inDto.SubjectId!=null,t=>t.SubjectId==inDto.SubjectId)
//PI 读基线的时候subject 如果PI基线没阅片完SR就不能看 //PI 读基线的时候subject 如果PI基线没阅片完SR就不能看
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline && readingDivisionEnum == ReadingDivisionEnum.PIandSR, .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline && readingDivisionEnum == ReadingDivisionEnum.PIandSR,
t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect && c.TrialReadingCriterionId == trialReadingCriterionId)) t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect && c.TrialReadingCriterionId == trialReadingCriterionId))

View File

@ -4,6 +4,7 @@ using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using static IRaCIS.Core.Domain.Models.ReadingQuestionTrial;
namespace IRaCIS.Core.Application.Service namespace IRaCIS.Core.Application.Service
{ {
@ -85,7 +86,8 @@ namespace IRaCIS.Core.Application.Service
CreateMap<VisitTask, ReadingTaskView>().IncludeBase<VisitTask, VisitTaskView>() CreateMap<VisitTask, ReadingTaskView>().IncludeBase<VisitTask, VisitTaskView>()
.ForMember(t=>t.PIReadingResultList,u=>u.MapFrom(c=>c.ReadingTaskQuestionAnswerList .ForMember(t=>t.PIReadingResultList,u=>u.MapFrom(c=>c.ReadingTaskQuestionAnswerList
.Where(t=>t.ReadingQuestionTrial.IsJudgeQuestion==true ).Select(d=>new PIReadingResult() { QuestionId= d.ReadingQuestionTrialId,Answer=d.Answer}))); .Where(t=> /*t.ReadingQuestionCriterionTrial.CriterionType==CriterionType.SelfDefine? t.ReadingQuestionTrial.AssessmentResultEnum == AssessmentResultType.AssessmentResult:*/ t.ReadingQuestionTrial.IsJudgeQuestion==true)
.Select(d=>new PIReadingResult() { QuestionId= d.ReadingQuestionTrialId,Answer=d.Answer})));
CreateMap<VisitTask, PIReaingTaskView>().IncludeBase<VisitTask, ReadingTaskView>() CreateMap<VisitTask, PIReaingTaskView>().IncludeBase<VisitTask, ReadingTaskView>()
.ForMember(o => o.FirstAuditUserName, t => t.MapFrom(u => u.FirstAuditUser.UserName)) .ForMember(o => o.FirstAuditUserName, t => t.MapFrom(u => u.FirstAuditUser.UserName))

View File

@ -144,7 +144,8 @@ namespace IRaCIS.Core.Application.Service
await _internationalizationRepository.SaveChangesAsync(); await _internationalizationRepository.SaveChangesAsync();
//清理缓存
_provider.Set<List<InternationalizationSimpleDto>>(StaticData.InternationalData.Front, new List<InternationalizationSimpleDto>(), TimeSpan.FromDays(1));
return ResponseOutput.Ok(); return ResponseOutput.Ok();
} }
@ -183,6 +184,9 @@ namespace IRaCIS.Core.Application.Service
} }
//清理缓存
_provider.Set<List<InternationalizationSimpleDto>>(StaticData.InternationalData.Front, new List<InternationalizationSimpleDto>(), TimeSpan.FromDays(1));
return ResponseOutput.Ok(entity.Id.ToString()); return ResponseOutput.Ok(entity.Id.ToString());
} }
@ -192,6 +196,9 @@ namespace IRaCIS.Core.Application.Service
public async Task<IResponseOutput> DeleteInternationalization(Guid internationalizationId) public async Task<IResponseOutput> DeleteInternationalization(Guid internationalizationId)
{ {
var success = await _internationalizationRepository.DeleteFromQueryAsync(t => t.Id == internationalizationId, true); var success = await _internationalizationRepository.DeleteFromQueryAsync(t => t.Id == internationalizationId, true);
//清理缓存
_provider.Set<List<InternationalizationSimpleDto>>(StaticData.InternationalData.Front, new List<InternationalizationSimpleDto>(), TimeSpan.FromDays(1));
return ResponseOutput.Ok(); return ResponseOutput.Ok();
} }

View File

@ -1322,13 +1322,14 @@ namespace IRaCIS.Core.Application.Service
/// </summary> /// </summary>
/// <param name="queryEmailNoticeConfig"></param> /// <param name="queryEmailNoticeConfig"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost]
public async Task<PageOutput<TrialSelectEmailNoticeConfigView>> GetSysEmailNoticeConfigList(EmailNoticeConfigQuery queryEmailNoticeConfig) public async Task<PageOutput<TrialSelectEmailNoticeConfigView>> GetSysEmailNoticeConfigList(EmailNoticeConfigQuery queryEmailNoticeConfig)
{ {
var emailNoticeConfigQueryable = _emailNoticeConfigRepository var emailNoticeConfigQueryable = _emailNoticeConfigRepository
.WhereIf(queryEmailNoticeConfig.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == queryEmailNoticeConfig.BusinessScenarioEnum) .WhereIf(queryEmailNoticeConfig.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == queryEmailNoticeConfig.BusinessScenarioEnum)
.WhereIf(queryEmailNoticeConfig.IsReturnRequired != null, t => t.IsReturnRequired == queryEmailNoticeConfig.IsReturnRequired) .WhereIf(queryEmailNoticeConfig.IsReturnRequired != null, t => t.IsReturnRequired == queryEmailNoticeConfig.IsReturnRequired)
.WhereIf(queryEmailNoticeConfig.IsEnable != null, t => t.IsEnable == queryEmailNoticeConfig.IsEnable) .WhereIf(queryEmailNoticeConfig.IsEnable != null, t => t.IsEnable == queryEmailNoticeConfig.IsEnable)
.WhereIf(queryEmailNoticeConfig.CriterionTypeEnum != null, t => t.CriterionTypeEnum == queryEmailNoticeConfig.CriterionTypeEnum)
.ProjectTo<TrialSelectEmailNoticeConfigView>(_mapper.ConfigurationProvider, new { trialId = queryEmailNoticeConfig.TrialId }); .ProjectTo<TrialSelectEmailNoticeConfigView>(_mapper.ConfigurationProvider, new { trialId = queryEmailNoticeConfig.TrialId });
return await emailNoticeConfigQueryable.ToPagedListAsync(queryEmailNoticeConfig.PageIndex, queryEmailNoticeConfig.PageSize, queryEmailNoticeConfig.SortField, queryEmailNoticeConfig.Asc); return await emailNoticeConfigQueryable.ToPagedListAsync(queryEmailNoticeConfig.PageIndex, queryEmailNoticeConfig.PageSize, queryEmailNoticeConfig.SortField, queryEmailNoticeConfig.Asc);

View File

@ -319,9 +319,9 @@ namespace IRaCIS.Core.Application.Service
{ {
continue; continue;
} }
str = await GetInspectionEnumValue(listIdentification, str); str = await GetInspectionEnumValue(listIdentification, item.Identification, str);
str = await SetEnum(dto.TrialId, listIdentification, str); str = await SetEnum(dto.TrialId, listIdentification, item.Identification, str);
str = await SetDataInspectionDateType(listIdentification, str); str = await SetDataInspectionDateType(listIdentification, item.Identification, str);
jsonDict[nameof(InspectionJsonDetail.Data)] = JsonConvert.DeserializeObject<object>(str); jsonDict[nameof(InspectionJsonDetail.Data)] = JsonConvert.DeserializeObject<object>(str);
@ -331,9 +331,9 @@ namespace IRaCIS.Core.Application.Service
{ {
continue; continue;
} }
str2 = await GetInspectionEnumValue(listIdentification, str2); str2 = await GetInspectionEnumValue(listIdentification, item.Identification, str2);
str2 = await SetEnum(dto.TrialId, listIdentification, str2); str2 = await SetEnum(dto.TrialId, listIdentification, item.Identification, str2);
str2 = await SetDataInspectionDateType(listIdentification, str2); str2 = await SetDataInspectionDateType(listIdentification, item.Identification, str2);
jsonDict[nameof(InspectionJsonDetail.CommonData)] = JsonConvert.DeserializeObject<object>(str2); jsonDict[nameof(InspectionJsonDetail.CommonData)] = JsonConvert.DeserializeObject<object>(str2);
#endregion #endregion
@ -456,20 +456,23 @@ namespace IRaCIS.Core.Application.Service
/// <param name="identificationList"></param> /// <param name="identificationList"></param>
/// <param name="jsonStr"></param> /// <param name="jsonStr"></param>
/// <returns></returns> /// <returns></returns>
private async Task<string> SetDataInspectionDateType(List<string> identificationList, string jsonStr) private async Task<string> SetDataInspectionDateType(List<string> identificationList,string identification, string jsonStr)
{ {
var list = await (from parent in _frontAuditConfigRepository.AsQueryable().Where(x => identificationList.Contains(x.Identification)) var list = await (from parent in _frontAuditConfigRepository.AsQueryable().Where(x => identificationList.Contains(x.Identification))
join child in _frontAuditConfigRepository.AsQueryable().Where(x => x.EnumType == "Date" && x.IsEnable) on parent.Id equals child.ParentId join child in _frontAuditConfigRepository.AsQueryable().Where(x => x.EnumType == "Date" && x.IsEnable) on parent.Id equals child.ParentId
select new DateDto() select new DateDto()
{ {
Identification= parent.Identification,
Code = child.Code, Code = child.Code,
DateType = child.DateType, DateType = child.DateType,
}).ToListAsync(); }).ToListAsync();
list = list.GroupBy(x => new { x.Code }, (key, lst) => new DateDto() list = list.GroupBy(x => new { x.Code }, (key, lst) => new DateDto()
{ {
Code = key.Code, Code = key.Code,
DateType = lst.Max(x => x.DateType), DateType = lst.FirstOrDefault(y => y.Identification == identification)?.DateType ?? lst.Max(x => x.DateType),
}).ToList(); }).ToList();
var jsonDataDic = JsonConvert.DeserializeObject<IDictionary<string, object>>(jsonStr); var jsonDataDic = JsonConvert.DeserializeObject<IDictionary<string, object>>(jsonStr);
@ -519,13 +522,14 @@ namespace IRaCIS.Core.Application.Service
///// <param name="ForeignKeyValue">外键value</param> ///// <param name="ForeignKeyValue">外键value</param>
///// <param name="ForeignKeyText">要查询的外键值</param> ///// <param name="ForeignKeyText">要查询的外键值</param>
///// <param name="value">传入的纸</param> ///// <param name="value">传入的纸</param>
private async Task<string> GetInspectionEnumValue(List<string> identificationList, string jsonStr) private async Task<string> GetInspectionEnumValue(List<string> identificationList,string identification, string jsonStr)
{ {
var list = await (from u in _frontAuditConfigRepository.Where(x => identificationList.Contains(x.Identification)) var list = await (from u in _frontAuditConfigRepository.Where(x => identificationList.Contains(x.Identification))
join p in _frontAuditConfigRepository.Where(x => x.EnumType == "Foreign" && x.IsEnable) on u.Id equals p.ParentId join p in _frontAuditConfigRepository.Where(x => x.EnumType == "Foreign" && x.IsEnable) on u.Id equals p.ParentId
select new select new
{ {
Key = p.Code, Key = p.Code,
Identification=u.Identification,
ForeignKeyValue = p.ForeignKeyValue, ForeignKeyValue = p.ForeignKeyValue,
ForeignKeyText = p.ForeignKeyText, ForeignKeyText = p.ForeignKeyText,
ForeignKeyTable = p.ForeignKeyTableName ForeignKeyTable = p.ForeignKeyTableName
@ -533,9 +537,10 @@ namespace IRaCIS.Core.Application.Service
list = list.GroupBy(x => new { x.Key }, (key, lst) => new list = list.GroupBy(x => new { x.Key }, (key, lst) => new
{ {
Key = key.Key, Key = key.Key,
ForeignKeyValue = lst.Max(x => x.ForeignKeyValue), Identification=string.Empty,
ForeignKeyText = lst.Max(x => x.ForeignKeyText), ForeignKeyValue= lst.FirstOrDefault(y => y.Identification == identification)?.ForeignKeyValue ?? lst.Max(x => x.ForeignKeyValue),
ForeignKeyTable = lst.Max(x => x.ForeignKeyTable), ForeignKeyText = lst.FirstOrDefault(y => y.Identification == identification)?.ForeignKeyText ?? lst.Max(x => x.ForeignKeyText),
ForeignKeyTable = lst.FirstOrDefault(y => y.Identification == identification)?.ForeignKeyTable ?? lst.Max(x => x.ForeignKeyTable),
}).ToList(); }).ToList();
@ -585,7 +590,7 @@ namespace IRaCIS.Core.Application.Service
/// <param name="identificationList">标识</param> /// <param name="identificationList">标识</param>
/// <param name="jsonStr">Json对象</param> /// <param name="jsonStr">Json对象</param>
/// <returns></returns> /// <returns></returns>
private async Task<string> SetEnum(Guid trialId, List<string> identificationList, string jsonStr) private async Task<string> SetEnum(Guid trialId, List<string> identificationList, string identification, string jsonStr)
{ {
if (jsonStr == null || jsonStr == "null") if (jsonStr == null || jsonStr == "null")
{ {
@ -598,16 +603,29 @@ namespace IRaCIS.Core.Application.Service
join p in _frontAuditConfigRepository.Where(x => (x.DictionaryCode != string.Empty && x.EnumType == "Dictionary") || (x.DataType == "Table") && x.IsEnable) on u.Id equals p.ParentId join p in _frontAuditConfigRepository.Where(x => (x.DictionaryCode != string.Empty && x.EnumType == "Dictionary") || (x.DataType == "Table") && x.IsEnable) on u.Id equals p.ParentId
select new select new
{ {
Key = p.Code,
Identification = u.Identification,
//前端展示类型 //前端展示类型
DataType = p.DataType, DataType = p.DataType,
TableConfigJsonStr = p.TableConfigJsonStr, TableConfigJsonStr = p.TableConfigJsonStr,
Key = p.Code,
Code = p.DictionaryCode, Code = p.DictionaryCode,
Type = p.DictionaryType Type = p.DictionaryType
}).ToListAsync(); }).ToListAsync();
//两条不同的标识 但是里面配置有相同的翻译字典 //两条不同的标识 但是里面配置有相同的翻译字典
list = list.Distinct().ToList(); list = list.GroupBy(x => new { x.Key }, (key, lst) => new
{
Key = key.Key,
Identification = string.Empty,
DataType = lst.FirstOrDefault(y => y.Identification == identification)?.DataType ?? lst.Max(x => x.DataType),
TableConfigJsonStr = lst.FirstOrDefault(y => y.Identification == identification)?.TableConfigJsonStr ?? lst.Max(x => x.TableConfigJsonStr),
Code = lst.FirstOrDefault(y => y.Identification == identification)?.Code ?? lst.Max(x => x.Code),
Type = lst.FirstOrDefault(y => y.Identification == identification)?.Type ?? lst.Max(x => x.Type),
}).ToList();
// 添加单双审 // 添加单双审
var trialtype = await _trialRepository.AsQueryable().Where(x => x.Id == trialId).Select(x => x.QCProcessEnum).FirstOrDefaultAsync(); var trialtype = await _trialRepository.AsQueryable().Where(x => x.Id == trialId).Select(x => x.QCProcessEnum).FirstOrDefaultAsync();
@ -616,9 +634,10 @@ namespace IRaCIS.Core.Application.Service
{ {
list.Add(new list.Add(new
{ {
Key = "AuditState",
Identification = string.Empty,
DataType = string.Empty, DataType = string.Empty,
TableConfigJsonStr = string.Empty, TableConfigJsonStr = string.Empty,
Key = "AuditState",
Code = trialtype == TrialQCProcess.SingleAudit ? "AuditStatePE" : "AuditStateRC", Code = trialtype == TrialQCProcess.SingleAudit ? "AuditStatePE" : "AuditStateRC",
Type = "Code", Type = "Code",
}); });

View File

@ -35,6 +35,9 @@ namespace IRaCIS.Application.Contracts
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
public string SiteName { get; set; } = String.Empty; public string SiteName { get; set; } = String.Empty;
public string SiteNameCN { get; set; } = String.Empty;
public string City { get; set; } = String.Empty; public string City { get; set; } = String.Empty;
public string Province { get; set; } = string.Empty; public string Province { get; set; } = string.Empty;

View File

@ -3,6 +3,7 @@ using IRaCIS.Application.Contracts;
using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Infra.EFCore;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using Microsoft.Data.Sqlite;
namespace IRaCIS.Application.Services namespace IRaCIS.Application.Services
{ {
@ -10,11 +11,12 @@ namespace IRaCIS.Application.Services
public class HospitalService : BaseService, IHospitalService public class HospitalService : BaseService, IHospitalService
{ {
private readonly IRepository<Hospital> _hospitalRepository; private readonly IRepository<Hospital> _hospitalRepository;
private readonly IRepository<Site> _siteRepository;
public HospitalService(IRepository<Hospital> hospitalRepository ) public HospitalService(IRepository<Hospital> hospitalRepository, IRepository<Site> siteRepository)
{ {
_hospitalRepository = hospitalRepository; _hospitalRepository = hospitalRepository;
_siteRepository = siteRepository;
} }
/// <summary> 获取所有医院列表 </summary> /// <summary> 获取所有医院列表 </summary>
@ -37,13 +39,24 @@ namespace IRaCIS.Application.Services
var exp1 = new EntityVerifyExp<Hospital>() var exp1 = new EntityVerifyExp<Hospital>()
{ {
VerifyExp = x => x.SiteId == hospitalCommand.SiteId && hospitalCommand.SiteId != null, VerifyExp = x => x.SiteId == hospitalCommand.SiteId && hospitalCommand.SiteId != null,
//---已经存在同名的医院,请确认 //---当前中心已经添加到其他医院了
VerifyMsg = _localizer["Hospital_SiteAdded"] VerifyMsg = _localizer["Hospital_SiteAdded"]
}; };
var hospital = await _hospitalRepository.InsertOrUpdateAsync(hospitalCommand, true, exp, exp1); var hospital = await _hospitalRepository.InsertOrUpdateAsync(hospitalCommand, true, exp, exp1);
//手动解绑医院与site的关系
if (hospitalCommand.SiteId == null && hospital.SiteId != null)
{
await _siteRepository.BatchUpdateNoTrackingAsync(t => t.Id == hospital.SiteId, u => new Site() { HospitalId = null });
}
//手动绑
if (hospitalCommand.SiteId != null)
{
await _siteRepository.BatchUpdateNoTrackingAsync(t => t.Id == hospitalCommand.SiteId, u => new Site() { HospitalId = hospital.Id });
}
return ResponseOutput.Ok(hospital.Id.ToString()); return ResponseOutput.Ok(hospital.Id.ToString());
} }
@ -55,11 +68,6 @@ namespace IRaCIS.Application.Services
public async Task<IResponseOutput> DeleteHospital(Guid hospitalId) public async Task<IResponseOutput> DeleteHospital(Guid hospitalId)
{ {
//if (_userRepository.Find().Any(t => t.OrganizationId == hospitalId))
//{
// return ResponseOutput.NotOk("该医院下存在用户,暂时无法删除。");
//}
var success = await _hospitalRepository.BatchDeleteNoTrackingAsync(x => x.Id == hospitalId); var success = await _hospitalRepository.BatchDeleteNoTrackingAsync(x => x.Id == hospitalId);
return ResponseOutput.Result(success); return ResponseOutput.Result(success);

View File

@ -4,6 +4,7 @@ using IRaCIS.Core.Infra.EFCore;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using Medallion.Threading; using Medallion.Threading;
using IRaCIS.Core.Domain.Models;
namespace IRaCIS.Application.Services namespace IRaCIS.Application.Services
{ {
@ -13,12 +14,14 @@ namespace IRaCIS.Application.Services
private readonly IRepository<Site> _siteRepository; private readonly IRepository<Site> _siteRepository;
private readonly IRepository<TrialSiteUser> _trialSiteUserRepository; private readonly IRepository<TrialSiteUser> _trialSiteUserRepository;
private readonly IDistributedLockProvider _distributedLockProvider; private readonly IDistributedLockProvider _distributedLockProvider;
private readonly IRepository<Hospital> _hospitalRepository;
public SiteService(IRepository<Site> siteRepository, IRepository<TrialSiteUser> trialSiteUserRepository, IDistributedLockProvider distributedLockProvider) public SiteService(IRepository<Site> siteRepository, IRepository<TrialSiteUser> trialSiteUserRepository, IDistributedLockProvider distributedLockProvider, IRepository<Hospital> hospitalRepository)
{ {
_siteRepository = siteRepository; _siteRepository = siteRepository;
_trialSiteUserRepository = trialSiteUserRepository; _trialSiteUserRepository = trialSiteUserRepository;
_distributedLockProvider = distributedLockProvider; _distributedLockProvider = distributedLockProvider;
_hospitalRepository = hospitalRepository;
} }
/// <summary> 分页获取研究中心列表 </summary> /// <summary> 分页获取研究中心列表 </summary>
@ -72,6 +75,18 @@ namespace IRaCIS.Application.Services
var site = await _siteRepository.InsertOrUpdateAsync(siteCommand, true, exp); var site = await _siteRepository.InsertOrUpdateAsync(siteCommand, true, exp);
//手动解绑医院与site的关系
if (siteCommand.HospitalId == null && site.HospitalId != null)
{
await _hospitalRepository.BatchUpdateNoTrackingAsync(t => t.Id == site.HospitalId, u => new Hospital() { SiteId = null });
}
//手动绑
if (siteCommand.HospitalId != null)
{
await _hospitalRepository.BatchUpdateNoTrackingAsync(t => t.Id == siteCommand.HospitalId, u => new Hospital() { SiteId = site.Id });
}
return ResponseOutput.Ok(site.Id.ToString()); return ResponseOutput.Ok(site.Id.ToString());
} }

View File

@ -311,7 +311,7 @@ namespace IRaCIS.Application.Services
{ {
//检查手机或者邮箱是否有效 //检查手机或者邮箱是否有效
if (!Regex.IsMatch(email, @"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$")) if (!Regex.IsMatch(email, @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
{ {
//---请输入一个正确的邮箱。 //---请输入一个正确的邮箱。

View File

@ -1355,40 +1355,40 @@ namespace IRaCIS.Core.Application.Image.QA
//dbSubjectVisit.Subject.IsMissingImages = await _subjectVisitRepository.AnyAsync(t => (t.VisitNum < maxVisitNum && t.SubmitState != SubmitStateEnum.Submitted && t.IsLostVisit == false)); //dbSubjectVisit.Subject.IsMissingImages = await _subjectVisitRepository.AnyAsync(t => (t.VisitNum < maxVisitNum && t.SubmitState != SubmitStateEnum.Submitted && t.IsLostVisit == false));
//项目或者Subject IsUrgent 提交时 访视也设置为紧急 //项目或者Subject IsUrgent 提交时 访视也设置为紧急
if (trialConfig.IsUrgent || dbSubjectVisit.Subject.IsUrgent || (dbSubjectVisit.PDState == PDStateEnum.PDProgress && !dbSubjectVisit.IsBaseLine) || (dbSubjectVisit.IsEnrollmentConfirm && dbSubjectVisit.IsBaseLine)) if (trialConfig.IsUrgent || dbSubjectVisit.Subject.IsUrgent || (dbSubjectVisit.IsEnrollmentConfirm && dbSubjectVisit.IsBaseLine))
{ {
if (dbSubjectVisit.PDState == PDStateEnum.PDProgress) //if (dbSubjectVisit.PDState == PDStateEnum.PDProgress)
{ //{
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(x => x.SubjectId == dbSubjectVisit.SubjectId && x.VisitNum <= dbSubjectVisit.VisitNum, x => new SubjectVisit() // await _subjectVisitRepository.BatchUpdateNoTrackingAsync(x => x.SubjectId == dbSubjectVisit.SubjectId && x.VisitNum <= dbSubjectVisit.VisitNum, x => new SubjectVisit()
{ // {
IsUrgent = true // IsUrgent = true
}); // });
// await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId &&
// dbSubjectVisit.VisitNum <= x.VisitTaskNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的访视 全局 裁判 及之前 全都加急
// && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask()
// {
// IsUrgent = true,
// TaskUrgentType = TaskUrgentType.PDProgress,
// IsCanEditUrgentState = false,
// });
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId)&& x.SubjectId == dbSubjectVisit.SubjectId&& // await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId
dbSubjectVisit.VisitNum<= x.VisitTaskNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum+0.01m) // 当前的访视 全局 裁判 及之前 全都加急 // && x.VisitTaskNum < dbSubjectVisit.VisitNum // 当前的访视 全局 裁判 及之前 全都加急
&& x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask() // && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask()
{ // {
IsUrgent = true, // IsUrgent = true,
TaskUrgentType = TaskUrgentType.PDProgress, // TaskUrgentType = TaskUrgentType.Other,
IsCanEditUrgentState=false, // TaskUrgentRemake = "后续访视设为pd",
}); // IsCanEditUrgentState = false,
// });
//}
//else
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId if (dbSubjectVisit.IsEnrollmentConfirm)
&& x.VisitTaskNum < dbSubjectVisit.VisitNum // 当前的访视 全局 裁判 及之前 全都加急
&& x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask()
{
IsUrgent = true,
TaskUrgentType = TaskUrgentType.Other,
TaskUrgentRemake= "后续访视设为pd",
IsCanEditUrgentState = false,
});
}
else if (dbSubjectVisit.IsEnrollmentConfirm)
{ {
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(x => x.Id == dbSubjectVisit.Id, x => new SubjectVisit() await _subjectVisitRepository.BatchUpdateNoTrackingAsync(x => x.Id == dbSubjectVisit.Id, x => new SubjectVisit()
{ {
@ -1420,14 +1420,14 @@ namespace IRaCIS.Core.Application.Image.QA
dbSubjectVisit.IsUrgent = true; dbSubjectVisit.IsUrgent = true;
//PD确认的紧急会把前面所有未QC完成的访视均标记为紧急 ////PD确认的紧急会把前面所有未QC完成的访视均标记为紧急
var previosSVlist = await _subjectVisitRepository.Where(t => t.SubjectId == dbSubjectVisit.SubjectId && t.VisitNum < dbSubjectVisit.VisitNum && t.IsUrgent == false && t.SubmitState == SubmitStateEnum.Submitted, true).ToListAsync(); //var previosSVlist = await _subjectVisitRepository.Where(t => t.SubjectId == dbSubjectVisit.SubjectId && t.VisitNum < dbSubjectVisit.VisitNum && t.IsUrgent == false && t.SubmitState == SubmitStateEnum.Submitted, true).ToListAsync();
previosSVlist.ForEach(t => //previosSVlist.ForEach(t =>
{ //{
t.IsUrgent = true; // t.IsUrgent = true;
}); //});
} }

View File

@ -104,7 +104,7 @@ namespace IRaCIS.Core.Application.Service
.ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code)) .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code))
.ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.TrialSite.TrialSiteCode)) .ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.TrialSite.TrialSiteCode))
.ForMember(d => d.CheckDialogStr, u => u.MapFrom(t => string.Join(" | ", t.CheckChallengeDialogList.OrderBy(t => t.CreateTime).Select(c => c.CreateUser.UserName + " " + c.CreateTime.ToString("yyyy-mm-dd hh:mm:ss") + " :" + c.TalkContent)))) .ForMember(d => d.CheckDialogStr, u => u.MapFrom(t => string.Join(" | ", t.CheckChallengeDialogList.OrderBy(t => t.CreateTime).Select(c => c.CreateUser.UserName + " " + c.CreateTime.ToString("yyyy-MM-dd HH:mm:ss") + " :" + c.TalkContent))))
.ForMember(d => d.ModalityList, c => c.MapFrom(s => .ForMember(d => d.ModalityList, c => c.MapFrom(s =>
(s.NoneDicomStudyList.Select(t => t.Modality) (s.NoneDicomStudyList.Select(t => t.Modality)
.Union(s.StudyList.Select(k => k.ModalityForEdit))).Distinct())) .Union(s.StudyList.Select(k => k.ModalityForEdit))).Distinct()))

View File

@ -204,7 +204,8 @@ namespace IRaCIS.Application.Services
Path = x.ClinicalDataTrialSet.Path, Path = x.ClinicalDataTrialSet.Path,
IsBlind = x.IsBlind, IsBlind = x.IsBlind,
IsComplete = x.IsComplete, IsComplete = x.IsComplete,
ClinicalFromList=x.Subject.ClinicalFormList.Where(y=>y.ReadingId==x.ReadingId&&y.ClinicalDataTrialSetId==x.ClinicalDataTrialSetId).Select(y=> new ClinicalFromData() { ClinicalFromList = x.Subject.ClinicalFormList.Where(y => y.ReadingId == x.ReadingId && y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Select(y => new ClinicalFromData()
{
CheckDate = y.CheckDate, CheckDate = y.CheckDate,
ClinicalFormId = y.Id ClinicalFormId = y.Id
}).ToList(), }).ToList(),
@ -304,8 +305,25 @@ namespace IRaCIS.Application.Services
await this.iServiceProvider.GetService<IReadingImageTaskService>().AddOncologyTask(readingId); await this.iServiceProvider.GetService<IReadingImageTaskService>().AddOncologyTask(readingId);
//如果先生成了任务再签名subject级别 PM 临床数据,那么会导致其他标准的任务签名状态无法得到维护
if (await _repository.AnyAsync<ClinicalDataTrialSet>(t => t.Id == data.ClinicalDataTrialSetId && t.UploadRole == UploadRole.PM && t.ClinicalDataLevel == ClinicalLevel.Subject))
{
var needDealTrialReadingCriterionIdList = _repository.Where<ClinicalDataTrialSet>(t => t.Id == data.ClinicalDataTrialSetId)
.SelectMany(t => t.TrialClinicalDataSetCriteriaList)
.Select(u => u.TrialReadingCriterionId).Distinct().ToList();
foreach (var trialReadingCriterionId in needDealTrialReadingCriterionIdList)
{
await DealVisiTaskClinicalDataSignedAsync(data.TrialId, data.SubjectId, data.ReadingId, data.IsVisit, trialReadingCriterionId);
}
}
else
{
await DealVisiTaskClinicalDataSignedAsync(data.TrialId, data.SubjectId, data.ReadingId, data.IsVisit, inDto.TrialReadingCriterionId); await DealVisiTaskClinicalDataSignedAsync(data.TrialId, data.SubjectId, data.ReadingId, data.IsVisit, inDto.TrialReadingCriterionId);
}
return ResponseOutput.Result(result); return ResponseOutput.Result(result);
} }
@ -710,7 +728,8 @@ namespace IRaCIS.Application.Services
var readingIds = result.Select(x => x.ReadingId).ToList(); var readingIds = result.Select(x => x.ReadingId).ToList();
var clinical = await _clinicalFormRepository.Where(x => readingIds.Contains(x.ReadingId ?? default(Guid))).ToListAsync(); var clinical = await _clinicalFormRepository.Where(x => readingIds.Contains(x.ReadingId ?? default(Guid))).ToListAsync();
result.Where(x => x.ClinicalUploadType == ClinicalUploadType.Structuring).ForEach(x => { result.Where(x => x.ClinicalUploadType == ClinicalUploadType.Structuring).ForEach(x =>
{
x.ClinicalFromList = clinical.Where(y => y.ReadingId == x.ReadingId && y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Select(y => new ClinicalFromData() x.ClinicalFromList = clinical.Where(y => y.ReadingId == x.ReadingId && y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Select(y => new ClinicalFromData()
{ {
@ -730,7 +749,8 @@ namespace IRaCIS.Application.Services
{ {
var moduleCriterionFromList = await _readModuleCriterionFromRepository var moduleCriterionFromList = await _readModuleCriterionFromRepository
.WhereIf(inDto.ClinicalDataTrialSetId != null, x => x.ClinicalForm.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId) .WhereIf(inDto.ClinicalDataTrialSetId != null, x => x.ClinicalForm.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId)
.Where(x => x.ReadModuleId == readModule.Id).Select(x => new{ .Where(x => x.ReadModuleId == readModule.Id).Select(x => new
{
ClinicalFormId = x.ClinicalFormId, ClinicalFormId = x.ClinicalFormId,
CheckDate = x.ClinicalForm.CheckDate, CheckDate = x.ClinicalForm.CheckDate,
ClinicalDataTrialSetId = x.ClinicalForm.ClinicalDataTrialSetId ClinicalDataTrialSetId = x.ClinicalForm.ClinicalDataTrialSetId
@ -884,7 +904,8 @@ namespace IRaCIS.Application.Services
var readingIds = result.Select(x => x.ReadingId).ToList(); var readingIds = result.Select(x => x.ReadingId).ToList();
var clinical = await _clinicalFormRepository.Where(x => readingIds.Contains(x.ReadingId ?? default(Guid))).ToListAsync(); var clinical = await _clinicalFormRepository.Where(x => readingIds.Contains(x.ReadingId ?? default(Guid))).ToListAsync();
result.Where(x => x.ClinicalUploadType == ClinicalUploadType.Structuring).ForEach(x => { result.Where(x => x.ClinicalUploadType == ClinicalUploadType.Structuring).ForEach(x =>
{
x.ClinicalFromList = clinical.Where(y => y.ReadingId == x.ReadingId && y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Select(y => new ClinicalFromData() x.ClinicalFromList = clinical.Where(y => y.ReadingId == x.ReadingId && y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Select(y => new ClinicalFromData()
{ {
@ -902,7 +923,8 @@ namespace IRaCIS.Application.Services
var moduleCriterionFromList = await _readModuleCriterionFromRepository.Where(x => x.ReadModuleId == readModule.Id) var moduleCriterionFromList = await _readModuleCriterionFromRepository.Where(x => x.ReadModuleId == readModule.Id)
.WhereIf(inDto.ClinicalDataTrialSetId != null, x => x.ClinicalForm.ClinicalDataTrialSetId == inDto.TrialReadingCriterionId) .WhereIf(inDto.ClinicalDataTrialSetId != null, x => x.ClinicalForm.ClinicalDataTrialSetId == inDto.TrialReadingCriterionId)
.Select(x => new { .Select(x => new
{
ClinicalFormId = x.ClinicalFormId, ClinicalFormId = x.ClinicalFormId,
CheckDate = x.ClinicalForm.CheckDate, CheckDate = x.ClinicalForm.CheckDate,
ClinicalDataTrialSetId = x.ClinicalForm.ClinicalDataTrialSetId ClinicalDataTrialSetId = x.ClinicalForm.ClinicalDataTrialSetId

View File

@ -1162,6 +1162,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// 是否是第一次转化的任务 /// 是否是第一次转化的任务
/// </summary> /// </summary>
public bool IsFirstChangeTask { get; set; } = false; public bool IsFirstChangeTask { get; set; } = false;
/// <summary>
/// 是否存在临床数据
/// </summary>
public bool IsExistsClinicalData { get; set; } = false;
} }
public class GetVisitReadingQuestionOutDto public class GetVisitReadingQuestionOutDto

View File

@ -5,6 +5,7 @@ using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using static IRaCIS.Core.Domain.Models.ReadingQuestionTrial;
namespace IRaCIS.Core.Application.Service.Reading.Dto namespace IRaCIS.Core.Application.Service.Reading.Dto
{ {
@ -1044,6 +1045,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public List<string> RelevanceValueList { get; set; } public List<string> RelevanceValueList { get; set; }
public List<CalculateInfo> CalculateQuestionList { get; set; } public List<CalculateInfo> CalculateQuestionList { get; set; }
} }
public class ReadingQuestionSystemView public class ReadingQuestionSystemView
@ -1984,6 +1986,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public List<string> ParentTriggerValueList { get; set; } public List<string> ParentTriggerValueList { get; set; }
public List<string> RelevanceValueList { get; set; } public List<string> RelevanceValueList { get; set; }
} }
public class GetSystemCriterionSelectDto public class GetSystemCriterionSelectDto

View File

@ -539,6 +539,20 @@ namespace IRaCIS.Application.Services
}).ToListAsync(); }).ToListAsync();
foreach (var item in result)
{
var clinicalDataList = await _readingClinicalDataService.GetClinicalDataList(new GetReadingOrTaskClinicalDataListInDto()
{
SubjectId = taskInfo.SubjectId,
TrialId = taskInfo.TrialId,
VisitTaskId = item.VisitTaskId,
});
item.IsExistsClinicalData = clinicalDataList.Count > 0;
}
if (!taskInfo.TrialReadingCriterion.IsReadingTaskViewInOrder) if (!taskInfo.TrialReadingCriterion.IsReadingTaskViewInOrder)
{ {
result = result.Where(x => x.VisitTaskId == inDto.VisitTaskId).ToList(); result = result.Where(x => x.VisitTaskId == inDto.VisitTaskId).ToList();
@ -2315,6 +2329,7 @@ namespace IRaCIS.Application.Services
var subjectTaskList = (await _visitTaskService.GetOrderReadingIQueryable(new GetOrderReadingIQueryableInDto() var subjectTaskList = (await _visitTaskService.GetOrderReadingIQueryable(new GetOrderReadingIQueryableInDto()
{ {
TrialId = inDto.TrialId, TrialId = inDto.TrialId,
SubjectId=inDto.SubjectId,
TrialReadingCriterionId = trialReadingCriterionId!.Value, TrialReadingCriterionId = trialReadingCriterionId!.Value,
Page = new PageInput() Page = new PageInput()
{ {
@ -2336,7 +2351,7 @@ namespace IRaCIS.Application.Services
if (currentSubject == null) if (currentSubject == null)
{ {
throw new BusinessValidationFailedException(_localizer["ReadingImage_TaskFinish"]); throw new BusinessValidationFailedException(_localizer["ReadingImage_TaskFinish"], ApiResponseCodeEnum.CloseCurrentWindows);
} }
task = currentSubject.UnReadCanReadTaskList.Select(x => new GetReadingTaskDto() task = currentSubject.UnReadCanReadTaskList.Select(x => new GetReadingTaskDto()
@ -2409,7 +2424,7 @@ namespace IRaCIS.Application.Services
if (task == null) if (task == null)
{ {
throw new BusinessValidationFailedException(_localizer["ReadingImage_TaskFinish"]); throw new BusinessValidationFailedException(_localizer["ReadingImage_TaskFinish"], ApiResponseCodeEnum.CloseCurrentWindows);
} }
if (task.SubjectCode.IsNullOrEmpty()) if (task.SubjectCode.IsNullOrEmpty())

View File

@ -54,7 +54,7 @@ namespace IRaCIS.Core.Application.Triggers
t.TrialId = subject.TrialId; t.TrialId = subject.TrialId;
t.SiteId = subject.SiteId; t.SiteId = subject.SiteId;
t.IsEnrollmentConfirm = t.IsBaseLine ? triconfig.IsEnrollementQualificationConfirm : false; t.IsEnrollmentConfirm = t.IsBaseLine ? triconfig.IsEnrollementQualificationConfirm : false;
t.PDState = PDStateEnum.None; t.PDState = t.IsBaseLine == false && triconfig.IsPDProgressView ? PDStateEnum.PDProgress : PDStateEnum.None;
t.Id = NewId.NextGuid(); t.Id = NewId.NextGuid();
}); });

View File

@ -191,6 +191,8 @@ namespace IRaCIS.Core.Application.MediatR.Handlers
dbSV.CheckState = CheckStateEnum.CVPassed; dbSV.CheckState = CheckStateEnum.CVPassed;
dbSV.CheckUserId = _userInfo.Id; dbSV.CheckUserId = _userInfo.Id;
dbSV.CheckPassedTime = DateTime.Now; dbSV.CheckPassedTime = DateTime.Now;
dbSV.CheckChallengeState = CheckChanllengeTypeEnum.Closed;
//---核对EDC数据完全一致 //---核对EDC数据完全一致
dbSV.CheckResult = _localizer["ConsistencyVerification_EDCB"]; dbSV.CheckResult = _localizer["ConsistencyVerification_EDCB"];
//---自动核查通过 //---自动核查通过

View File

@ -41,7 +41,7 @@ namespace IRaCIS.Core.Domain.Models
[JsonIgnore] [JsonIgnore]
public List<TrialEmailNoticeUser> TrialEmailNoticeUserList { get; set; } = new List<TrialEmailNoticeUser>(); public List<TrialEmailNoticeUser> TrialEmailNoticeUserList { get; set; } = new List<TrialEmailNoticeUser>();
[JsonIgnore]
public List<TrialEmailBlackUser> TrialEmailBlackUserList { get; set; } = new List<TrialEmailBlackUser>(); public List<TrialEmailBlackUser> TrialEmailBlackUserList { get; set; } = new List<TrialEmailBlackUser>();

View File

@ -266,6 +266,10 @@ namespace IRaCIS.Core.Domain.Models
/// </summary> /// </summary>
public Guid? GroupId { get; set; } public Guid? GroupId { get; set; }
//
[JsonIgnore] [JsonIgnore]
[ForeignKey("GroupId")] [ForeignKey("GroupId")]
public ReadingQuestionTrial GroupInfo { get; set; } public ReadingQuestionTrial GroupInfo { get; set; }
@ -290,6 +294,16 @@ namespace IRaCIS.Core.Domain.Models
public List<ReadingTableQuestionTrial> ReadingTableQuestionTrialList { get; set; } public List<ReadingTableQuestionTrial> ReadingTableQuestionTrialList { get; set; }
public enum AssessmentResultType
{
//没有特殊标记
None=0,
//评估结果
AssessmentResult = 1,
}
[NotMapped] [NotMapped]
public List<string> ParentTriggerValueList public List<string> ParentTriggerValueList
{ {

View File

@ -74,7 +74,9 @@ namespace IRaCIS.Core.Domain.Models
public ReadingQuestionTrial ReadingQuestionTrial { get; set; } public ReadingQuestionTrial ReadingQuestionTrial { get; set; }
[JsonIgnore]
[ForeignKey("ReadingQuestionCriterionTrialId")]
public ReadingQuestionCriterionTrial ReadingQuestionCriterionTrial { get; set; }
} }

View File

@ -69,7 +69,20 @@ namespace IRaCIS.Core.Infra.EFCore.Common
typeof(TrialSiteSurvey), typeof(TrialSiteSurvey),
typeof(TrialSiteUser), typeof(TrialSiteUser),
typeof(VisitStage), typeof(VisitStage),
typeof(TrialSite) typeof(TrialSite),
};
}
}
// 修改为删除
private List<Type> UpdateIsDelete
{
get
{
return new List<Type>()
{
typeof(TrialDocument)
}; };
} }
} }
@ -81,6 +94,15 @@ namespace IRaCIS.Core.Infra.EFCore.Common
{ {
return AuditOpt.Add; 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 || else if (entityEntry.State == EntityState.Deleted ||
(entityEntry.State == EntityState.Modified (entityEntry.State == EntityState.Modified
@ -1272,6 +1294,8 @@ namespace IRaCIS.Core.Infra.EFCore.Common
var entity = item.Entity as QCChallenge; var entity = item.Entity as QCChallenge;
var challengeState= await _dbContext.SubjectVisit.Where(x => x.Id == entity.SubjectVisitId).Select(x => x.ChallengeState).FirstOrDefaultAsync();
await InsertInspection<QCChallenge>(entity, type, x => new InspectionConvertDTO() await InsertInspection<QCChallenge>(entity, type, x => new InspectionConvertDTO()
{ {
SubjectVisitId = x.SubjectVisitId, SubjectVisitId = x.SubjectVisitId,
@ -1281,6 +1305,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common
{ {
IsOverTime = entity.IsClosed ? entity.ClosedTime > entity.DeadlineTime : DateTime.Now > entity.DeadlineTime, IsOverTime = entity.IsClosed ? entity.ClosedTime > entity.DeadlineTime : DateTime.Now > entity.DeadlineTime,
ChallengeState= challengeState,
}); });
} }
@ -1394,6 +1419,11 @@ namespace IRaCIS.Core.Infra.EFCore.Common
var trialSiteId = entity.TrialSite?.Id; var trialSiteId = entity.TrialSite?.Id;
var equipmentTypeList = await _dbContext.TrialSiteEquipmentSurvey.Where(x => x.TrialSiteSurveyId == entity.Id).Select(x => x.EquipmentType.ValueCN).ToListAsync();
var siteUserList = await _dbContext.TrialSiteUserSurvey.Where(x => x.TrialSiteSurveyId == entity.Id).Select(x => x.LastName + "/" + x.FirstName).ToListAsync();
await InsertInspection<TrialSiteSurvey>(item.Entity as TrialSiteSurvey, type, x => new InspectionConvertDTO() await InsertInspection<TrialSiteSurvey>(item.Entity as TrialSiteSurvey, type, x => new InspectionConvertDTO()
{ {
ObjectRelationParentId = trialSiteId, ObjectRelationParentId = trialSiteId,
@ -1405,7 +1435,8 @@ namespace IRaCIS.Core.Infra.EFCore.Common
//Phone = entity.Phone, //Phone = entity.Phone,
//Email = entity.Email, //Email = entity.Email,
EquipmentTypeList=string.Join(",", equipmentTypeList),
SiteUserList= string.Join(",", siteUserList),
PreliminaryUser = entity.PreliminaryUser == null ? "" : entity.PreliminaryUser.FullName, PreliminaryUser = entity.PreliminaryUser == null ? "" : entity.PreliminaryUser.FullName,
ReviewerUser = entity.ReviewerUser == null ? "" : entity.ReviewerUser.FullName, ReviewerUser = entity.ReviewerUser == null ? "" : entity.ReviewerUser.FullName,

View File

@ -10,6 +10,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common.Dto
{ {
public string Code { get; set; } public string Code { get; set; }
public string Identification { get; set; }
public string DateType { get; set; } public string DateType { get; set; }
} }

View File

@ -1,17 +1,22 @@
using System; using IRaCIS.Core.Infrastructure.Extention;
using System;
namespace IRaCIS.Core.Infrastructure namespace IRaCIS.Core.Infrastructure
{ {
public class BusinessValidationFailedException : Exception public class BusinessValidationFailedException : Exception
{ {
public ApiResponseCodeEnum Code { get; set; }
public BusinessValidationFailedException() public BusinessValidationFailedException()
{ {
} }
public BusinessValidationFailedException( string message) : base(message) public BusinessValidationFailedException(string message, ApiResponseCodeEnum code = ApiResponseCodeEnum.BusinessValidationFailed) : base(message)
{ {
} Code = code;
}
} }
} }

View File

@ -26,6 +26,10 @@ namespace IRaCIS.Core.Infrastructure.Extention
//需要提示 ,需要提示 从Result 取数据 0 可以继续处理提交 ,1 不能进行继续处理提交 ,2 刷新列表 ) //需要提示 ,需要提示 从Result 取数据 0 可以继续处理提交 ,1 不能进行继续处理提交 ,2 刷新列表 )
NeedTips = 5, NeedTips = 5,
/// <summary>
/// 关闭当前页面
/// </summary>
CloseCurrentWindows=6,
//在其他地方登陆,被迫下线 //在其他地方登陆,被迫下线
LoginInOtherPlace = -1, LoginInOtherPlace = -1,