Merge branch 'Test_IRC_Net8' into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details

Uat_IRC_Net8
he 2025-05-22 18:01:11 +08:00
commit 0a6ee05417
11 changed files with 19554 additions and 16 deletions

View File

@ -75,6 +75,7 @@ public class SystemEmailSendConfig
public class SystemEmailSendConfigView
{
public string SystemShortName { get; set; } = string.Empty;
public string CompanyName { get; set; } = string.Empty;
public string CompanyNameCN { get; set; } = string.Empty;

View File

@ -522,7 +522,7 @@
<param name="agreeReReadingCommand"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Allocation.VisitTaskService.PMSetTaskBack(System.Guid,System.Guid)">
<member name="M:IRaCIS.Core.Application.Service.Allocation.VisitTaskService.PMSetTaskBack(System.Guid,System.Guid,System.String)">
<summary>
PM 设置任务 退回
</summary>
@ -14169,7 +14169,7 @@
返回
</summary>
</member>
<member name="M:IRaCIS.Core.Application.MassTransit.Consumer.ConsistencyCheckConsumer.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomStudy},IRaCIS.Core.Domain.Share.IUserInfo,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialSite},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},AutoMapper.IMapper,Microsoft.Extensions.Localization.IStringLocalizer,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.SystemEmailSendConfig})">
<member name="M:IRaCIS.Core.Application.MassTransit.Consumer.ConsistencyCheckConsumer.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomStudy},IRaCIS.Core.Domain.Share.IUserInfo,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialSite},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},AutoMapper.IMapper,Microsoft.Extensions.Localization.IStringLocalizer,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.SystemEmailSendConfig},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Dictionary})">
<summary>
构造函数注入
</summary>

View File

@ -214,6 +214,8 @@ namespace IRaCIS.Core.Application.ViewModel
/// </summary>
public bool IsManualGeneration { get; set; }
//public bool IsAfterConvertedTask { get; set; }
public string PMBackReason { get; set; }
}

View File

@ -2281,11 +2281,11 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
/// PM 设置任务 退回
/// </summary>
/// <returns></returns>
[HttpPut("{trialId:guid}/{taskId:guid}")]
[HttpPut("{trialId:guid}/{taskId:guid}/{pmBackReason}")]
[UnitOfWork]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> PMSetTaskBack(Guid trialId, Guid taskId)
public async Task<IResponseOutput> PMSetTaskBack(Guid trialId, Guid taskId,string pmBackReason)
{
//var trialConfig = (await _trialRepository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.IsReadingTaskViewInOrder, t.ReadingType }).FirstOrDefaultAsync()).IfNullThrowException();
@ -2346,7 +2346,6 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
#region 有序 无序公用流程
//执行类似一致性核查回退流程 回退访视到影像上传流程
await VisitBackAsync(task.SourceSubjectVisitId);
@ -2463,6 +2462,9 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
}
var trackTask = await _visitTaskRepository.FindAsync(task.Id);
trackTask.PMBackReason = pmBackReason;
}
else
{
@ -2677,8 +2679,9 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
}
else
{
//默认影响的都是该标准的任务
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == filterObj.TrialReadingCriterionId);
//默认影响的都是该标准的任务
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == filterObj.TrialReadingCriterionId);
}

View File

@ -922,7 +922,7 @@ namespace IRaCIS.Core.Application.Service
var password = loginDto.Password;
var emailConfig = _emailConfig.CurrentValue;
var companyInfo = new SystemEmailSendConfigView() { CompanyName = emailConfig.CompanyName, CompanyNameCN = emailConfig.CompanyNameCN, CompanyShortName = emailConfig.CompanyShortName, CompanyShortNameCN = emailConfig.CompanyShortNameCN };
var companyInfo = new SystemEmailSendConfigView() { CompanyName = emailConfig.CompanyName, CompanyNameCN = emailConfig.CompanyNameCN, CompanyShortName = emailConfig.CompanyShortName, CompanyShortNameCN = emailConfig.CompanyShortNameCN,SystemShortName=emailConfig.SystemShortName };
int maxFailures = _verifyConfig.CurrentValue.LoginMaxFailCount;

