488 lines
26 KiB
C#
488 lines
26 KiB
C#
using AutoMapper;
|
|
using IRaCIS.Application.Contracts;
|
|
using IRaCIS.Application.Interfaces;
|
|
using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson;
|
|
using IRaCIS.Core.Application.Contracts;
|
|
using IRaCIS.Core.Application.Contracts.DTO;
|
|
using IRaCIS.Core.Application.Helper;
|
|
using IRaCIS.Core.Application.MassTransit.Command;
|
|
using IRaCIS.Core.Application.ViewModel;
|
|
using IRaCIS.Core.Domain.Models;
|
|
using IRaCIS.Core.Domain.Share;
|
|
using MassTransit;
|
|
using MaxMind.GeoIP2.Model;
|
|
using Microsoft.AspNetCore.Hosting;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.Extensions.Hosting;
|
|
using Microsoft.Extensions.Localization;
|
|
using Microsoft.Extensions.Options;
|
|
using Newtonsoft.Json;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace IRaCIS.Core.Application.MassTransit.Consumer
|
|
{
|
|
public class ConsistencyCheckConsumer(
|
|
IRepository<DicomStudy> _studyRepository,
|
|
IUserInfo _userInfo,
|
|
IRepository<Subject> _subjectRepository,
|
|
IRepository<NoneDicomStudy> _noneDicomStudyRepository,
|
|
IRepository<SubjectVisit> _subjectVisitRepository,
|
|
IRepository<Dictionary> _dictionaryRepository,
|
|
IOSSService _oSSService,
|
|
IMapper _mapper,
|
|
IDictionaryService _dictionaryService,
|
|
IRepository<CommonDocument> _commonDocumentRepository,
|
|
IStringLocalizer _localizer,
|
|
IWebHostEnvironment _hostEnvironment,
|
|
IRepository<InspectionFile> _inspectionFileRepository,
|
|
IOptionsMonitor<SystemEmailSendConfig> _systemEmailSendConfig
|
|
) : IConsumer<ConsistenCheckCommand>, IConsumer<ConsistenFullCheckCommand>
|
|
{
|
|
|
|
|
|
|
|
private readonly SystemEmailSendConfig _systemEmailConfig = _systemEmailSendConfig.CurrentValue;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public async Task Consume(ConsumeContext<ConsistenCheckCommand> context)
|
|
{
|
|
|
|
var trialId = context.Message.TrialId;
|
|
|
|
//系统定义MRI 到底是MR 还是MRI
|
|
var mriModality = await _dictionaryRepository.Where(t => t.Parent.Code == "Modality").Where(t => t.Code == "MRI").Select(t => t.Value).FirstNotNullAsync();
|
|
|
|
//处理Excel大小写
|
|
context.Message.ETCList.ForEach(t => { t.Modality = t.Modality.ToUpper().Trim(); t.StudyDate = Convert.ToDateTime(t.StudyDate).ToString("yyyy-MM-dd"); t.SiteCode = t.SiteCode.ToUpper().Trim(); t.VisitName = t.VisitName.ToUpper().Trim(); t.SubjectCode = t.SubjectCode.ToUpper().Trim(); });
|
|
var etcList = context.Message.ETCList;
|
|
|
|
//Expression<Func<SubjectVisit, bool>> subjectVisitLambda2 = x => x.TrialId == request.TrialId;
|
|
|
|
//subjectVisitLambda2= subjectVisitLambda2.And(x => x.CheckState == CheckStateEnum.ToCheck && x.AuditState == AuditStateEnum.QCPassed || (x.CheckState == CheckStateEnum.CVIng && x.AuditState == AuditStateEnum.QCPassed));
|
|
|
|
Expression<Func<SubjectVisit, bool>> subjectVisitLambda = x => x.TrialId == trialId && x.Subject.IsSubjectQuit == false && x.AuditState == AuditStateEnum.QCPassed &&
|
|
(x.CheckState == CheckStateEnum.ToCheck || x.CheckState == CheckStateEnum.CVIng);
|
|
|
|
var dicomQuery = from sv in _subjectVisitRepository.Where(subjectVisitLambda)
|
|
join subject in _subjectRepository.AsQueryable() on sv.SubjectId equals subject.Id
|
|
join study in _studyRepository.AsQueryable() on sv.Id equals study.SubjectVisitId
|
|
select new CheckDBModel()
|
|
{
|
|
SubjectVisitId = sv.Id,
|
|
SiteCode = sv.TrialSite.TrialSiteCode,
|
|
StudyDate = study.StudyTime == null ? string.Empty : ((DateTime)study.StudyTime).ToString("yyyy-MM-dd"),
|
|
StudyId = study.Id,
|
|
Modality = study.ModalityForEdit,
|
|
SubjectCode = subject.Code,
|
|
VisitName = sv.VisitName,
|
|
|
|
SiteCounty = sv.TrialSite.Country,
|
|
};
|
|
|
|
var noneDicomQuey = from sv in _subjectVisitRepository.Where(subjectVisitLambda)
|
|
join subject in _subjectRepository.AsQueryable() on sv.SubjectId equals subject.Id
|
|
join noneDicomStudy in _noneDicomStudyRepository.Where(t => t.FileCount > 0) on sv.Id equals noneDicomStudy.SubjectVisitId
|
|
select new CheckDBModel()
|
|
{
|
|
SubjectVisitId = sv.Id,
|
|
SiteCode = sv.TrialSite.TrialSiteCode,
|
|
StudyDate = noneDicomStudy.ImageDate.ToString("yyyy-MM-dd"),
|
|
StudyId = noneDicomStudy.Id,
|
|
Modality = noneDicomStudy.Modality,
|
|
SubjectCode = subject.Code,
|
|
VisitName = sv.VisitName,
|
|
|
|
SiteCounty = sv.TrialSite.Country,
|
|
};
|
|
|
|
var dbList = (await dicomQuery.ToListAsync()).Union(await noneDicomQuey.ToListAsync()).ToList();
|
|
|
|
//处理数据库 大小写
|
|
dbList.ForEach(t => { t.Modality = t.Modality.ToUpper().Trim(); t.SiteCode = t.SiteCode.ToUpper().Trim(); t.VisitName = t.VisitName.ToUpper().Trim(); t.SubjectCode = t.SubjectCode.ToUpper().Trim(); });
|
|
|
|
var dbCheckList = _mapper.Map<List<CheckViewModel>>(dbList);
|
|
|
|
////按照数据库数据访视分组 按照数据库的数据 一个个的访视对比
|
|
//var svGroup = dbList.GroupBy(t => new { t.SubjectVisitId, t.SiteCode, t.SubjectCode, t.VisitName })
|
|
// .Select(g => new { g.Key.SubjectCode, g.Key.VisitName, g.Key.SiteCode, g.Key.SubjectVisitId, StudyList = g.ToList() }).ToList();
|
|
|
|
//按照Excel数据访视分组 按照数据库的数据 一个个的访视对比
|
|
var svExcelGroup = etcList.GroupBy(t => new { t.SiteCode, t.SubjectCode, t.VisitName })
|
|
.Select(g => new { g.Key.SubjectCode, g.Key.VisitName, g.Key.SiteCode, ExcelStudyList = g.ToList() }).ToList();
|
|
|
|
|
|
foreach (var sv in svExcelGroup)
|
|
{
|
|
|
|
//Excel 的数据 在IRC 中可以找到该访视(一致性核查中,或者待核查)
|
|
if (dbCheckList.Any(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName))
|
|
{
|
|
|
|
var dbVisitStudyList = dbList.Where(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName).ToList();
|
|
|
|
//设置当前中心语言
|
|
|
|
var isEn_us = dbVisitStudyList.First().SiteCounty == StaticData.SiteCountry.US;
|
|
|
|
var cultureInfoName = StaticData.CultureInfo.en_US;
|
|
|
|
if (isEn_us == false)
|
|
{
|
|
cultureInfoName = StaticData.CultureInfo.zh_CN;
|
|
}
|
|
|
|
CultureInfo.CurrentCulture = new CultureInfo(cultureInfoName);
|
|
CultureInfo.CurrentUICulture = new CultureInfo(cultureInfoName);
|
|
|
|
|
|
//找到etc 当前visit site 和subject 一致的检查列表
|
|
var etcVisitStudyList = etcList.Where(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName).ToList();
|
|
|
|
|
|
//以我们系统数据库为准 ,判断是MR 还是MRI, 把Excel 里的MR 或者MRI 处理成一致,MR MRI 是一致的
|
|
foreach (var item in etcVisitStudyList)
|
|
{
|
|
if (item.Modality == "MR" || item.Modality == "MRI")
|
|
{
|
|
item.Modality = mriModality;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
StringBuilder dialogMsg = new StringBuilder();
|
|
//---您好,根据本系统自动识别,该受试者当前访视在IRC系统中已提交的影像检查情况如下:
|
|
dialogMsg.Append($"<div>{_localizer["ConsistencyVerification_Img"]}</div>");
|
|
var num = 0;
|
|
List<ParamInfoDto> paramInfoList = new List<ParamInfoDto>();
|
|
|
|
foreach (var item in dbVisitStudyList)
|
|
{
|
|
num++;
|
|
|
|
dialogMsg.AppendLine($"<br/><div style='text-indent: 20px;'>{num}. {_localizer["ConsistencyVerification_ImgC", item.StudyDate, item.Modality]}</div>");
|
|
|
|
|
|
paramInfoList.Add(new ParamInfoDto()
|
|
{
|
|
Modality = item.Modality,
|
|
StudyDate = item.StudyDate,
|
|
});
|
|
}
|
|
|
|
var subjectVisitId = dbVisitStudyList.First().SubjectVisitId;
|
|
var dbSV = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException();
|
|
|
|
#region 更换核对的顺序 以Excel 数据为准 注释
|
|
//// 该访视 在EDC Excel中没有任何数据
|
|
//if (etcVisitStudyList.Count == 0)
|
|
//{
|
|
// dialogMsg.AppendLine($"<br/>");
|
|
// dialogMsg.AppendLine($"<br><span style='color: #f00'>存在问题如下:</span>");
|
|
// num = 0;
|
|
// foreach (var item in sv.StudyList)
|
|
// {
|
|
// num++;
|
|
// dialogMsg.AppendLine($"<br>{num}.{item.StudyDate}的{item.Modality}影像检查(EDC 缺少) ");
|
|
// }
|
|
|
|
// dialogMsg.AppendLine($"<br/>");
|
|
// dialogMsg.AppendLine(@$"<br>说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。");
|
|
|
|
// dbSV.CheckResult = "当前访视在EDC表中未找到数据,请核对 SubjectCode、 SiteCode 、VisitName 是否和EDC系统保持一致";
|
|
// dbSV.CheckState = CheckStateEnum.CVIng;
|
|
// dbSV.ForwardState = ForwardStateEnum.ToForward;
|
|
// dbSV.CheckChallengeState = CheckChanllengeTypeEnum.PMWaitCRCReply;
|
|
// dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog()
|
|
// {
|
|
// SubjectVisitId = sv.SubjectVisitId,
|
|
// IsCRCNeedReply = true,
|
|
// TalkContent = dialogMsg.ToString(),
|
|
// ParamInfo = JsonConvert.SerializeObject(paramInfoList),
|
|
// UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt,
|
|
// CreateTime = DateTime.Now
|
|
// });
|
|
//}
|
|
//else
|
|
#endregion
|
|
|
|
{
|
|
//etc 和数据库 并集
|
|
var unionList = dbVisitStudyList.Union(etcVisitStudyList);
|
|
// 数据库存在
|
|
var dbExceptExcel = dbVisitStudyList.Except(etcVisitStudyList);
|
|
|
|
// excel 存在
|
|
var excelExceptDB = etcVisitStudyList.Except(dbVisitStudyList);
|
|
|
|
//ETC 和系统的完全一致 两者没有差别
|
|
if (dbExceptExcel.Count() == 0 && excelExceptDB.Count() == 0)
|
|
{
|
|
dialogMsg.AppendLine($"<br/>");
|
|
//---核对EDC数据,完全一致, 审核通过
|
|
dialogMsg.AppendLine(_localizer["ConsistencyVerification_EDCA", _systemEmailConfig.SystemShortName]);
|
|
|
|
|
|
// dialogMsg.AppendLine(@$"<br>说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。");
|
|
dbSV.CheckState = CheckStateEnum.CVPassed;
|
|
dbSV.CheckUserId = _userInfo.UserRoleId;
|
|
dbSV.CheckPassedTime = DateTime.Now;
|
|
dbSV.CheckChallengeState = CheckChanllengeTypeEnum.Closed;
|
|
|
|
//---核对EDC数据,完全一致
|
|
dbSV.CheckResult = _localizer["ConsistencyVerification_EDCB", _systemEmailConfig.SystemShortName];
|
|
//---自动核查通过
|
|
dbSV.ManualPassReason = _localizer["ConsistencyVerification_Auto"];
|
|
|
|
//维护状态
|
|
dbSV.ReadingStatus = ReadingStatusEnum.TaskAllocate;
|
|
|
|
dbSV.RequestBackState = dbSV.RequestBackState == RequestBackStateEnum.CRC_RequestBack ? RequestBackStateEnum.PM_NotAgree : RequestBackStateEnum.NotRequest;
|
|
dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog()
|
|
{
|
|
SubjectVisitId = subjectVisitId,
|
|
ParamInfo = JsonConvert.SerializeObject(paramInfoList),
|
|
TalkContent = dialogMsg.ToString(),
|
|
UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt,
|
|
CreateTime = DateTime.Now
|
|
});
|
|
}
|
|
// ETC 和系统的有区别
|
|
else
|
|
{
|
|
//"Problems are as follows:
|
|
dialogMsg.AppendLine($"<br/><div>{_localizer["ConsistencyVerification_Prob"]}</div>");
|
|
|
|
num = 0;
|
|
foreach (var item in dbExceptExcel)
|
|
{
|
|
num++;
|
|
//影像检查(EDC 缺少) ConsistencyVerification_EdcL
|
|
dialogMsg.AppendLine($"<br/><div style='text-indent: 20px;'>{num}. {_localizer["ConsistencyVerification_EdcL", item.StudyDate, item.Modality/*, _systemEmailConfig.SystemShortName*/]}</div>");
|
|
|
|
}
|
|
|
|
foreach (var item in excelExceptDB)
|
|
{
|
|
num++;
|
|
// 影像检查(IRC 缺少)
|
|
dialogMsg.AppendLine($"<br/><div style='text-indent: 20px;'>{num}. {_localizer["ConsistencyVerification_IrcLi", item.StudyDate, item.Modality, _systemEmailConfig.SystemShortName]}</div>");
|
|
}
|
|
|
|
dialogMsg.AppendLine($"<br/>");
|
|
dialogMsg.AppendLine(@$"<div>{_localizer["ConsistencyVerification_Desc"]}</div>");
|
|
|
|
dbSV.CheckResult =
|
|
String.Join(" | ", dbExceptExcel.Select(t => $"{_localizer["ConsistencyVerification_EdcL", t.StudyDate, t.Modality/*, _systemEmailConfig.SystemShortName*/]}")) + " | "
|
|
+ String.Join(" | ", excelExceptDB.Select(t => $"{_localizer["ConsistencyVerification_IrcLi", t.StudyDate, t.Modality, _systemEmailConfig.SystemShortName]}"));
|
|
|
|
//新增一致性核查质疑记录
|
|
|
|
dbSV.CheckState = CheckStateEnum.CVIng;
|
|
dbSV.CheckChallengeState = CheckChanllengeTypeEnum.PMWaitCRCReply;
|
|
|
|
//讲核查结果发送消息给CRC
|
|
dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog()
|
|
{
|
|
SubjectVisitId = subjectVisitId,
|
|
IsCRCNeedReply = true,
|
|
TalkContent = dialogMsg.ToString(),
|
|
ParamInfo = JsonConvert.SerializeObject(paramInfoList),
|
|
UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt,
|
|
CreateTime = DateTime.Now
|
|
});
|
|
}
|
|
|
|
}
|
|
dbSV.CheckTime = DateTime.Now;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
await _subjectVisitRepository.SaveChangesAsync();
|
|
|
|
|
|
}
|
|
|
|
public async Task Consume(ConsumeContext<ConsistenFullCheckCommand> context)
|
|
{
|
|
var inspectionFileId = context.Message.InspectionFileId;
|
|
var trialId = context.Message.TrialId;
|
|
|
|
//系统定义MRI 到底是MR 还是MRI
|
|
var mriModality = await _dictionaryRepository.Where(t => t.Parent.Code == "Modality").Where(t => t.Code == "MRI").Select(t => t.Value).FirstNotNullAsync();
|
|
|
|
//处理Excel大小写
|
|
context.Message.ETCList.ForEach(t => { t.Modality = t.Modality.ToUpper().Trim(); t.StudyDate = Convert.ToDateTime(t.StudyDate).ToString("yyyy-MM-dd"); t.SiteCode = t.SiteCode.ToUpper().Trim(); t.VisitName = t.VisitName.ToUpper().Trim(); t.SubjectCode = t.SubjectCode.ToUpper().Trim(); });
|
|
var etcList = context.Message.ETCList;
|
|
|
|
|
|
Expression<Func<SubjectVisit, bool>> subjectVisitLambda = x => x.TrialId == trialId /*&& x.Subject.IsSubjectQuit == false*/ && x.AuditState == AuditStateEnum.QCPassed;
|
|
|
|
var dicomQuery = from sv in _subjectVisitRepository.Where(subjectVisitLambda)
|
|
join subject in _subjectRepository.AsQueryable() on sv.SubjectId equals subject.Id
|
|
join study in _studyRepository.AsQueryable() on sv.Id equals study.SubjectVisitId
|
|
select new CheckDBModel()
|
|
{
|
|
SubjectStatus = sv.Subject.Status,
|
|
SubjectVisitId = sv.Id,
|
|
SiteCode = sv.TrialSite.TrialSiteCode,
|
|
StudyDate = study.StudyTime == null ? string.Empty : ((DateTime)study.StudyTime).ToString("yyyy-MM-dd"),
|
|
StudyId = study.Id,
|
|
Modality = study.ModalityForEdit,
|
|
SubjectCode = subject.Code,
|
|
VisitName = sv.VisitName,
|
|
};
|
|
|
|
var noneDicomQuey = from sv in _subjectVisitRepository.Where(subjectVisitLambda)
|
|
join subject in _subjectRepository.AsQueryable() on sv.SubjectId equals subject.Id
|
|
join noneDicomStudy in _noneDicomStudyRepository.Where(t => t.FileCount > 0) on sv.Id equals noneDicomStudy.SubjectVisitId
|
|
select new CheckDBModel()
|
|
{
|
|
SubjectStatus = sv.Subject.Status,
|
|
SubjectVisitId = sv.Id,
|
|
SiteCode = sv.TrialSite.TrialSiteCode,
|
|
StudyDate = noneDicomStudy.ImageDate.ToString("yyyy-MM-dd"),
|
|
StudyId = noneDicomStudy.Id,
|
|
Modality = noneDicomStudy.Modality,
|
|
SubjectCode = subject.Code,
|
|
VisitName = sv.VisitName,
|
|
};
|
|
|
|
var dbList = (await dicomQuery.ToListAsync()).Union(await noneDicomQuey.ToListAsync()).ToList();
|
|
|
|
//处理数据库 大小写
|
|
dbList.ForEach(t => { t.Modality = t.Modality.ToUpper().Trim(); t.SiteCode = t.SiteCode.ToUpper().Trim(); t.VisitName = t.VisitName.ToUpper().Trim(); t.SubjectCode = t.SubjectCode.ToUpper().Trim(); });
|
|
|
|
var dbCheckList = _mapper.Map<List<CheckViewModel>>(dbList);
|
|
|
|
|
|
//按照Excel数据访视分组 按照数据库的数据 一个个的访视对比
|
|
var svExcelGroup = etcList.GroupBy(t => new { t.SiteCode, t.SubjectCode, t.VisitName })
|
|
.Select(g => new { g.Key.SubjectCode, g.Key.VisitName, g.Key.SiteCode, ExcelStudyList = g.ToList() }).ToList();
|
|
|
|
var fullCheckResultList = new List<FullCheckResult>();
|
|
|
|
|
|
foreach (var sv in svExcelGroup)
|
|
{
|
|
|
|
//Excel 的数据 在IRC 中可以找到该访视(一致性核查中,或者待核查)
|
|
if (dbCheckList.Any(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName))
|
|
{
|
|
|
|
var dbVisitStudyList = dbList.Where(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName).ToList();
|
|
|
|
//找到etc 当前visit site 和subject 一致的检查列表
|
|
var etcVisitStudyList = etcList.Where(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName).ToList();
|
|
|
|
|
|
//以我们系统数据库为准 ,判断是MR 还是MRI, 把Excel 里的MR 或者MRI 处理成一致,MR MRI 是一致的
|
|
foreach (var item in etcVisitStudyList)
|
|
{
|
|
if (item.Modality == "MR" || item.Modality == "MRI")
|
|
{
|
|
item.Modality = mriModality;
|
|
}
|
|
}
|
|
|
|
|
|
//etc 和数据库 并集
|
|
var unionList = dbVisitStudyList.Union(etcVisitStudyList);
|
|
// 数据库存在
|
|
var dbExceptExcel = dbVisitStudyList.Except(etcVisitStudyList);
|
|
|
|
// excel 存在
|
|
var excelExceptDB = etcVisitStudyList.Except(dbVisitStudyList);
|
|
|
|
var dbCurrentVisitFirst = dbVisitStudyList.First();
|
|
|
|
//ETC 和系统的完全一致 两者没有差别
|
|
if (dbExceptExcel.Count() == 0 && excelExceptDB.Count() == 0)
|
|
{
|
|
|
|
|
|
//每个受试者每个访视加一条记录
|
|
fullCheckResultList.Add(new FullCheckResult()
|
|
{
|
|
SubjectStatus = dbCurrentVisitFirst.SubjectStatus,
|
|
CheckTime = DateTime.Now,
|
|
CheckState = CheckStateEnum.CVPassed,
|
|
SiteCode = dbCurrentVisitFirst.SiteCode,
|
|
SubjectCode = dbCurrentVisitFirst.SubjectCode,
|
|
VisitName = dbCurrentVisitFirst.VisitName,
|
|
Modalitys = string.Join('、', dbVisitStudyList.Select(t => t.Modality)),
|
|
LatestScanDateStr = dbVisitStudyList.Select(t => t.StudyDate).MaxBy(d => DateTime.Parse(d)) ?? ""
|
|
});
|
|
}
|
|
else
|
|
{
|
|
var checkResult =
|
|
String.Join(" | ", dbExceptExcel.Select(t => $"{_localizer["ConsistencyVerification_EdcL", t.StudyDate, t.Modality/*, _systemEmailConfig.SystemShortName*/]}")) + " | "
|
|
+ String.Join(" | ", excelExceptDB.Select(t => $"{_localizer["ConsistencyVerification_IrcLi", t.StudyDate, t.Modality, _systemEmailConfig.SystemShortName]}"));
|
|
|
|
//每个受试者每个访视加一条记录
|
|
fullCheckResultList.Add(new FullCheckResult()
|
|
{
|
|
SubjectStatus = dbCurrentVisitFirst.SubjectStatus,
|
|
CheckState = CheckStateEnum.None,
|
|
CheckTime = DateTime.Now,
|
|
SiteCode = dbCurrentVisitFirst.SiteCode,
|
|
SubjectCode = dbCurrentVisitFirst.SubjectCode,
|
|
VisitName = dbCurrentVisitFirst.VisitName,
|
|
Modalitys = string.Join('、', dbVisitStudyList.Select(t => t.Modality)),
|
|
LatestScanDateStr = dbVisitStudyList.Select(t => t.StudyDate).MaxBy(d => DateTime.Parse(d)) ?? "",
|
|
CheckResult = checkResult
|
|
});
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//导到Excel 上传oss 回更记录状态
|
|
|
|
var list = fullCheckResultList;
|
|
|
|
var exportInfo = new ExcelExportInfo();
|
|
|
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
|
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
|
|
|
var fileStreamResult = (FileStreamResult)await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialConsistentFUllCheckList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(FullCheckResult));
|
|
|
|
var ossRelativePath = await _oSSService.UploadToOSSAsync(fileStreamResult.FileStream, $"{trialId.ToString()}/InspectionUpload/DataReconciliation", "DataReconciliation", uploadInfo: new FileUploadRecordAddOrEdit() { TrialId = trialId, BatchDataType = BatchDataType.DataReconciliation });
|
|
|
|
|
|
//var add = await _inspectionFileRepository.FindAsync(inspectionFileId);
|
|
//add.CheckState = EDCCheckState.Success;
|
|
//add.ResultPath = ossRelativePath;
|
|
|
|
//更新
|
|
await _inspectionFileRepository.BatchUpdateNoTrackingAsync(t => t.Id == inspectionFileId, u => new InspectionFile() { CheckState = EDCCheckState.Success, ResultPath = ossRelativePath });
|
|
|
|
await _subjectVisitRepository.SaveChangesAsync();
|
|
|
|
}
|
|
}
|
|
}
|