阅片期修改
continuous-integration/drone/push Build is running
Details
continuous-integration/drone/push Build is running
Details
parent
32c8d70179
commit
a67472c9b4
|
|
@ -46,12 +46,20 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||
public class GetReadModulePageListInDto : PageInput
|
||||
{
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 阅片期名称
|
||||
/// </summary>
|
||||
public string ModuleName { get; set; } = string.Empty;
|
||||
|
||||
public string SubjectCode { get; set; }
|
||||
|
||||
public string VisitName { get; set; }
|
||||
|
||||
[NotDefault]
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 阅片配置的类型
|
||||
/// </summary>
|
||||
|
|
@ -59,54 +67,60 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||
|
||||
public ReadModuleAddType? ReadModuleAddTypeEnum { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class GetReadModulePageListOutDto
|
||||
{
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
public string SubjectCode { get; set; }
|
||||
public Guid Id { get; set; }
|
||||
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
|
||||
|
||||
public ModuleTypeEnum ModuleType { get; set; }
|
||||
|
||||
public string VisitName { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public string ModuleName { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public bool? IsUrgent { get; set; }
|
||||
|
||||
public Guid SubjectVisitId { get; set; }
|
||||
|
||||
public Guid? ReadingPeriodSetId { get; set; }
|
||||
|
||||
public Guid TrialId { get; set; }
|
||||
public bool IsCRCConfirm { get; set; } = false;
|
||||
|
||||
public bool IsPMConfirm { get; set; } = false;
|
||||
|
||||
public bool IsNotNeedPMConfirm { get; set; } = false;
|
||||
|
||||
|
||||
public bool IsCRCApplicationRevoke { get; set; } = false;
|
||||
[Comment("临床数据是否完整")]
|
||||
public bool? IsClinicalDataComplete { get; set; }
|
||||
|
||||
[Comment("临床数据是否盲化")]
|
||||
public bool? IsClinicalDataBlind { get; set; }
|
||||
|
||||
[Comment("阅片配置的类型")]
|
||||
/// <summary>
|
||||
/// 阅片期类型
|
||||
/// </summary>
|
||||
public ReadingSetType ReadingSetType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 添加方式
|
||||
/// 阅片期名称
|
||||
/// </summary>
|
||||
public string ModuleName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 中心编号
|
||||
/// </summary>
|
||||
public string SiteCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 受试者编号
|
||||
/// </summary>
|
||||
|
||||
public string SubjectCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 访视名称
|
||||
/// </summary>
|
||||
public string VisitName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 最晚拍片日期
|
||||
/// </summary>
|
||||
public DateTime? LatestScanDate { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 来源
|
||||
/// </summary>
|
||||
public ReadModuleAddType ReadModuleAddTypeEnum { get; set; } = ReadModuleAddType.Normal;
|
||||
|
||||
/// <summary>
|
||||
/// 是否生成任务
|
||||
/// </summary>
|
||||
public bool IsGenerateTask { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 生成任务时间
|
||||
/// </summary>
|
||||
public DateTime? GenerateTaskTime { get; set; }
|
||||
|
||||
public ReadingStatusEnum ReadingStatus { get; set; } = ReadingStatusEnum.TaskAllocate;
|
||||
}
|
||||
|
||||
public class GetSubjectReadVisitsOutDto
|
||||
|
|
|
|||
|
|
@ -138,11 +138,6 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||
{
|
||||
public List<Guid> SubjectVisitIdList { get; set; } = new List<Guid>();
|
||||
|
||||
/// <summary>
|
||||
/// 是否加入阅片计划
|
||||
/// </summary>
|
||||
public bool IsJoin { get; set; }
|
||||
|
||||
public Guid Id { get; set; }
|
||||
}
|
||||
|
||||
|
|
@ -283,6 +278,16 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||
/// </summary>
|
||||
public bool? IsGenerate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否生成任务
|
||||
/// </summary>
|
||||
public bool? IsGenerateTask { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 生成时间
|
||||
/// </summary>
|
||||
public DateTime? GeneratedTime { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class ReadingPeriodSetView
|
||||
|
|
@ -431,6 +436,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
|||
public class AddReadModuleVisitInfo
|
||||
{
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
public Guid? ReadingPeriodPlanId { get; set; }
|
||||
public bool IsUrgent { get; set; }
|
||||
public Guid SubjectVisitId { get; set; }
|
||||
|
||||
|
|
|
|||
|
|
@ -836,15 +836,27 @@ namespace IRaCIS.Core.Application.Service
|
|||
{
|
||||
|
||||
var readModuleQueryable = _readModuleRepository
|
||||
.Where(x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId)
|
||||
.WhereIf(inDto.ReadModuleAddTypeEnum != null, x => x.ReadModuleAddTypeEnum == inDto.ReadModuleAddTypeEnum)
|
||||
.WhereIf(inDto.ReadingSetType != null, x => x.ReadingSetType == inDto.ReadingSetType)
|
||||
.WhereIf(inDto.SubjectCode.IsNotNullOrEmpty(), x => x.Subject.Code.Contains(inDto.SubjectCode))
|
||||
.WhereIf(inDto.VisitName.IsNotNullOrEmpty(), x => x.SubjectVisit.VisitName.Contains(inDto.VisitName))
|
||||
.ProjectTo<GetReadModulePageListOutDto>(_mapper.ConfigurationProvider);
|
||||
.Where(x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId)
|
||||
.WhereIf(inDto.ReadModuleAddTypeEnum != null, x => x.ReadModuleAddTypeEnum == inDto.ReadModuleAddTypeEnum)
|
||||
.WhereIf(inDto.ReadingSetType != null, x => x.ReadingSetType == inDto.ReadingSetType)
|
||||
.WhereIf(inDto.SubjectCode.IsNotNullOrEmpty(), x => x.Subject.Code.Contains(inDto.SubjectCode))
|
||||
.WhereIf(inDto.VisitName.IsNotNullOrEmpty(), x => x.SubjectVisit.VisitName.Contains(inDto.VisitName))
|
||||
.ProjectTo<GetReadModulePageListOutDto>(_mapper.ConfigurationProvider);
|
||||
|
||||
|
||||
var pageList = await readModuleQueryable.ToPagedListAsync(inDto);
|
||||
|
||||
var ids = pageList.CurrentPageData.Select(x => x.Id as Guid?).ToList();
|
||||
|
||||
|
||||
var taskList=await _visitTaskRepository.Where(x => ids.Contains(x.SouceReadModuleId)).ToListAsync();
|
||||
|
||||
pageList.CurrentPageData.ForEach(x =>
|
||||
{
|
||||
|
||||
x.IsGenerateTask= taskList.Any(t => t.SouceReadModuleId == x.Id);
|
||||
x.GenerateTaskTime= taskList.Where(t => t.SouceReadModuleId == x.Id).OrderByDescending(t => t.CreateTime).Select(t => t.CreateTime).FirstOrDefault();
|
||||
|
||||
});
|
||||
return pageList;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using IRaCIS.Core.Application.Contracts;
|
||||
using DocumentFormat.OpenXml.Drawing;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Filter;
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
|
|
@ -205,7 +206,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
{
|
||||
SubjectId = x.SubjectVisit.SubjectId,
|
||||
SubjectVisitId = x.SubjectVisitId,
|
||||
|
||||
ReadingPeriodPlanId=x.Id,
|
||||
IsUrgent = false
|
||||
}).ToList()
|
||||
|
||||
|
|
@ -285,6 +286,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
SubjectVisitId = item.SubjectVisitId,
|
||||
ReadingSetType = inDto.ReadingSetType,
|
||||
ReadingPeriodSetId = inDto.ReadingPeriodSetId,
|
||||
ReadingPeriodPlanId= item.ReadingPeriodPlanId,
|
||||
ReadingStatus = ReadingStatusEnum.TaskAllocate,
|
||||
TrialId = inDto.TrialId,
|
||||
//VisitNum = item.SubjectVisit.VisitNum,
|
||||
|
|
@ -615,11 +617,12 @@ namespace IRaCIS.Core.Application.Service
|
|||
TrialId = readingPeriodSet.TrialId,
|
||||
ReadingPeriodSetId = readingPeriodSet.Id,
|
||||
TrialReadingCriterionId = readingPeriodSet.TrialReadingCriterionId,
|
||||
VisitInfoList = subejctVisits.Select(x => new AddReadModuleVisitInfo()
|
||||
VisitInfoList = plans.Select(x => new AddReadModuleVisitInfo()
|
||||
{
|
||||
SubjectId = x.SubjectId,
|
||||
SubjectId = subejctVisits.Where(y=>y.Id==x.SubjectVisitId).Select(x=>x.SubjectId).FirstOrDefault(),
|
||||
SubjectVisitId = x.Id,
|
||||
IsUrgent = x.IsUrgent,
|
||||
ReadingPeriodPlanId= x.Id,
|
||||
IsUrgent = subejctVisits.Where(y => y.Id == x.SubjectVisitId).Select(x => x.IsUrgent).FirstOrDefault(),
|
||||
|
||||
}).ToList()
|
||||
|
||||
|
|
@ -629,36 +632,35 @@ namespace IRaCIS.Core.Application.Service
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置加入或者移除阅片计划
|
||||
/// 移除阅片计划
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> SetBatchAddOrRemoveReadingPlan(SetBatchAddOrRemoveReadingPlanInDto inDto)
|
||||
public async Task<IResponseOutput> SetBatchRemoveReadingPlan(SetBatchAddOrRemoveReadingPlanInDto inDto)
|
||||
{
|
||||
|
||||
var planSet = await _readingPeriodSetRepository.Where(x => x.Id == inDto.Id).FirstNotNullAsync();
|
||||
List<Guid> isGenerateTaskVisitIds = new List<Guid>();
|
||||
List<ReadModule> readModules = new List<ReadModule>();
|
||||
|
||||
if (inDto.IsJoin)
|
||||
{
|
||||
var existsVisitIds = await _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == inDto.Id).Select(x => x.SubjectVisitId).ToListAsync();
|
||||
readModules = await _readModuleRepository.Where(x => x.ReadingPeriodSetId == inDto.Id).ToListAsync();
|
||||
|
||||
inDto.SubjectVisitIdList = inDto.SubjectVisitIdList.Where(x => !existsVisitIds.Contains(x)).ToList();
|
||||
var readModuleIds = readModules.Select(x => x.Id).ToList();
|
||||
|
||||
List<ReadingPeriodPlan> plans = inDto.SubjectVisitIdList.Select(x => new ReadingPeriodPlan()
|
||||
{
|
||||
SubjectVisitId = x,
|
||||
ReadingPeriodSetId = inDto.Id
|
||||
}).ToList();
|
||||
var souceReadModuleIds = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == planSet.TrialReadingCriterionId && readModuleIds.Contains(x.SouceReadModuleId ?? default(Guid))).Select(x => x.SouceReadModuleId).ToListAsync();
|
||||
|
||||
await _readingPeriodPlanRepository.AddRangeAsync(plans);
|
||||
}
|
||||
else
|
||||
{
|
||||
await _readingPeriodPlanRepository.UpdatePartialFromQueryAsync(x => x.ReadingPeriodSetId == inDto.Id && inDto.SubjectVisitIdList.Contains(x.SubjectVisitId), x => new ReadingPeriodPlan()
|
||||
{
|
||||
IsDeleted = true
|
||||
});
|
||||
}
|
||||
isGenerateTaskVisitIds = await _readModuleRepository.Where(x => souceReadModuleIds.Contains(x.Id) && x.ReadingPeriodPlanId != null).Select(x => x.SubjectVisitId).ToListAsync();
|
||||
|
||||
inDto.SubjectVisitIdList= inDto.SubjectVisitIdList.Where(x => !isGenerateTaskVisitIds.Contains(x)).ToList();
|
||||
|
||||
var planIds= await _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == inDto.Id && inDto.SubjectVisitIdList.Contains(x.SubjectVisitId)).Select(x=>x.Id).ToListAsync();
|
||||
|
||||
|
||||
var deletePlasIds= planIds.Select(x=>(Guid?)x).ToList();
|
||||
|
||||
await _readModuleRepository.DeleteFromQueryAsync(x => deletePlasIds.Contains(x.ReadingPeriodPlanId));
|
||||
await _readingPeriodPlanRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == inDto.Id && inDto.SubjectVisitIdList.Contains(x.SubjectVisitId);
|
||||
|
||||
|
||||
await _readingPeriodPlanRepository.SaveChangesAsync();
|
||||
|
|
@ -690,10 +692,26 @@ namespace IRaCIS.Core.Application.Service
|
|||
});
|
||||
|
||||
List<Guid> isChooseVisitIds = new List<Guid>();
|
||||
|
||||
if (isChangeReadingPlan)
|
||||
List<Guid> IsGenerateVisitIds = new List<Guid>();
|
||||
List<ReadingPeriodPlan> chooseVisitVisitList = new List<ReadingPeriodPlan>();
|
||||
List<Guid> isGenerateTaskVisitIds = new List<Guid>();
|
||||
List<ReadModule> readModules = new List<ReadModule>();
|
||||
if (!isChangeReadingPlan)
|
||||
{
|
||||
isChooseVisitIds= await _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == inDto.Id).Select(x => x.SubjectVisitId).ToListAsync();
|
||||
if (inDto.Id != null)
|
||||
{
|
||||
readModules = await _readModuleRepository.Where(x => x.ReadingPeriodSetId == inDto.Id).ToListAsync();
|
||||
|
||||
var readModuleIds= readModules.Select(x => x.Id).ToList();
|
||||
|
||||
var souceReadModuleIds = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId && readModuleIds.Contains(x.SouceReadModuleId ?? default(Guid))).Select(x=>x.SouceReadModuleId).ToListAsync();
|
||||
|
||||
isGenerateTaskVisitIds = await _readModuleRepository.Where(x => souceReadModuleIds.Contains(x.Id)&&x.ReadingPeriodPlanId!=null).Select(x=>x.SubjectVisitId).ToListAsync();
|
||||
}
|
||||
|
||||
chooseVisitVisitList = await _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == inDto.Id).ToListAsync();
|
||||
isChooseVisitIds= chooseVisitVisitList.Select(x => x.SubjectVisitId).ToList();
|
||||
IsGenerateVisitIds= chooseVisitVisitList.Where(x => x.IsGenerate).Select(x => x.SubjectVisitId).ToList();
|
||||
}
|
||||
|
||||
var isTakeEffect = await _readingPeriodSetRepository.Where(x => x.Id == inDto.Id).Select(x => x.IsTakeEffect).FirstOrDefaultAsync();
|
||||
|
|
@ -704,6 +722,11 @@ namespace IRaCIS.Core.Application.Service
|
|||
.WhereIf(inDto.ReadingScope == ReadingScopeEnum.Site, x => inDto.SiteIds.Contains(x.TrialSiteId))
|
||||
.Where(x => !x.IsBaseLine);// 排除基线
|
||||
|
||||
|
||||
var chooseVisitQuery = _subjectVisitRepository.Where(x => isChooseVisitIds.Contains(x.Id));
|
||||
|
||||
|
||||
visitQuery= visitQuery.Union(chooseVisitQuery);
|
||||
// 已经存在的访视 需要排除
|
||||
var existsBubjectVisitsQuery = _readModuleRepository.Where(y => y.ReadingSetType == inDto.ReadingSetType && y.TrialId == inDto.TrialId && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId).Select(x => x.SubjectVisitId);
|
||||
|
||||
|
|
@ -716,10 +739,11 @@ namespace IRaCIS.Core.Application.Service
|
|||
.WhereIf(inDto.SiteId != null,x=> x.Subject.TrialSiteId==inDto.SiteId)
|
||||
.WhereIf(inDto.SubjectCode.IsNotNullOrEmpty(), x =>x.Subject.Code.Contains(inDto.SubjectCode))
|
||||
.WhereIf(inDto.IsJoin != null && inDto.IsJoin.Value, x => isChooseVisitIds.Contains(x.Id))
|
||||
.WhereIf(inDto.IsGenerate != null && inDto.IsGenerate.Value, x => isChooseVisitIds.Contains(x.Id)&& isTakeEffect== ReadingPeriodStatus.TakeEffect)
|
||||
;
|
||||
.WhereIf(inDto.IsGenerate != null && inDto.IsGenerate.Value, x => IsGenerateVisitIds.Contains(x.Id))
|
||||
.WhereIf(inDto.IsJoin != null && !inDto.IsJoin.Value, x => !isChooseVisitIds.Contains(x.Id))
|
||||
.WhereIf(inDto.IsGenerate != null && !inDto.IsGenerate.Value, x => !IsGenerateVisitIds.Contains(x.Id));
|
||||
|
||||
//.Where(x => isChooseVisitIds.Contains(x.Id));
|
||||
//.Where(x => isChooseVisitIds.Contains(x.Id));
|
||||
|
||||
|
||||
var subjectIdlist = await visitQuery.OrderBy(x => x.SubjectId).Select(x => x.SubjectId).Distinct().Skip((inDto.PageIndex - 1) * inDto.PageSize).Take(inDto.PageSize).ToListAsync();
|
||||
|
|
@ -759,7 +783,9 @@ namespace IRaCIS.Core.Application.Service
|
|||
SubjectId = x.SubjectId,
|
||||
SubjectVisitName = x.VisitName,
|
||||
IsJoin= isChooseVisitIds.Contains(x.Id),
|
||||
IsGenerate= isChooseVisitIds.Contains(x.Id)&& isTakeEffect== ReadingPeriodStatus.TakeEffect,
|
||||
IsGenerate = IsGenerateVisitIds.Contains(x.Id),
|
||||
IsGenerateTask = isGenerateTaskVisitIds.Contains(x.Id),
|
||||
GeneratedTime = chooseVisitVisitList.Where(y=>y.SubjectVisitId==x.Id).Select(y=>y.GeneratedTime).FirstOrDefault(),
|
||||
}).ToList(),
|
||||
PageSize = inDto.PageSize,
|
||||
PageIndex = inDto.PageIndex,
|
||||
|
|
|
|||
|
|
@ -18,6 +18,12 @@ namespace IRaCIS.Core.Application.Service
|
|||
//标准Id
|
||||
List<Guid> CriterionIds = new List<Guid>();
|
||||
|
||||
CreateMap<ReadModule, GetReadModulePageListOutDto>()
|
||||
.ForMember(d => d.SiteCode, u => u.MapFrom(s => s.Subject.TrialSite.TrialSiteCode))
|
||||
.ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code))
|
||||
.ForMember(d => d.VisitName, u => u.MapFrom(s => s.SubjectVisit.VisitName))
|
||||
.ForMember(d => d.LatestScanDate, u => u.MapFrom(s => s.SubjectVisit.LatestScanDate));
|
||||
|
||||
#region 临床问题
|
||||
CreateMap<TrialClinicalQuestion, TrialClinicalQuestionDto>()
|
||||
.ForMember(d => d.GroupName, opt => opt.MapFrom(src => src.GroupQuestin.QuestionName))
|
||||
|
|
|
|||
|
|
@ -54,6 +54,11 @@ public class ReadModule : BaseFullDeleteAuditEntity
|
|||
[Comment("阅片计划ID")]
|
||||
public Guid? ReadingPeriodSetId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 阅片计划
|
||||
/// </summary>
|
||||
public Guid? ReadingPeriodPlanId { get; set; }
|
||||
|
||||
public Guid TrialId { get; set; }
|
||||
public bool IsCRCConfirm { get; set; } = false;
|
||||
|
||||
|
|
|
|||
20976
IRaCIS.Core.Infra.EFCore/Migrations/20251104012347_ReadingPeriodPlanId.Designer.cs
generated
Normal file
20976
IRaCIS.Core.Infra.EFCore/Migrations/20251104012347_ReadingPeriodPlanId.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,29 @@
|
|||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace IRaCIS.Core.Infra.EFCore.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class ReadingPeriodPlanId : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<Guid>(
|
||||
name: "ReadingPeriodPlanId",
|
||||
table: "ReadModule",
|
||||
type: "uniqueidentifier",
|
||||
nullable: true);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ReadingPeriodPlanId",
|
||||
table: "ReadModule");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -4918,6 +4918,9 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
|
|||
b.Property<int>("ReadModuleAddTypeEnum")
|
||||
.HasColumnType("int");
|
||||
|
||||
b.Property<Guid?>("ReadingPeriodPlanId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid?>("ReadingPeriodSetId")
|
||||
.HasColumnType("uniqueidentifier")
|
||||
.HasComment("阅片计划ID");
|
||||
|
|
|
|||
Loading…
Reference in New Issue