修改接口参数

Uat_Study
hang 2022-05-07 09:33:11 +08:00
parent 7a744293e5
commit 993085f894
4 changed files with 37 additions and 93 deletions

View File

@ -201,10 +201,10 @@ namespace IRaCIS.Core.API.Controllers
public async Task<IResponseOutput> AddOrUpdateQCChallenge(DataInspectionDto<AddOrUpdateQCChallengeDto> opt)
{
var fun = await _qCOperationService.AddOrUpdateQCChallenge(opt.OptCommand.qaQuestionCommand, opt.OptCommand.trialId, opt.OptCommand.trialQCProcess, opt.OptCommand.currentQCType);
opt.AuditInfo.GeneralId = fun.Id;
Dictionary<string, object> keyValuePairs = new Dictionary<string, object>();
keyValuePairs.Add("ChallengeCode", "Q" + fun.ChallengeCode.ToString("D5"));
opt.AuditInfo.JsonDetail = _inspectionService.AddJsonItem(opt.AuditInfo.JsonDetail, keyValuePairs);
//opt.AuditInfo.GeneralId = fun.Id;
//Dictionary<string, object> keyValuePairs = new Dictionary<string, object>();
//keyValuePairs.Add("ChallengeCode", "Q" + fun.ChallengeCode.ToString("D5"));
//opt.AuditInfo.JsonDetail = _inspectionService.AddJsonItem(opt.AuditInfo.JsonDetail, keyValuePairs);
return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, ResponseOutput.Ok());
}

View File

@ -246,7 +246,7 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO
{
public string ManualPassReason { get; set; } = string.Empty;
public Guid Id { get; set; }
public Guid SubjectVisitId { get; set; }
}

View File