View File

@ -255,7 +255,7 @@ namespace IRaCIS.Core.Application.Image.QA
/// <returns></returns>
/// <exception cref="BusinessValidationFailedException"></exception>
[HttpPut]
public async Task<IResponseOutput> RequestImageBack(Guid subjectVisitId,string ApplyReason)
public async Task<IResponseOutput> RequestImageBack(Guid subjectVisitId, string ApplyReason)
{
if (_subjectVisitRepository.Any(t => t.Id == subjectVisitId && t.QCChallengeList.Any(t => t.IsClosed == false)))
@ -266,7 +266,7 @@ namespace IRaCIS.Core.Application.Image.QA
if (!_subjectVisitRepository.Any(t => t.Id == subjectVisitId && !t.VisitTaskList.Any(u => u.TaskState == TaskState.Effect) && t.SubmitState == SubmitStateEnum.Submitted))
{
//已提交未生成任务的才允许申请
//已提交未生成任务的才允许申请
throw new BusinessValidationFailedException(_localizer["QCOperation_ShouldBeforeCheckPassed"]);
}
@ -291,7 +291,7 @@ namespace IRaCIS.Core.Application.Image.QA
throw new BusinessValidationFailedException(_localizer["QCOperation_SomeOneHaveApplyedImageBack"]);
}
var newRecord = new SubjectVisitImageBackRecord() { SubjectVisitId = subjectVisitId, ApplyReason=ApplyReason, SubmitTime = sv.SubmitTime, EarliestScanDate = sv.EarliestScanDate, LatestScanDate = sv.LatestScanDate };
var newRecord = new SubjectVisitImageBackRecord() { SubjectVisitId = subjectVisitId, ApplyReason = ApplyReason, SubmitTime = sv.SubmitTime, EarliestScanDate = sv.EarliestScanDate, LatestScanDate = sv.LatestScanDate };
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator)
{
@ -319,7 +319,7 @@ namespace IRaCIS.Core.Application.Image.QA
/// <returns></returns>
/// <exception cref="BusinessValidationFailedException"></exception>
[HttpPut]
public async Task<IResponseOutput> AuditImageBack(Guid iamgeBackRecordId, bool isAgree,string? resultRemark)
public async Task<IResponseOutput> AuditImageBack(Guid iamgeBackRecordId, bool isAgree, string? resultRemark)
{
var backRecord = (await _subjectVisitImageBackRecordReposiotry.FirstOrDefaultAsync(t => t.Id == iamgeBackRecordId)).IfNullThrowException();
@ -414,7 +414,7 @@ namespace IRaCIS.Core.Application.Image.QA
}
backRecord.AuditTime = DateTime.Now;
backRecord.ResultRemark = resultRemark??string.Empty;
backRecord.ResultRemark = resultRemark ?? string.Empty;
await _subjectVisitRepository.SaveChangesAsync();
return ResponseOutput.Ok();
@ -1106,7 +1106,9 @@ namespace IRaCIS.Core.Application.Image.QA
{
var prefix = fisrtPath.Substring(1, fisrtPath.LastIndexOf('/') - 1);
await _oSSService.DeleteFromPrefix(prefix, false);
await _oSSService.DeleteFromPrefix(prefix, true);
}
}
@ -1248,7 +1250,9 @@ namespace IRaCIS.Core.Application.Image.QA
return new GetNextIQCQualityOutDto() { };
break;
case TrialQCProcess.SingleAudit:
visitList = await _subjectVisitRepository.Where(x => x.SubmitState == SubmitStateEnum.Submitted
visitList = await _subjectVisitRepository
.Where(x => !x.SubjectVisitImageBackRecordList.Any(t => t.ImageBackState == ImageBackStateEnum.None))
.Where(x => x.SubmitState == SubmitStateEnum.Submitted
&& x.TrialId == inDto.TrialId && x.PreliminaryAuditUserId != _userInfo.UserRoleId && (x.CurrentActionUserId == _userInfo.UserRoleId || (x.AuditState != AuditStateEnum.PrimaryQCPassed && !x.IsTake)))
.Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.UserRoleId)
.Include(x => x.Subject).ToListAsync();
@ -1282,7 +1286,9 @@ namespace IRaCIS.Core.Application.Image.QA
break;
case TrialQCProcess.DoubleAudit:
visitList = await _subjectVisitRepository.Where(x => x.SubmitState == SubmitStateEnum.Submitted && x.TrialId == inDto.TrialId &&
visitList = await _subjectVisitRepository
.Where(x => !x.SubjectVisitImageBackRecordList.Any(t => t.ImageBackState == ImageBackStateEnum.None))
.Where(x => x.SubmitState == SubmitStateEnum.Submitted && x.TrialId == inDto.TrialId &&
((x.CurrentActionUserId == _userInfo.UserRoleId) || (!x.IsTake && x.AuditState != AuditStateEnum.QCPassed && (x.PreliminaryAuditUserId != _userInfo.UserRoleId)))
)
.Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.UserRoleId)
@ -1356,6 +1362,11 @@ namespace IRaCIS.Core.Application.Image.QA
return ResponseOutput.NotOk(_localizer["QCOperation_QCConfigFirst"], ApiResponseCodeEnum.NeedTips);
}
if (_subjectVisitImageBackRecordReposiotry.Any(t => t.SubjectVisitId == subjectVisitId && t.ImageBackState == ImageBackStateEnum.None))
{
//已申请的影像回退,不能领取
throw new BusinessValidationFailedException(_localizer["QCOperation_HaveApplyedImageBackCanNotObtain"]);
}
//if (await _subjectVisitRepository.AnyAsync(t => t.IsTake &&
// t.SubjectId != dbSubjectVisit.SubjectId &&

