Compare commits
47 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5660d2e83b | |||
| 5e3e242981 | |||
| 65c31fb457 | |||
| 0f891075cc | |||
| 6d898367e4 | |||
| 003e63b7fb | |||
| 73c9e15976 | |||
| 1dc1d673dd | |||
| 46818d9a02 | |||
| d6a585c6cc | |||
| c54fcf920c | |||
| 467c7f77f5 | |||
| 3c51287178 | |||
| 9d8fdcfa12 | |||
| fadd8a7f79 | |||
| f2afb7ab1a | |||
| b52d8785bb | |||
| 70846525bf | |||
| abe77916a3 | |||
| 660846a0d8 | |||
| 8dec77f30a | |||
| 5812c8f939 | |||
| 1c673e11ac | |||
| bf54bcfd9b | |||
| 33a0b8f11f | |||
| 61ffdabc51 | |||
| 2f224047bc | |||
| 2747fa82e3 | |||
| 5dd80c91cf | |||
| 495e602599 | |||
| 545ddd4ec9 | |||
| 9fff53f137 | |||
| 1d38fc0879 | |||
| 48f44b8920 | |||
| e365818ef5 | |||
| c2bb3010cc | |||
| 4ca8003d24 | |||
| 6a212926e0 | |||
| dae5c0440f | |||
| 6b1d083faa | |||
| c8510bea2a | |||
| a00e84018a | |||
| 3435806020 | |||
| 27f0a0fcfa | |||
| 1f4bb0128a | |||
| e686b6b7d4 | |||
| b74d46b425 |
@@ -0,0 +1,30 @@
|
|||||||
|
**/.classpath
|
||||||
|
**/.dockerignore
|
||||||
|
**/.env
|
||||||
|
**/.git
|
||||||
|
**/.gitignore
|
||||||
|
**/.project
|
||||||
|
**/.settings
|
||||||
|
**/.toolstarget
|
||||||
|
**/.vs
|
||||||
|
**/.vscode
|
||||||
|
**/*.*proj.user
|
||||||
|
**/*.dbmdl
|
||||||
|
**/*.jfm
|
||||||
|
**/azds.yaml
|
||||||
|
**/bin
|
||||||
|
**/charts
|
||||||
|
**/docker-compose*
|
||||||
|
**/Dockerfile*
|
||||||
|
**/node_modules
|
||||||
|
**/npm-debug.log
|
||||||
|
**/obj
|
||||||
|
**/secrets.dev.yaml
|
||||||
|
**/values.dev.yaml
|
||||||
|
LICENSE
|
||||||
|
README.md
|
||||||
|
!**/.gitignore
|
||||||
|
!.git/HEAD
|
||||||
|
!.git/config
|
||||||
|
!.git/packed-refs
|
||||||
|
!.git/refs/heads/**
|
||||||
@@ -29,8 +29,7 @@ namespace IRaCIS.Core.API
|
|||||||
outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext:l} || {Message} || {Exception} ||end {NewLine}")
|
outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext:l} || {Message} || {Exception} ||end {NewLine}")
|
||||||
|
|
||||||
.WriteTo.File($"{AppContext.BaseDirectory}Serilogs/.log", rollingInterval: RollingInterval.Day,
|
.WriteTo.File($"{AppContext.BaseDirectory}Serilogs/.log", rollingInterval: RollingInterval.Day,
|
||||||
outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext:l} || {Message} || {Exception} ||end {NewLine}")
|
outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext:l} || {Message} || {Exception} ||end {NewLine}");
|
||||||
.Filter.ByExcluding(logEvent => logEvent.Properties.ContainsKey("SourceContext") && logEvent.Properties["SourceContext"].ToString().Contains("health"));
|
|
||||||
|
|
||||||
//.WriteTo.MSSqlServer("Data Source=DESKTOP-4TU9A6M;Initial Catalog=CoreFrame;User ID=sa;Password=123456", "logs", autoCreateSqlTable: true, restrictedToMinimumLevel: LogEventLevel.Information)//从左至右四个参数分别是数据库连接字符串、表名、如果表不存在是否创建、最低等级。Serilog会默认创建一些列。
|
//.WriteTo.MSSqlServer("Data Source=DESKTOP-4TU9A6M;Initial Catalog=CoreFrame;User ID=sa;Password=123456", "logs", autoCreateSqlTable: true, restrictedToMinimumLevel: LogEventLevel.Information)//从左至右四个参数分别是数据库连接字符串、表名、如果表不存在是否创建、最低等级。Serilog会默认创建一些列。
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"RemoteNew": "Server=101.132.193.237,1434;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
|
// "RemoteNew": "Server=47.117.165.18,1434;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
|
||||||
"Hangfire": "Server=101.132.193.237,1434;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
|
// "Hangfire": "Server=47.117.165.18,1434;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
|
||||||
|
"RemoteNew": "Server=prod_mssql_standard,1433;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
|
||||||
|
"Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
|
||||||
},
|
},
|
||||||
"ObjectStoreService": {
|
"ObjectStoreService": {
|
||||||
"ObjectStoreUse": "AliyunOSS",
|
"ObjectStoreUse": "AliyunOSS",
|
||||||
|
|||||||
@@ -342,7 +342,7 @@ public static class ExcelExportHelper
|
|||||||
IgnoreTemplateParameterMissing = true,
|
IgnoreTemplateParameterMissing = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
await MiniExcel.SaveAsByTemplateAsync(memoryStream, tplPath, translateData, config);
|
await MiniExcel.SaveAsByTemplateAsync(memoryStream, templateStream.ToArray(), translateData, config);
|
||||||
|
|
||||||
memoryStream.Seek(0, SeekOrigin.Begin);
|
memoryStream.Seek(0, SeekOrigin.Begin);
|
||||||
|
|
||||||
|
|||||||
@@ -1764,6 +1764,19 @@
|
|||||||
<param name="inDto"></param>
|
<param name="inDto"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.LuganoCalculateService.CalculateTargetLesionStatus(IRaCIS.Core.Application.ViewModel.CalculateTargetLesionStatusInDto)">
|
||||||
|
<summary>
|
||||||
|
计算靶病灶状态
|
||||||
|
</summary>
|
||||||
|
<param name="inDto"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.LuganoCalculateService.GetSplitPPdSum(IRaCIS.Core.Application.ViewModel.GetSplitPPdInDto)">
|
||||||
|
<summary>
|
||||||
|
获取分裂病灶的PPd之和 不包括当前的主病灶
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.LuganoCalculateService.AddTaskLesionAnswerFromLastTask(IRaCIS.Core.Application.ViewModel.AddTaskLesionAnswerFromLastTaskInDto)">
|
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.LuganoCalculateService.AddTaskLesionAnswerFromLastTask(IRaCIS.Core.Application.ViewModel.AddTaskLesionAnswerFromLastTaskInDto)">
|
||||||
<summary>
|
<summary>
|
||||||
将上一次的访视病灶添加到这一次
|
将上一次的访视病灶添加到这一次
|
||||||
@@ -6702,6 +6715,11 @@
|
|||||||
限制编辑
|
限制编辑
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionTrialAddOrEdit.LimitShow">
|
||||||
|
<summary>
|
||||||
|
限制显示
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionTrialAddOrEdit.MaxAnswerLength">
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionTrialAddOrEdit.MaxAnswerLength">
|
||||||
<summary>
|
<summary>
|
||||||
最大答案长度
|
最大答案长度
|
||||||
@@ -6790,6 +6808,11 @@
|
|||||||
限制编辑
|
限制编辑
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionSystemAddOrEdit.LimitShow">
|
||||||
|
<summary>
|
||||||
|
限制显示
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionSystemAddOrEdit.MaxAnswerLength">
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingTableQuestionSystemAddOrEdit.MaxAnswerLength">
|
||||||
<summary>
|
<summary>
|
||||||
最大答案长度
|
最大答案长度
|
||||||
@@ -7153,6 +7176,11 @@
|
|||||||
限制编辑
|
限制编辑
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialView.LimitShow">
|
||||||
|
<summary>
|
||||||
|
限制显示
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialView.MaxAnswerLength">
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialView.MaxAnswerLength">
|
||||||
<summary>
|
<summary>
|
||||||
最大答案长度
|
最大答案长度
|
||||||
@@ -7213,6 +7241,11 @@
|
|||||||
限制编辑
|
限制编辑
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionSystemView.LimitShow">
|
||||||
|
<summary>
|
||||||
|
限制显示
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionSystemView.MaxAnswerLength">
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionSystemView.MaxAnswerLength">
|
||||||
<summary>
|
<summary>
|
||||||
最大答案长度
|
最大答案长度
|
||||||
@@ -7558,6 +7591,11 @@
|
|||||||
限制编辑
|
限制编辑
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionSystemInDto.LimitShow">
|
||||||
|
<summary>
|
||||||
|
限制显示
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionSystemInDto.MaxAnswerLength">
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionSystemInDto.MaxAnswerLength">
|
||||||
<summary>
|
<summary>
|
||||||
最大答案长度
|
最大答案长度
|
||||||
@@ -7903,6 +7941,11 @@
|
|||||||
限制编辑
|
限制编辑
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionTrialInDto.LimitShow">
|
||||||
|
<summary>
|
||||||
|
限制显示
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionTrialInDto.MaxAnswerLength">
|
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingQuestionTrialInDto.MaxAnswerLength">
|
||||||
<summary>
|
<summary>
|
||||||
最大答案长度
|
最大答案长度
|
||||||
@@ -13360,7 +13403,7 @@
|
|||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SplitLesion(IRaCIS.Core.Application.Service.Reading.Dto.SplitLesionInDto)">
|
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SplitLesion(IRaCIS.Core.Application.Service.Reading.Dto.SplitLesionInDto)">
|
||||||
<summary>
|
<summary>
|
||||||
拆分病灶
|
拆分病灶 分裂病灶
|
||||||
</summary>
|
</summary>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
|||||||
@@ -693,7 +693,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
var existCurrentVisitTaskList = _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId
|
var existCurrentVisitTaskList = _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId
|
||||||
&& t.TrialReadingCriterionId == trialReadingCriterionId && t.TaskState == TaskState.Effect
|
&& t.TrialReadingCriterionId == trialReadingCriterionId && t.TaskState == TaskState.Effect
|
||||||
&& t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null && t.SourceSubjectVisitId == subjectVisit.Id).ToList();
|
/* && t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null*/ && t.SourceSubjectVisitId == subjectVisit.Id).ToList();
|
||||||
|
|
||||||
VisitTask? task1 = null;
|
VisitTask? task1 = null;
|
||||||
VisitTask? task2 = null;
|
VisitTask? task2 = null;
|
||||||
|
|||||||
@@ -1088,7 +1088,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
|||||||
.WhereIf(critrion.IsAutoCreate == false, t => !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum))
|
.WhereIf(critrion.IsAutoCreate == false, t => !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum))
|
||||||
|
|
||||||
// 前序 不存在 未一致性核查未通过的
|
// 前序 不存在 未一致性核查未通过的
|
||||||
.Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum))
|
.Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum >= sv.VisitNum))
|
||||||
//.WhereIf(critrion.IsAutoCreate == false, t => t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(t => t.IsGeneratedTask == false) ?
|
//.WhereIf(critrion.IsAutoCreate == false, t => t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(t => t.IsGeneratedTask == false) ?
|
||||||
//t.VisitTaskNum <= t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsGeneratedTask == false).Min(t => t.SubjectVisit.VisitNum) : true)
|
//t.VisitTaskNum <= t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsGeneratedTask == false).Min(t => t.SubjectVisit.VisitNum) : true)
|
||||||
//.Where(t => t.Subject.SubjectVisitList.Any(t => t.CheckState != CheckStateEnum.CVPassed) ? t.VisitTaskNum <= t.Subject.SubjectVisitList.Where(t => t.CheckState != CheckStateEnum.CVPassed).Min(t => t.VisitNum) : true)
|
//.Where(t => t.Subject.SubjectVisitList.Any(t => t.CheckState != CheckStateEnum.CVPassed) ? t.VisitTaskNum <= t.Subject.SubjectVisitList.Where(t => t.CheckState != CheckStateEnum.CVPassed).Min(t => t.VisitNum) : true)
|
||||||
@@ -2281,7 +2281,13 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
|||||||
|
|
||||||
#region 方式二
|
#region 方式二
|
||||||
|
|
||||||
var origenalTask = influenceTaskList.Where(t => t.Id == task.Id).FirstOrDefault();
|
|
||||||
|
//pm退回的时候,影响的任务里不一定有该任务id 双重 分配了一个人,退回的时候,选择的是未分配的
|
||||||
|
|
||||||
|
//var origenalTask = influenceTaskList.Where(t => t.Id == task.Id).FirstOrDefault();
|
||||||
|
|
||||||
|
var origenalTask = await _visitTaskRepository.FindAsync(task.Id);
|
||||||
|
|
||||||
|
|
||||||
foreach (var influenceTask in influenceTaskList)
|
foreach (var influenceTask in influenceTaskList)
|
||||||
{
|
{
|
||||||
@@ -2340,7 +2346,9 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
|||||||
|
|
||||||
await SetMedicalReviewInvalidAsync(currentVisitList);
|
await SetMedicalReviewInvalidAsync(currentVisitList);
|
||||||
|
|
||||||
var origenalTask = currentVisitList.Where(t => t.Id == task.Id).First();
|
//var origenalTask = currentVisitList.Where(t => t.Id == task.Id).First();
|
||||||
|
|
||||||
|
var origenalTask = await _visitTaskRepository.FindAsync(task.Id);
|
||||||
|
|
||||||
foreach (var influenceTask in currentVisitList)
|
foreach (var influenceTask in currentVisitList)
|
||||||
{
|
{
|
||||||
@@ -2695,7 +2703,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
|||||||
|
|
||||||
//throw new BusinessValidationFailedException("仅允许PM 同意 IR 申请的任务");
|
//throw new BusinessValidationFailedException("仅允许PM 同意 IR 申请的任务");
|
||||||
}
|
}
|
||||||
//PM 影响所有阅片人 仅仅针对访视 SPM CPM 掉用
|
//PM 影响所有阅片人 仅仅针对访视 SPM CPM 调用
|
||||||
|
|
||||||
else if (((_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM) && applyId != null && await _visitTaskReReadingRepository.AnyAsync(t => t.Id == applyId && t.CreateUser.UserTypeEnum == UserTypeEnum.ProjectManager) && filterObj.IsAnalysisCreate == false && filterObj.ReadingCategory == ReadingCategory.Visit)
|
else if (((_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM) && applyId != null && await _visitTaskReReadingRepository.AnyAsync(t => t.Id == applyId && t.CreateUser.UserTypeEnum == UserTypeEnum.ProjectManager) && filterObj.IsAnalysisCreate == false && filterObj.ReadingCategory == ReadingCategory.Visit)
|
||||||
|| (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager && applyId == null))
|
|| (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager && applyId == null))
|
||||||
|
|||||||
@@ -248,6 +248,7 @@ namespace IRaCIS.Application.Services
|
|||||||
|
|
||||||
|
|
||||||
builder.HtmlBody = string.Format(templateInfo,
|
builder.HtmlBody = string.Format(templateInfo,
|
||||||
|
"",
|
||||||
//---您正在参与展影医疗IRC项目
|
//---您正在参与展影医疗IRC项目
|
||||||
_localizer["Mail_IRCProject"],
|
_localizer["Mail_IRCProject"],
|
||||||
verificationCode
|
verificationCode
|
||||||
|
|||||||
@@ -432,11 +432,11 @@ namespace IRaCIS.Application.Services
|
|||||||
//判断 合作协议、正式简历 是否有。如果没有,显示提示信息,并且不能保存
|
//判断 合作协议、正式简历 是否有。如果没有,显示提示信息,并且不能保存
|
||||||
var attachmentList = await _attachmentRepository.Where(u => u.DoctorId == auditResumeParam.Id)
|
var attachmentList = await _attachmentRepository.Where(u => u.DoctorId == auditResumeParam.Id)
|
||||||
.Select(u => u.Type).ToListAsync();
|
.Select(u => u.Type).ToListAsync();
|
||||||
if (auditResumeParam.ResumeStatus == ResumeStatusEnum.Pass && ((!attachmentList.Contains("Resume")) || (!attachmentList.Contains("Consultant Agreement"))))
|
//if (auditResumeParam.ResumeStatus == ResumeStatusEnum.Pass && ((!attachmentList.Contains("Resume")) || (!attachmentList.Contains("Consultant Agreement"))))
|
||||||
{
|
//{
|
||||||
//---Resume & Consultant Agreement must be upload
|
// //---Resume & Consultant Agreement must be upload
|
||||||
return ResponseOutput.NotOk(_localizer["Doctor_RequiredDocumentsError"]);
|
// return ResponseOutput.NotOk(_localizer["Doctor_RequiredDocumentsError"]);
|
||||||
}
|
//}
|
||||||
var success = await _doctorRepository.BatchUpdateNoTrackingAsync(o => o.Id == auditResumeParam.Id, u => new Doctor()
|
var success = await _doctorRepository.BatchUpdateNoTrackingAsync(o => o.Id == auditResumeParam.Id, u => new Doctor()
|
||||||
{
|
{
|
||||||
CooperateStatus = auditResumeParam.CooperateStatus,
|
CooperateStatus = auditResumeParam.CooperateStatus,
|
||||||
|
|||||||
@@ -147,12 +147,12 @@ namespace IRaCIS.Application.Services
|
|||||||
var successs = await _repository.BatchUpdateAsync<Doctor>(o => o.Id == updateGCPExperienceParam.Id, u => new Doctor()
|
var successs = await _repository.BatchUpdateAsync<Doctor>(o => o.Id == updateGCPExperienceParam.Id, u => new Doctor()
|
||||||
{
|
{
|
||||||
GCP = updateGCPExperienceParam.GCP,
|
GCP = updateGCPExperienceParam.GCP,
|
||||||
GCPId = updateGCPExperienceParam.GCP==0&&updateGCPExperienceParam.GCPId==null?Guid.Empty: updateGCPExperienceParam.GCPId!.Value
|
GCPId = (updateGCPExperienceParam.GCP==0||updateGCPExperienceParam.GCPId==null)?Guid.Empty: updateGCPExperienceParam.GCPId!.Value
|
||||||
});
|
});
|
||||||
|
|
||||||
if (updateGCPExperienceParam.GCP == 0 && updateGCPExperienceParam.GCPId != null)
|
if (updateGCPExperienceParam.GCP == 0 )
|
||||||
{
|
{
|
||||||
await _repository.BatchDeleteAsync<Attachment>(a => a.Id == updateGCPExperienceParam.GCPId);
|
await _repository.BatchDeleteAsync<Attachment>(a => a.DoctorId == updateGCPExperienceParam.Id && a.Type=="GCP");
|
||||||
}
|
}
|
||||||
|
|
||||||
return ResponseOutput.Result(successs, updateGCPExperienceParam.GCPId.ToString());
|
return ResponseOutput.Result(successs, updateGCPExperienceParam.GCPId.ToString());
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
CreateMap<Doctor, SpecialtyDTO>()
|
CreateMap<Doctor, SpecialtyDTO>()
|
||||||
.ForMember(o => o.Speciality, t => t.MapFrom(u => u.Speciality.Value))
|
.ForMember(o => o.Speciality, t => t.MapFrom(u => u.Speciality.Value))
|
||||||
|
.ForMember(o => o.SpecialityCN, t => t.MapFrom(u => u.Speciality.ValueCN))
|
||||||
.ForMember(o => o.DictionaryList, t => t.MapFrom(u => u.DoctorDicRelationList.Where(t => t.KeyName == StaticData.ReadingType || t.KeyName == StaticData.Subspeciality).Select(t => t.Dictionary).OrderBy(t => t.ShowOrder)));
|
.ForMember(o => o.DictionaryList, t => t.MapFrom(u => u.DoctorDicRelationList.Where(t => t.KeyName == StaticData.ReadingType || t.KeyName == StaticData.Subspeciality).Select(t => t.Dictionary).OrderBy(t => t.ShowOrder)));
|
||||||
CreateMap<SpecialtyCommand, Doctor>();
|
CreateMap<SpecialtyCommand, Doctor>();
|
||||||
|
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
.Include(t => t.TrialEmailNoticeUserList).Include(t => t.TrialEmailBlackUserList).FirstOrDefaultAsync();
|
.Include(t => t.TrialEmailNoticeUserList).Include(t => t.TrialEmailBlackUserList).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
|
||||||
if (trialEmailConfig == null || trialEmailConfig.IsAutoSend == false)
|
if (trialEmailConfig == null || trialEmailConfig.IsAutoSend == false || trialEmailConfig.IsEnable==false)
|
||||||
{
|
{
|
||||||
return (null,null);
|
return (null,null);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,8 +36,8 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
public class DicomTrialSiteSubjectInfo
|
public class DicomTrialSiteSubjectInfo
|
||||||
{
|
{
|
||||||
public string TrialSiteCode { get; set; } = string.Empty;
|
public string TrialSiteCode { get; set; } = string.Empty;
|
||||||
public string SiteCode { get; set; } = string.Empty;
|
public string TrialSiteAliasName { get; set; } = string.Empty;
|
||||||
public string SiteName { get; set; } = string.Empty;
|
|
||||||
public string SubjectCode { get; set; } = string.Empty;
|
public string SubjectCode { get; set; } = string.Empty;
|
||||||
public int? SubjectAge { get; set; }
|
public int? SubjectAge { get; set; }
|
||||||
public string SubjectSex { get; set; } = string.Empty;
|
public string SubjectSex { get; set; } = string.Empty;
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IResponseOutput DicomUploadInProgress(Guid trialId, string studyInstanceUid)
|
public IResponseOutput DicomUploadInProgress(Guid trialId, string studyInstanceUid)
|
||||||
{
|
{
|
||||||
_provider.Set($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30));
|
_provider.Set($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(15));
|
||||||
|
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
|
|
||||||
@@ -247,6 +247,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
|
|
||||||
//重传的时候也要赋值检查Id
|
//重传的时候也要赋值检查Id
|
||||||
studyMonitor.StudyId = study.Id;
|
studyMonitor.StudyId = study.Id;
|
||||||
|
studyMonitor.StudyCode = study.StudyCode;
|
||||||
|
|
||||||
//特殊处理逻辑
|
//特殊处理逻辑
|
||||||
study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(study.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct());
|
study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(study.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct());
|
||||||
@@ -339,8 +340,6 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<PageOutput<UnionStudyViewModel>> GetDicomAndNoneDicomStudyList(StudyQuery studyQuery)
|
public async Task<PageOutput<UnionStudyViewModel>> GetDicomAndNoneDicomStudyList(StudyQuery studyQuery)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1398,7 +1398,7 @@ namespace IRaCIS.Application.Services
|
|||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 拆分病灶
|
/// 拆分病灶 分裂病灶
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -1444,7 +1444,12 @@ namespace IRaCIS.Application.Services
|
|||||||
});
|
});
|
||||||
await _readingTableAnswerRowInfoRepository.AddAsync(rowAnswer);
|
await _readingTableAnswerRowInfoRepository.AddAsync(rowAnswer);
|
||||||
await _readingTableQuestionAnswerRepository.AddRangeAsync(tableAnswers);
|
await _readingTableQuestionAnswerRepository.AddRangeAsync(tableAnswers);
|
||||||
await _readingTableAnswerRowInfoRepository.SaveChangesAsync();
|
await _readingTableAnswerRowInfoRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.RowId, x => new ReadingTableAnswerRowInfo()
|
||||||
|
{
|
||||||
|
SplitOrMergeType = SplitOrMergeType.SplitMain
|
||||||
|
});
|
||||||
|
|
||||||
|
await _readingTableAnswerRowInfoRepository.SaveChangesAsync();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,32 @@ namespace IRaCIS.Core.Application.ViewModel
|
|||||||
public Guid VisitTaskId { get; set; }
|
public Guid VisitTaskId { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ReadingTaskQuestionAnswerDto : ReadingTaskQuestionAnswer
|
public class CalculateTargetLesionStatusInDto
|
||||||
|
{
|
||||||
|
public Guid VisitTaskId { get; set;}
|
||||||
|
|
||||||
|
public Guid QuestionId { get; set; }
|
||||||
|
|
||||||
|
public decimal RowNumber { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GetSplitPPdOutDto
|
||||||
|
{
|
||||||
|
public Guid RowId { get; set; }
|
||||||
|
|
||||||
|
public string RowIndex { get; set; }
|
||||||
|
|
||||||
|
public decimal AllPPD { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GetSplitPPdInDto
|
||||||
|
{
|
||||||
|
|
||||||
|
public Guid VisitTaskId { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ReadingTaskQuestionAnswerDto : ReadingTaskQuestionAnswer
|
||||||
{
|
{
|
||||||
public QuestionType QuestionType { get; set; }
|
public QuestionType QuestionType { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ using MassTransit;
|
|||||||
using System.Reflection.Metadata.Ecma335;
|
using System.Reflection.Metadata.Ecma335;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NPOI.SS.Formula.Functions;
|
using NPOI.SS.Formula.Functions;
|
||||||
|
using DocumentFormat.OpenXml.Drawing.Charts;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
{
|
{
|
||||||
@@ -404,7 +405,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
if (lowPddTaskid != default(Guid))
|
if (lowPddTaskid != default(Guid))
|
||||||
{
|
{
|
||||||
|
|
||||||
var lowPPDAnswerList = await _readingTableQuestionAnswerRepository.Where(x =>x.VisitTaskId== lowPddTaskid
|
var lowPPDAnswerList = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == lowPddTaskid
|
||||||
&& x.QuestionId == inDto.QuestionId
|
&& x.QuestionId == inDto.QuestionId
|
||||||
&& x.RowIndex == inDto.RowIndex).Include(x => x.ReadingTableQuestionTrial)
|
&& x.RowIndex == inDto.RowIndex).Include(x => x.ReadingTableQuestionTrial)
|
||||||
.Select(x => new
|
.Select(x => new
|
||||||
@@ -447,7 +448,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
var calculateDto = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId);
|
var calculateDto = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId);
|
||||||
return new GetReportVerifyOutDto()
|
return new GetReportVerifyOutDto()
|
||||||
{
|
{
|
||||||
TumorEvaluate = calculateDto.QuestionInfo.Where(x=>x.QuestionType==QuestionType.ImgOncology).Select(x=>x.Answer).FirstOrDefault(),
|
TumorEvaluate = calculateDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.ImgOncology).Select(x => x.Answer).FirstOrDefault(),
|
||||||
IsExistDisease = await this.GetReportIsExistDisease(inDto.VisitTaskId),
|
IsExistDisease = await this.GetReportIsExistDisease(inDto.VisitTaskId),
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -676,7 +677,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
|
|
||||||
if (valueOfTypes.Contains(item.ValueType))
|
if (valueOfTypes.Contains(item.ValueType))
|
||||||
{
|
{
|
||||||
item.Answer = decimal.Round(decimal.Parse(item.Answer ?? "0"), inDto.DigitPlaces).ToString("F"+ inDto.DigitPlaces.ToString());
|
item.Answer = decimal.Round(decimal.Parse(item.Answer ?? "0"), inDto.DigitPlaces).ToString("F" + inDto.DigitPlaces.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
@@ -829,18 +830,18 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
if (await _readingTaskQuestionAnswerRepository.AnyAsync(x => x.ReadingQuestionTrial.QuestionType == QuestionType.ExistPET && x.VisitTaskId == inDto.VisitTaskId && x.Answer == ReadingYesOrNo.Yes.GetEnumInt()))
|
if (await _readingTaskQuestionAnswerRepository.AnyAsync(x => x.ReadingQuestionTrial.QuestionType == QuestionType.ExistPET && x.VisitTaskId == inDto.VisitTaskId && x.Answer == ReadingYesOrNo.Yes.GetEnumInt()))
|
||||||
{
|
{
|
||||||
|
|
||||||
List<QuestionType?> required=new List<QuestionType?>() {
|
List<QuestionType?> required = new List<QuestionType?>() {
|
||||||
QuestionType.LiverSUVmax,
|
QuestionType.LiverSUVmax,
|
||||||
QuestionType.MediastinumSUVmax,
|
QuestionType.MediastinumSUVmax,
|
||||||
QuestionType.SUVmax,
|
QuestionType.SUVmax,
|
||||||
QuestionType.SUVmaxLesion,
|
QuestionType.SUVmaxLesion,
|
||||||
QuestionType.PET5PS,
|
QuestionType.PET5PS,
|
||||||
};
|
};
|
||||||
if (taskinfo.VisitTaskNum != 0m)
|
if (taskinfo.VisitTaskNum != 0m)
|
||||||
{
|
{
|
||||||
required.Add(QuestionType.UptakeChange);
|
required.Add(QuestionType.UptakeChange);
|
||||||
required.Add(QuestionType.EvidenceFocalFDG);
|
required.Add(QuestionType.EvidenceFocalFDG);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((await _readingTaskQuestionAnswerRepository.CountAsync(x => required.Contains(x.ReadingQuestionTrial.QuestionType) && x.VisitTaskId == inDto.VisitTaskId && x.Answer != string.Empty)) != required.Count())
|
if ((await _readingTaskQuestionAnswerRepository.CountAsync(x => required.Contains(x.ReadingQuestionTrial.QuestionType) && x.VisitTaskId == inDto.VisitTaskId && x.Answer != string.Empty)) != required.Count())
|
||||||
{
|
{
|
||||||
@@ -848,12 +849,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
{
|
{
|
||||||
errorMassage += _localizer["ReadingCalculate_LuganoPetVerification"];
|
errorMassage += _localizer["ReadingCalculate_LuganoPetVerification"];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
errorMassage += _localizer["ReadingCalculate_LuganoBaseLinePetVerification"];
|
errorMassage += _localizer["ReadingCalculate_LuganoBaseLinePetVerification"];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -866,16 +867,189 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region 将上一次的访视病灶添加到这一次
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 将上一次的访视病灶添加到这一次
|
/// 计算靶病灶状态
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="inDto"></param>
|
/// <param name="inDto"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<AddTaskLesionAnswerFromLastTaskOutDto> AddTaskLesionAnswerFromLastTask(AddTaskLesionAnswerFromLastTaskInDto inDto)
|
public async Task CalculateTargetLesionStatus(CalculateTargetLesionStatusInDto inDto)
|
||||||
|
{
|
||||||
|
if (inDto.RowNumber % 1 != 0)
|
||||||
|
{
|
||||||
|
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
|
||||||
|
|
||||||
|
// 找到靶病灶问题
|
||||||
|
var targetQuestion = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskInfo.TrialReadingCriterionId && x.LesionType == LesionType.TargetLesion).FirstOrDefaultAsync();
|
||||||
|
if(targetQuestion!=null)
|
||||||
|
{
|
||||||
|
// 找到状态问题
|
||||||
|
var stateQuestion = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionId == targetQuestion.Id && x.QuestionMark == QuestionMark.State).FirstOrDefaultAsync();
|
||||||
|
if (stateQuestion != null)
|
||||||
|
{
|
||||||
|
|
||||||
|
// 找到主病灶的状态
|
||||||
|
var state =await _readingTableQuestionAnswerRepository.Where(x=>x.VisitTaskId==inDto.VisitTaskId&&x.RowIndex== (int)Math.Floor(inDto.RowNumber)&&x.TableQuestionId== stateQuestion.Id).Select(x=>x.Answer).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
// 长径
|
||||||
|
var majorAxis = (await _readingTableQuestionAnswerRepository.Where(x =>
|
||||||
|
x.VisitTaskId == inDto.VisitTaskId &&
|
||||||
|
x.RowIndex == (int)Math.Floor(inDto.RowNumber) &&
|
||||||
|
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.MajorAxis &&
|
||||||
|
x.QuestionId== targetQuestion.Id
|
||||||
|
).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
||||||
|
|
||||||
|
// 短径
|
||||||
|
var shortAxis = (await _readingTableQuestionAnswerRepository.Where(x =>
|
||||||
|
x.VisitTaskId == inDto.VisitTaskId &&
|
||||||
|
x.RowIndex == (int)Math.Floor(inDto.RowNumber) &&
|
||||||
|
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.ShortAxis &&
|
||||||
|
x.QuestionId == targetQuestion.Id
|
||||||
|
).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
||||||
|
|
||||||
|
// 找到ppd问题
|
||||||
|
var ppdQuestion = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionId == targetQuestion.Id && x.QuestionMark == QuestionMark.PPD).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
if(ppdQuestion!=null)
|
||||||
|
{
|
||||||
|
var ppdAnswerList= await _readingTableQuestionAnswerRepository.Where(x =>
|
||||||
|
x.VisitTaskId == inDto.VisitTaskId &&
|
||||||
|
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.PPD &&
|
||||||
|
x.QuestionId == targetQuestion.Id &&
|
||||||
|
x.RowIndex >= (int)Math.Floor(inDto.RowNumber) && x.RowIndex < ((int)Math.Floor(inDto.RowNumber) + 1)
|
||||||
|
).Select(x => x.Answer).ToListAsync();
|
||||||
|
|
||||||
|
var allPPd = ppdAnswerList.Select(x => x.IsNullOrEmptyReturn0()).Sum();
|
||||||
|
|
||||||
|
// 是否符合疾病进展
|
||||||
|
var accord = false;
|
||||||
|
|
||||||
|
var lowPPDInfo = await GetLowPPDInfo(new GetPPDInfoInDto()
|
||||||
|
{
|
||||||
|
RowIndex = (int)Math.Floor(inDto.RowNumber),
|
||||||
|
VisitTaskId = inDto.VisitTaskId,
|
||||||
|
QuestionId = inDto.QuestionId,
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
if (lowPPDInfo.NadirPPD != 0)
|
||||||
|
{
|
||||||
|
//15mm < 当前靶病灶LDi≤20mm &&
|
||||||
|
//&& 相比最低点PPD增加百分比 ≥50% &&
|
||||||
|
//(相比PPD最低点LDi增加值 ≥5 mm
|
||||||
|
//or相比PPD最低点SDi增加值≥5 mm)
|
||||||
|
if (15 < majorAxis && majorAxis <= 20 &&
|
||||||
|
(allPPd - lowPPDInfo.NadirPPD) * 100 / lowPPDInfo.NadirPPD >= 50 &&
|
||||||
|
(majorAxis - lowPPDInfo.LowPPDLDi >= 5 ||
|
||||||
|
shortAxis - lowPPDInfo.LowPPDSDi >= 5)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
accord = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//当前靶病灶LDi>20 mm
|
||||||
|
//相比最低点PPD增加百分比 ≥50%
|
||||||
|
// (相比PPD最低点LDi增加值 ≥10 mm
|
||||||
|
// 或者相比PPD最低点SDi增加值Sdi ≥10 mm)
|
||||||
|
if ( majorAxis > 20 &&
|
||||||
|
(allPPd - lowPPDInfo.NadirPPD) * 100 / lowPPDInfo.NadirPPD >= 50 &&
|
||||||
|
(majorAxis - lowPPDInfo.LowPPDLDi >= 10 ||
|
||||||
|
shortAxis - lowPPDInfo.LowPPDSDi >= 10)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
accord = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 符合疾病进展
|
||||||
|
if (accord)
|
||||||
|
{
|
||||||
|
await _readingTableQuestionAnswerRepository.UpdatePartialFromQueryAsync(x =>
|
||||||
|
x.VisitTaskId == inDto.VisitTaskId &&
|
||||||
|
x.RowIndex == (int)Math.Floor(inDto.RowNumber) &&
|
||||||
|
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State &&
|
||||||
|
x.QuestionId == targetQuestion.Id, x => new ReadingTableQuestionAnswer()
|
||||||
|
{
|
||||||
|
Answer = TargetState.DiseaseProgression.GetEnumInt()
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if (state == TargetState.DiseaseProgression.GetEnumInt())
|
||||||
|
{
|
||||||
|
await _readingTableQuestionAnswerRepository.UpdatePartialFromQueryAsync(x =>
|
||||||
|
x.VisitTaskId == inDto.VisitTaskId &&
|
||||||
|
x.RowIndex == (int)Math.Floor(inDto.RowNumber) &&
|
||||||
|
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State &&
|
||||||
|
x.QuestionId == targetQuestion.Id, x => new ReadingTableQuestionAnswer()
|
||||||
|
{
|
||||||
|
Answer = TargetState.Exist.GetEnumInt()
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取分裂病灶的PPd之和 不包括当前的主病灶
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<List<GetSplitPPdOutDto>> GetSplitPPdSum(GetSplitPPdInDto inDto)
|
||||||
|
{
|
||||||
|
List<GetSplitPPdOutDto> result = new List<GetSplitPPdOutDto>();
|
||||||
|
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
|
||||||
|
var targetQuestion = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskInfo.TrialReadingCriterionId && x.LesionType == LesionType.TargetLesion).FirstOrDefaultAsync();
|
||||||
|
if (targetQuestion != null)
|
||||||
|
{
|
||||||
|
var ppdAnswerList = await _readingTableQuestionAnswerRepository.Where(x =>
|
||||||
|
x.VisitTaskId == inDto.VisitTaskId &&
|
||||||
|
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.PPD &&
|
||||||
|
x.QuestionId == targetQuestion.Id)
|
||||||
|
.Select(x => new {
|
||||||
|
x.RowId,
|
||||||
|
x.RowIndex,
|
||||||
|
x.Answer
|
||||||
|
}).ToListAsync();
|
||||||
|
var answerList = ppdAnswerList.Select(x => new {
|
||||||
|
x.RowId,
|
||||||
|
x.RowIndex,
|
||||||
|
Answer = x.Answer.IsNullOrEmptyReturn0()
|
||||||
|
}).ToList();
|
||||||
|
var maxRowIndex = answerList.MaxOrDefault(x => x.RowIndex);
|
||||||
|
for (int i = 1; i < maxRowIndex; i++)
|
||||||
|
{
|
||||||
|
result.Add(new GetSplitPPdOutDto()
|
||||||
|
{
|
||||||
|
RowId = answerList.Where(x => x.RowIndex == i).Select(x => x.RowId).FirstOrDefault(),
|
||||||
|
RowIndex = answerList.Where(x => x.RowIndex == i).Select(x => x.RowIndex).FirstOrDefault().ToString(),
|
||||||
|
AllPPD = answerList.Where(x => x.RowIndex > i && x.RowIndex < (i + 1)).Sum(x => x.Answer),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region 将上一次的访视病灶添加到这一次
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 将上一次的访视病灶添加到这一次
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="inDto"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<AddTaskLesionAnswerFromLastTaskOutDto> AddTaskLesionAnswerFromLastTask(AddTaskLesionAnswerFromLastTaskInDto inDto)
|
||||||
{
|
{
|
||||||
var visitTaskId = inDto.VisitTaskId;
|
var visitTaskId = inDto.VisitTaskId;
|
||||||
|
|
||||||
|
|||||||
@@ -108,6 +108,14 @@ namespace IRaCIS.Core.Application.Contracts
|
|||||||
}
|
}
|
||||||
else //验证码正确 并且 没有超时
|
else //验证码正确 并且 没有超时
|
||||||
{
|
{
|
||||||
|
var dockerInfo=await _repository.Where<Doctor>(t=>t.EMail==inDto.EmailOrPhone||t.Phone==inDto.EmailOrPhone).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
if (dockerInfo != null)
|
||||||
|
{
|
||||||
|
result.DoctorId = dockerInfo.Id;
|
||||||
|
result.ReviewStatus = dockerInfo.ReviewStatus;
|
||||||
|
}
|
||||||
|
|
||||||
result.Token = _tokenService.GetToken(IRaCISClaims.Create(new UserBasicInfo()));
|
result.Token = _tokenService.GetToken(IRaCISClaims.Create(new UserBasicInfo()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -194,10 +194,10 @@ namespace IRaCIS.Core.Application.Services
|
|||||||
|
|
||||||
|
|
||||||
var siteQueryable = _siteRepository.AsQueryable(true)
|
var siteQueryable = _siteRepository.AsQueryable(true)
|
||||||
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.SiteName), t => t.SiteName.Contains(searchModel.SiteName) || t.SiteNameCN.Contains(searchModel.SiteName))
|
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.SiteName), t => t.SiteName.Contains(searchModel.SiteName) || t.SiteNameCN.Contains(searchModel.SiteName) || t.AliasName.Contains(searchModel.SiteName))
|
||||||
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.AliasName), t => t.AliasName.Contains(searchModel.AliasName))
|
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.AliasName), t => t.AliasName.Contains(searchModel.AliasName))
|
||||||
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.City), t => t.City.Contains(searchModel.City))
|
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.City), t => t.City.Contains(searchModel.City))
|
||||||
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.Country), t => t.Country.Contains(searchModel.Country))
|
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.Country), t => t.Country.Contains(searchModel.Country))
|
||||||
.ProjectTo<TrialSiteScreeningDTO>(_mapper.ConfigurationProvider, new { trialId = searchModel.TrialId , isEn_Us =_userInfo.IsEn_Us});
|
.ProjectTo<TrialSiteScreeningDTO>(_mapper.ConfigurationProvider, new { trialId = searchModel.TrialId , isEn_Us =_userInfo.IsEn_Us});
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -449,14 +449,14 @@ namespace IRaCIS.Core.Application.Services
|
|||||||
var studyList = await _repository.Where<DicomStudy>(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId)
|
var studyList = await _repository.Where<DicomStudy>(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId)
|
||||||
.WhereIf(isManualGenerate,t=>t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t=>t.TrialReadingCriterionId==taskInfo.TrialReadingCriterionId && t.IsConfirmed &&t.IsReading ))
|
.WhereIf(isManualGenerate,t=>t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t=>t.TrialReadingCriterionId==taskInfo.TrialReadingCriterionId && t.IsConfirmed &&t.IsReading ))
|
||||||
.Select(k => new VisitStudyDTO()
|
.Select(k => new VisitStudyDTO()
|
||||||
{
|
{
|
||||||
InstanceCount = k.InstanceCount,
|
InstanceCount = k.InstanceCount,
|
||||||
Modalities = k.Modalities,
|
Modalities = k.Modalities,
|
||||||
SeriesCount = k.SeriesCount,
|
SeriesCount = k.SeriesCount,
|
||||||
StudyCode = k.StudyCode,
|
StudyCode = k.StudyCode,
|
||||||
StudyId = k.Id,
|
StudyId = k.Id,
|
||||||
|
|
||||||
}).ToListAsync();
|
}).ToListAsync();
|
||||||
var studyIds = studyList.Select(t => t.StudyId).ToList();
|
var studyIds = studyList.Select(t => t.StudyId).ToList();
|
||||||
|
|
||||||
var instanceList = await _repository.Where<DicomInstance>(t => studyIds.Contains(t.StudyId))
|
var instanceList = await _repository.Where<DicomInstance>(t => studyIds.Contains(t.StudyId))
|
||||||
@@ -534,23 +534,35 @@ namespace IRaCIS.Core.Application.Services
|
|||||||
foreach (var item in noDicomStudyList)
|
foreach (var item in noDicomStudyList)
|
||||||
{
|
{
|
||||||
var nodicom = noDicomList.Where(x => x.Id == item.StudyId).First();
|
var nodicom = noDicomList.Where(x => x.Id == item.StudyId).First();
|
||||||
item.SeriesList = new List<DicomSeriesDTO>()
|
|
||||||
{
|
|
||||||
new DicomSeriesDTO (){
|
|
||||||
IsDicom=false,
|
|
||||||
Id=item.StudyId,
|
|
||||||
InstanceCount=await _noneDicomStudyFileRepository.Where(x=>x.NoneDicomStudyId==item.StudyId).CountAsync(),
|
|
||||||
Modality=item.Modalities,
|
|
||||||
StudyId=item.StudyId,
|
|
||||||
TrialId=nodicom.TrialId,
|
|
||||||
SiteId=nodicom.SiteId,
|
|
||||||
SubjectVisitId=nodicom.SubjectVisitId,
|
|
||||||
SubjectId=nodicom.SubjectId,
|
|
||||||
SeriesNumber=1,
|
|
||||||
NoneDicomFileFirstFile=await _noneDicomStudyFileRepository.Where(x=>x.NoneDicomStudyId==item.StudyId).Select(x=>x.Path).FirstOrDefaultAsync(),
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
var instanceCount = await _noneDicomStudyFileRepository.Where(x => x.NoneDicomStudyId == item.StudyId).CountAsync();
|
||||||
|
|
||||||
|
if (instanceCount == 0)
|
||||||
|
{
|
||||||
|
item.SeriesList = new List<DicomSeriesDTO>();
|
||||||
|
item.SeriesCount = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item.SeriesList = new List<DicomSeriesDTO>()
|
||||||
|
{
|
||||||
|
new DicomSeriesDTO (){
|
||||||
|
IsDicom=false,
|
||||||
|
Id=item.StudyId,
|
||||||
|
InstanceCount=instanceCount,
|
||||||
|
Modality=item.Modalities,
|
||||||
|
StudyId=item.StudyId,
|
||||||
|
TrialId=nodicom.TrialId,
|
||||||
|
SiteId=nodicom.SiteId,
|
||||||
|
SubjectVisitId=nodicom.SubjectVisitId,
|
||||||
|
SubjectId=nodicom.SubjectId,
|
||||||
|
SeriesNumber=1,
|
||||||
|
NoneDicomFileFirstFile=await _noneDicomStudyFileRepository.Where(x=>x.NoneDicomStudyId==item.StudyId).Select(x=>x.Path).FirstOrDefaultAsync(),
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
CreateMap<VisitStage, VisitStageDTO>();
|
CreateMap<VisitStage, VisitStageDTO>();
|
||||||
|
|
||||||
CreateMap<Subject, SubjectQueryView>()
|
CreateMap<Subject, SubjectQueryView>()
|
||||||
.ForMember(d => d.SiteName, u => u.MapFrom(s => s.TrialSite.Site.SiteName))
|
.ForMember(d => d.SiteName, u => u.MapFrom(s => s.TrialSite.TrialSiteAliasName))
|
||||||
.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.LatestBlindName, u => u.MapFrom(s => s.LatestSubjectVisit.BlindName))
|
.ForMember(d => d.LatestBlindName, u => u.MapFrom(s => s.LatestSubjectVisit.BlindName))
|
||||||
.ForMember(d => d.LatestVisitName, u => u.MapFrom(s => s.LatestSubjectVisit.VisitName))
|
.ForMember(d => d.LatestVisitName, u => u.MapFrom(s => s.LatestSubjectVisit.VisitName))
|
||||||
@@ -89,8 +89,7 @@ namespace IRaCIS.Core.Application.Service
|
|||||||
|
|
||||||
|
|
||||||
CreateMap<SubjectVisit, DicomTrialSiteSubjectInfo>().IncludeMembers(t=>t.Trial)
|
CreateMap<SubjectVisit, DicomTrialSiteSubjectInfo>().IncludeMembers(t=>t.Trial)
|
||||||
.ForMember(d => d.SiteName, u => u.MapFrom(s => s.Site.SiteName))
|
.ForMember(d => d.TrialSiteAliasName, u => u.MapFrom(s => s.TrialSite.TrialSiteAliasName))
|
||||||
.ForMember(d => d.SiteCode, u => u.MapFrom(s => s.Site.SiteCode))
|
|
||||||
.ForMember(d => d.SubjectVisitId, u => u.MapFrom(s => s.Id))
|
.ForMember(d => d.SubjectVisitId, u => u.MapFrom(s => s.Id))
|
||||||
.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.TrialCode, u => u.MapFrom(s => s.Trial.TrialCode))
|
.ForMember(d => d.TrialCode, u => u.MapFrom(s => s.Trial.TrialCode))
|
||||||
|
|||||||
+3
-3
@@ -92,10 +92,10 @@ namespace IRaCIS.Core.Application.MediatR.CommandAndQueries
|
|||||||
|
|
||||||
|
|
||||||
//[Required(ErrorMessage = "检查日期不能为空")]
|
//[Required(ErrorMessage = "检查日期不能为空")]
|
||||||
[CanConvertToTime(ErrorMessage = "Does not conform to Stusy Date format")]
|
[CanConvertToTime(ErrorMessage = "Does not conform to Study Date format")]
|
||||||
|
|
||||||
[ImporterHeader(Name = "Stusy Date", AutoTrim = true)]
|
[ImporterHeader(Name = "Study Date", AutoTrim = true)]
|
||||||
[ExcelColumnName("Stusy Date")]
|
[ExcelColumnName("Study Date")]
|
||||||
public string StudyDate { get; set; } = string.Empty;
|
public string StudyDate { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -633,27 +633,32 @@ namespace IRaCIS.Core.Domain.Share
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 病灶分裂或合并
|
/// 病灶分裂或合并
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public enum SplitOrMergeType
|
public enum SplitOrMergeType
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 分裂
|
||||||
|
/// </summary>
|
||||||
|
Split = 0,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 分裂
|
/// 合并
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Split = 0,
|
Merge = 1,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 合并
|
/// 分裂主病灶
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Merge = 1
|
SplitMain = 2,
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
}
|
||||||
/// 是否存在或者NA
|
|
||||||
/// </summary>
|
/// <summary>
|
||||||
public enum ExistOrNA
|
/// 是否存在或者NA
|
||||||
|
/// </summary>
|
||||||
|
public enum ExistOrNA
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// NA
|
/// NA
|
||||||
|
|||||||
+37
-12
@@ -1,9 +1,10 @@
|
|||||||
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
type: docker
|
type: docker
|
||||||
name: irc-netcore-api
|
name: irc-netcore-api
|
||||||
|
|
||||||
clone:
|
clone:
|
||||||
disable: true #禁用默认克隆
|
disable: true
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: clone-repo
|
- name: clone-repo
|
||||||
@@ -46,7 +47,6 @@ steps:
|
|||||||
- cd /work/netcore-repo/IRaCIS.Core.API
|
- cd /work/netcore-repo/IRaCIS.Core.API
|
||||||
- dotnet publish ./IRaCIS.Core.API.csproj -c Release --no-restore -o /work/publish
|
- dotnet publish ./IRaCIS.Core.API.csproj -c Release --no-restore -o /work/publish
|
||||||
|
|
||||||
|
|
||||||
- name: docker-build
|
- name: docker-build
|
||||||
image: docker
|
image: docker
|
||||||
pull: if-not-exists
|
pull: if-not-exists
|
||||||
@@ -77,6 +77,7 @@ trigger:
|
|||||||
- master
|
- master
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
type: ssh
|
type: ssh
|
||||||
name: ssh-linux-test-irc-publish
|
name: ssh-linux-test-irc-publish
|
||||||
@@ -86,15 +87,13 @@ platform:
|
|||||||
arch: 386
|
arch: 386
|
||||||
|
|
||||||
clone:
|
clone:
|
||||||
disable: true #禁用默认克隆
|
disable: true
|
||||||
|
|
||||||
server:
|
server:
|
||||||
host: 123.56.94.154
|
host: 123.56.94.154
|
||||||
user: root
|
user: root
|
||||||
password:
|
password:
|
||||||
from_secret: test_ssh_pwd
|
from_secret: test_ssh_pwd
|
||||||
# ssh_key:
|
|
||||||
# from_secret: rsa_key
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: publish-test-irc
|
- name: publish-test-irc
|
||||||
@@ -109,7 +108,35 @@ trigger:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
kind: pipeline
|
||||||
|
type: ssh
|
||||||
|
name: test-irc-publish-image-push-aliyun
|
||||||
|
|
||||||
|
platform:
|
||||||
|
os: Linux
|
||||||
|
arch: 386
|
||||||
|
|
||||||
|
clone:
|
||||||
|
disable: true
|
||||||
|
|
||||||
|
server:
|
||||||
|
host: 192.168.3.68
|
||||||
|
user: root
|
||||||
|
password:
|
||||||
|
from_secret: local_pwd
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build-and-push-image
|
||||||
|
commands:
|
||||||
|
- cd /opt/hang/netcore/irc-test
|
||||||
|
- sh test-irc.sh v${DRONE_BUILD_NUMBER}
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
branch:
|
||||||
|
- Test_IRC_Net8
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
type: ssh
|
type: ssh
|
||||||
name: ssh-linux-test-study-publish
|
name: ssh-linux-test-study-publish
|
||||||
@@ -119,8 +146,8 @@ platform:
|
|||||||
arch: 386
|
arch: 386
|
||||||
|
|
||||||
clone:
|
clone:
|
||||||
disable: true #禁用默认克隆
|
disable: true
|
||||||
|
|
||||||
server:
|
server:
|
||||||
host: 123.56.94.154
|
host: 123.56.94.154
|
||||||
user: root
|
user: root
|
||||||
@@ -136,6 +163,4 @@ steps:
|
|||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
branch:
|
branch:
|
||||||
- Test.Study
|
- Test.Study
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user