@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Mvc;
namespace IRaCIS.Core.Application.Image.QA
{
public interface IQCOperationService
{
{
Task<IResponseOutput> CheckBack(Guid subjectVisitId);
Task<IResponseOutput> SetNeedReupload(Guid trialId, Guid qcChallengeId);
Task<IResponseOutput> QCPassedOrFailed(Guid trialId, Guid subjectVisitId, [FromRoute] AuditStateEnum auditState);
@ -19,8 +19,8 @@ namespace IRaCIS.Core.Application.Image.QA
Task<IResponseOutput<CheckChallengeDialog>> AddCheckChallengeReply(CheckChallengeDialogCommand checkDialogCommand);
Task<QCChallenge> AddOrUpdateQCChallenge(QCChallengeCommand qaQuestionCommand, Guid trialId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType);
Task<IResponseOutput> AddCheckChallengeReply(CheckChallengeDialogCommand checkDialogCommand);
Task<IResponseOutput> AddOrUpdateQCChallenge(QCChallengeCommand qaQuestionCommand, Guid trialId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType);
Task<IResponseOutput> AddOrUpdateQCQuestionAnswerList(QCQuestionAnswerCommand[] qcQuestionAnswerCommands, Guid trialId, Guid subjectVisitId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType);
Task<IResponseOutput> AddQCChallengeReply(QADialogCommand qaDialogCommand);
Task<IResponseOutput> CloseCheckChallenge(CloseCheckChallengeDto input);

View File

@ -17,12 +17,9 @@ using Microsoft.AspNetCore.Authorization;
using WinSCP;
using Magicodes.ExporterAndImporter.Excel;
using Newtonsoft.Json;
using IRaCIS.Core.Application.Service.Inspection.Interface;
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Application.Service.Inspection.DTO;
using Nito.AsyncEx;
using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Domain.Common;
namespace IRaCIS.Core.Application.Image.QA
{
@ -34,13 +31,9 @@ namespace IRaCIS.Core.Application.Image.QA
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
private readonly IRepository<QCChallenge> _qcChallengeRepository;
private readonly IRepository<DicomStudy> _dicomStudyRepository;
private readonly IRepository<Dictionary> _dictionaryrepository;
private readonly IRepository<Subject> _subjectRepository;
private readonly IRepository<Trial> _trialRepository;
private readonly IMediator _mediator;
private readonly IInspectionService _inspectionService;
private readonly IDictionaryService _dictionaryService;
private object _locker = new object();
private readonly AsyncLock _mutex = new AsyncLock();
@ -48,10 +41,7 @@ namespace IRaCIS.Core.Application.Image.QA
IRepository<QCChallenge> qcChallengeRepository,
IRepository<Trial> trialRepository,
IMediator mediator,
IInspectionService inspectionService,
IDictionaryService dictionaryService,
IRepository<DicomStudy> dicomStudyRepository,
IRepository<Dictionary> dictionaryrepository,
IRepository<Subject> subjectRepository
)
{
@ -59,17 +49,14 @@ namespace IRaCIS.Core.Application.Image.QA
_subjectVisitRepository = subjectVisitRepository;
_qcChallengeRepository = qcChallengeRepository;
_dicomStudyRepository = dicomStudyRepository;
this._dictionaryrepository = dictionaryrepository;
this._subjectRepository = subjectRepository;
_mediator = mediator;
_trialRepository = trialRepository;
_inspectionService = inspectionService;
this._dictionaryService = dictionaryService;
}
#region QC质疑 以及回复 关闭
[HttpPost("{trialId:guid}/{subjectVisitId:guid}/{currentQCType:int}")]
[HttpGet("{trialId:guid}/{subjectVisitId:guid}/{currentQCType:int}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> VerifyQCCanAddChallenge(Guid subjectVisitId, [FromRoute] CurrentQC currentQCType)
{
@ -93,7 +80,7 @@ namespace IRaCIS.Core.Application.Image.QA
[HttpPost("{trialId:guid}/{trialQCProcess:int}/{currentQCType:int}")]
[TypeFilter(typeof(TrialResourceFilter))]
[Authorize(Policy = "ImageQCPolicy")]
public async Task<QCChallenge> AddOrUpdateQCChallenge(QCChallengeCommand qaQuestionCommand, Guid trialId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType)
public async Task<IResponseOutput> AddOrUpdateQCChallenge(QCChallengeCommand qaQuestionCommand, Guid trialId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType)
{
await VerifyIsCanQCAsync(null, qaQuestionCommand.SubjectVisitId);
@ -124,18 +111,21 @@ namespace IRaCIS.Core.Application.Image.QA
qcChallenge = await _qcChallengeRepository.AddAsync(qcChallenge, true);
return qcChallenge;
return ResponseOutput.Ok(qcChallenge.Id);
}
}
else
{
return await _repository.UpdateFromDTOAsync<QCChallenge, QCChallengeCommand>(qaQuestionCommand, true);
await _repository.UpdateFromDTOAsync<QCChallenge, QCChallengeCommand>(qaQuestionCommand, true);
return ResponseOutput.Ok();
}
}
@ -147,7 +137,7 @@ namespace IRaCIS.Core.Application.Image.QA
/// <param name="closeEnum"></param>
/// <param name="closeReason"></param>
/// <returns></returns>
[HttpPost("{trialId:guid}/{qcChallengeId:guid}/{subjectVisitId:guid}/{closeEnum}/{closeReason}")]
[HttpPut("{trialId:guid}/{subjectVisitId:guid}/{qcChallengeId:guid}/{closeEnum}/{closeReason}")]
[TypeFilter(typeof(TrialResourceFilter))]
[UnitOfWork]
//[Authorize(Policy = "ImageQCPolicy")]
@ -168,8 +158,6 @@ namespace IRaCIS.Core.Application.Image.QA
}
#region 之前
dbQCChallenge.CloseResonEnum = closeEnum;
@ -194,29 +182,6 @@ namespace IRaCIS.Core.Application.Image.QA
return ResponseOutput.Result(success);
#region 对话实体不会加入
//dbQCChallenge.DialogList.Add(new QCChallengeDialog()
//{
// SubjectVisitId = dbQCChallenge.SubjectVisitId,
// UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt,
// QCChallengeId = dbQCChallenge.Id,
// TalkContent = "关闭原因: " + closeReason
//});
//var success = await _qcChallengeRepository.PartialUpdateAsync(dbQCChallenge, u => new QCChallenge()
//{
// CloseResonEnum = closeEnum,
// IsClosed = true,
// ClosedTime = DateTime.Now,
//}, true);
#endregion
}
@ -228,7 +193,7 @@ namespace IRaCIS.Core.Application.Image.QA
/// 删除QC质疑记录
/// </summary>
/// <returns></returns>
[HttpDelete("{qcChallengeId:guid}/{trialId:guid}")]
[HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{qcChallengeId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))]
[Authorize(Policy = "ImageQCPolicy")]
public async Task<IResponseOutput> DeleteQCChallenge(Guid qcChallengeId)
@ -239,9 +204,8 @@ namespace IRaCIS.Core.Application.Image.QA
ResponseOutput.NotOk("this QC Challenge Has been replied ");
}
var qaRecord = await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId);
var qaRecord = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId)).IfNullThrowException();
if (qaRecord == null) return Null404NotFound(qaRecord);
await _qcChallengeRepository.DeleteAsync(qaRecord);
@ -257,7 +221,6 @@ namespace IRaCIS.Core.Application.Image.QA
/// <param name="qaDialogCommand"></param>
/// <returns></returns>
[HttpPost("{trialId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))]
[Authorize(Policy = "ImageQCPolicy")]
public async Task<IResponseOutput> AddQCChallengeReply(QADialogCommand qaDialogCommand)
@ -295,7 +258,7 @@ namespace IRaCIS.Core.Application.Image.QA
[HttpPost("{trialId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))]
[Authorize(Policy = "ImageCheckPolicy")]
public async Task<IResponseOutput<CheckChallengeDialog>> AddCheckChallengeReply(CheckChallengeDialogCommand checkDialogCommand)
public async Task<IResponseOutput> AddCheckChallengeReply(CheckChallengeDialogCommand checkDialogCommand)
{
@ -324,14 +287,14 @@ namespace IRaCIS.Core.Application.Image.QA
var success = await _repository.SaveChangesAsync();
return ResponseOutput.Result(success, qaReply);
return ResponseOutput.Result(success, qaReply.Id);
}
/// <summary>
/// 关闭 一致性核查质疑
/// </summary>
/// <returns></returns>
[HttpPut("{trialId:guid}/{subjectVisitId:guid}")]
[HttpPut("{trialId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> CloseCheckChallenge(CloseCheckChallengeDto input)
{
@ -355,7 +318,7 @@ namespace IRaCIS.Core.Application.Image.QA
/// 手动设置一致性核查通过
/// </summary>
/// <returns></returns>
[HttpPut("{trialId:guid}/{signId:guid}/{subjectVisitId:guid}")]
[HttpPut("{trialId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> SetCheckPass(SetCheckPassDt data)
{
@ -364,9 +327,8 @@ namespace IRaCIS.Core.Application.Image.QA
ResponseOutput.NotOk("只允许PM 手动设置一致性核查通过");
}
var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == data.Id);
var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == data.SubjectVisitId)).IfNullThrowException();
if (sv == null) return Null404NotFound(sv);
if (sv.RequestBackState == RequestBackStateEnum.PM_AgressBack)
{
@ -384,9 +346,8 @@ namespace IRaCIS.Core.Application.Image.QA
sv.ManualPassReason = data.ManualPassReason;
sv.CheckPassedTime = DateTime.Now;
await _repository.SaveChangesAsync();
await _subjectVisitRepository.SaveChangesAsync();
//var signSuccess = await _repository.UpdateFromQueryAsync<TrialSign>(t => t.Id == signId, u => new TrialSign() { IsCompleted = true });
return ResponseOutput.Result(true);
@ -401,16 +362,15 @@ namespace IRaCIS.Core.Application.Image.QA
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> CRCRequstCheckBack(Guid subjectVisitId)
{
var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId);
var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException();
if (sv == null) return Null404NotFound(sv);
if (sv.CheckState == CheckStateEnum.CVPassed)
{
return ResponseOutput.NotOk("核查通过的数据不允许申请回退");
}
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { RequestBackState = RequestBackStateEnum.CRC_RequestBack });
await _subjectVisitRepository.UpdatePartialFromQueryAsync( subjectVisitId, u => new SubjectVisit() { RequestBackState = RequestBackStateEnum.CRC_RequestBack },true);
return ResponseOutput.Ok();
@ -420,7 +380,7 @@ namespace IRaCIS.Core.Application.Image.QA
/// 一致性核查 回退 对话记录不清除 只允许PM回退
/// </summary>
/// <returns></returns>
[HttpPut("{trialId:guid}/{signId:guid}/{subjectVisitId:guid}")]
[HttpPut("{trialId:guid}/{subjectVisitId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> CheckBack(Guid subjectVisitId)
{
@ -429,9 +389,8 @@ namespace IRaCIS.Core.Application.Image.QA
return ResponseOutput.NotOk(" 只允许PM 回退!");
}
var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId);
var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException();
if (sv == null) return Null404NotFound(sv);
if (sv.CheckState == CheckStateEnum.CVPassed || sv.CheckState == CheckStateEnum.ToCheck)
{
@ -476,9 +435,8 @@ namespace IRaCIS.Core.Application.Image.QA
await _repository.BatchDeleteAsync<TrialQCQuestionAnswer>(t => t.SubjectVisitId == subjectVisitId);
var success = await _repository.SaveChangesAsync();
var success = await _subjectVisitRepository.SaveChangesAsync();
// var signSuccess = await _repository.UpdateFromQueryAsync<TrialSign>(t => t.Id == signId, u => new TrialSign() { IsCompleted = true });
return ResponseOutput.Result(success);
@ -874,7 +832,7 @@ namespace IRaCIS.Core.Application.Image.QA
/// </summary>
/// <param name="subjectVisitId"></param>
/// <returns></returns>
[HttpGet("{subjectVisitId:guid}")]
[HttpGet("{trialId:guid}/{subjectVisitId:guid}")]
public async Task<IResponseOutput> VerifyCanQCPassedOrFailed(Guid subjectVisitId)
{
await VerifyIsCanQCAsync(null, subjectVisitId);
@ -896,7 +854,7 @@ namespace IRaCIS.Core.Application.Image.QA
/// <param name="subjectVisitId"></param>
/// <param name="trialId"></param>
/// <returns></returns>SeriesCount
[HttpPost, Route("{trialId:guid}/{subjectVisitId:guid}")]
[HttpDelete, Route("{trialId:guid}/{subjectVisitId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))]
[UnitOfWork]
public async Task<IResponseOutput> DeleteStudyList(Guid[] ids, Guid subjectVisitId, Guid trialId)
@ -911,13 +869,6 @@ namespace IRaCIS.Core.Application.Image.QA
}
var waitDeleteStudyList = await _dicomStudyRepository.Where(x => ids.Contains(x.Id)).ToListAsync();
foreach (var study in waitDeleteStudyList)
{
@ -975,7 +926,7 @@ namespace IRaCIS.Core.Application.Image.QA
#endregion
public async Task VerifyIsCanQCAsync(SubjectVisit? subjectVisit, Guid? sujectVisitId = null)
private async Task VerifyIsCanQCAsync(SubjectVisit? subjectVisit, Guid? sujectVisitId = null)
{
if (sujectVisitId != null)
{
@ -1016,7 +967,7 @@ namespace IRaCIS.Core.Application.Image.QA
/// <param name="subjectVisitId"></param>
/// <param name="obtaionOrCancel">true 获取 false是取消领取</param>
/// <returns></returns>
[HttpPost("{trialId:guid}/{subjectVisitId:guid}/{obtaionOrCancel:bool}")]
[HttpPut("{trialId:guid}/{subjectVisitId:guid}/{obtaionOrCancel:bool}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> ObtainOrCancelQCTask(Guid trialId, Guid subjectVisitId, bool obtaionOrCancel)
{
@ -1326,7 +1277,6 @@ namespace IRaCIS.Core.Application.Image.QA
/// <param name="auditState"></param>
/// <returns></returns>
[HttpPost("{trialId:guid}/{subjectVisitId:guid}/{auditState:int}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> QCPassedOrFailed(Guid trialId, Guid subjectVisitId, [FromRoute] AuditStateEnum auditState)
{
@ -1512,8 +1462,7 @@ namespace IRaCIS.Core.Application.Image.QA
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> SetVisitUrgent(Guid trialId, Guid subjectVisitId, bool setOrCancel)
{
var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId);
if (sv == null) return Null404NotFound(sv);
var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException();
sv.IsUrgent = setOrCancel;
var success = await _repository.SaveChangesAsync();
@ -1545,7 +1494,7 @@ namespace IRaCIS.Core.Application.Image.QA
/// <param name="trialId"></param>
/// <param name="qcChallengeId"></param>
/// <returns></returns>
[HttpPut("{trialId:guid}/{qcChallengeId:guid}")]
[HttpPut("{trialId:guid}/{subjectVisitId:guid}/{qcChallengeId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> SetNeedReupload(Guid trialId, Guid qcChallengeId)
{
@ -1718,7 +1667,7 @@ namespace IRaCIS.Core.Application.Image.QA
[HttpPut("{trialId:guid}/{qcChallengeId:guid}")]
[HttpPut("{trialId:guid}/{subjectVisitId:guid}/{qcChallengeId:guid}")]
[TypeFilter(typeof(TrialResourceFilter))]
public async Task<IResponseOutput> CRCRequestReUpload(Guid qcChallengeId)
{
@ -1786,11 +1735,6 @@ namespace IRaCIS.Core.Application.Image.QA
}
dbSubjectVisit.IsEnrollmentConfirm = command.IsEnrollmentConfirm.Value;
}
if (command.SubjectFirstGiveMedicineTime != null)