View File

@ -285,4 +285,7 @@ public class VisitTask : BaseFullAuditEntity
[Comment("通知IR加急阅片时间")]
public DateTime? ExpetidEmailNoticeTime { get; set; }
[Comment("退回原因")]
public string PMBackReason { get; set; }
}

View File

@ -3487,12 +3487,28 @@ namespace IRaCIS.Core.Infra.EFCore.Common
}
else
{
isDistinctionInterface = false;
isDistinctionInterface = false;
switch (_userInfo.RequestUrl)
{
//申请重阅
case "VisitTask/applyReReading":
extraIdentification = "/" + (int)entity.ReReadingApplyState;
//PM 申请重阅区分不了是否有SPM参与
if (entity.ReReadingApplyState== ReReadingApplyState.TrialGroupHaveApplyed)
{
var hasSPM = _dbContext.VisitTaskReReading.Any(t => t.OriginalReReadingTaskId == entity.Id);
if (!hasSPM)
{
//有SPM 是5 没有SPM是6
extraIdentification = "/" + 6;
}
}
break;
@ -3510,6 +3526,16 @@ namespace IRaCIS.Core.Infra.EFCore.Common
}
break;
case "VisitTask/PMSetTaskBack":
if (entity.PMBackReason.IsNotNullOrEmpty())
{
extraIdentification = "/" + "Reason";
}
break;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,31 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class pmReason : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "PMBackReason",
table: "VisitTask",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "",
comment: "退回原因");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "PMBackReason",
table: "VisitTask");
}
}
}

View File

@ -14378,6 +14378,12 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.HasColumnType("uniqueidentifier")
.HasComment("在访视或者全局任务上记录 裁判任务的Id");
b.Property<string>("PMBackReason")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)")
.HasComment("退回原因");
b.Property<string>("PastResultTaskIds")
.IsRequired()
.HasMaxLength(2000)