using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using AutoMapper; using Castle.Core.Internal; using IRaCIS.Application.Contracts; using IRaCIS.Application.Interfaces; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Contracts.DTO; using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Image.QA; using IRaCIS.Core.Application.Interfaces; using IRaCIS.Core.Application.Service.Inspection.DTO; using IRaCIS.Core.Application.Service.Inspection.Interface; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Infrastructure.Extention; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace IRaCIS.Core.API.Controllers { [ApiController, ApiExplorerSettings(GroupName = "Reviewer")] [UnitOfWork] public class InspectionController : ControllerBase { private readonly IRepository _repository; private readonly IMapper _mapper; private readonly IUserInfo _userInfo; private readonly ITrialDocumentService _trialDocumentService; private readonly IQCListService _qCListService; private readonly ITrialConfigService _trialConfigService; private readonly INoneDicomStudyService _noneDicomStudyService; private readonly ISubjectService _subjectService; private readonly ISubjectVisitService _subjectVisitService; private readonly IQCOperationService _qCOperationService; private readonly IClinicalDataService _clinicalDataService; private readonly IVisitPlanService _visitPlanService; private readonly IInspectionService _inspectionService; private readonly IRepository<DataInspection> _dataInspectionRepository; private delegate Task<IResponseOutput> executionFun(dynamic data); public InspectionController(IRepository repository, IRepository<DataInspection> _repositoryDataInspection, IMapper mapper, IUserInfo userInfo, ITrialDocumentService trialDocumentService, IRepository<DataInspection> dataInspectionRepository, IQCListService _qCListService, IInspectionService sinspectionService, ITrialConfigService _trialConfigService, INoneDicomStudyService noneDicomStudyService, ISubjectService _subjectService, ISubjectVisitService subjectVisitService, IQCOperationService qCOperationService, IClinicalDataService clinicalDataService, IVisitPlanService visitPlanService ) { this._repository = repository; this._mapper = mapper; this._userInfo = userInfo; this._inspectionService = sinspectionService; this._trialDocumentService = trialDocumentService; this._qCListService = _qCListService; this._trialConfigService = _trialConfigService; this._noneDicomStudyService = noneDicomStudyService; this._subjectService = _subjectService; this._subjectVisitService = subjectVisitService; this._qCOperationService = qCOperationService; this._clinicalDataService = clinicalDataService; this._visitPlanService = visitPlanService; this._dataInspectionRepository = dataInspectionRepository; } #region 获取稽查数据 /// <summary> /// 获取稽查数据 /// </summary> /// <returns></returns> [HttpPost, Route("Inspection/GetInspectionData")] public async Task<PageOutput<GetDataInspectionOutDto>> GetInspectionData(GetDataInspectionDto dto) { return await _inspectionService.GetInspectionData(dto); } #endregion #region 影像质疑 /// <summary> /// 手动领取 或者取消 QC任务 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/QCOperation/ObtainOrCancelQCTask")] [UnitOfWork] public async Task<IResponseOutput> ObtainOrCancelQCTask(DataInspectionDto<ObtainOrCancelQCTaskDto> opt) { var fun = await _qCOperationService.ObtainOrCancelQCTask(opt.OptCommand.trialId, opt.OptCommand.subjectVisitId, opt.OptCommand.obtaionOrCancel); if (!fun.IsSuccess) { return ResponseOutput.NotOk(fun.ErrorMessage); } return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } /// <summary> /// 添加或者更新 QC核对问题列表 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/QCOperation/AddOrUpdateQCQuestionAnswerList")] [UnitOfWork] public async Task<IResponseOutput> AddOrUpdateQCQuestionAnswerList(DataInspectionDto<AddOrUpdateQCQuestionAnswerListDto> opt) { var fun = await _qCOperationService.AddOrUpdateQCQuestionAnswerList(opt.OptCommand.qcQuestionAnswerCommands, opt.OptCommand.trialId, opt.OptCommand.subjectVisitId,opt.OptCommand.trialQCProcess,opt.OptCommand.currentQCType); if (!fun.IsSuccess) { return ResponseOutput.NotOk(fun.ErrorMessage); } return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } /// <summary> /// 添加和更新质疑 /// </summary> [HttpPost, Route("Inspection/QCOperation/AddOrUpdateQCChallenge")] [UnitOfWork] 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); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, ResponseOutput.Ok()); } /// <summary> /// 回复质疑 /// </summary> [HttpPost, Route("Inspection/QCOperation/AddQCChallengeReply")] [UnitOfWork] public async Task<IResponseOutput> AddQCChallengeReply(DataInspectionDto<QADialogCommand> opt) { var fun = _qCOperationService.AddQCChallengeReply; opt.AuditInfo.GeneralId = opt.OptCommand.QCChallengeId; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 关闭质疑 /// </summary> [HttpPost, Route("Inspection/QCOperation/CloseQCChallenge")] [UnitOfWork] public async Task<IResponseOutput> CloseQCChallenge(DataInspectionDto<CloseQCChallengeDto> opt) { var fun = await _qCOperationService.CloseQCChallenge(opt.OptCommand.qcChallengeId, opt.OptCommand.subjectVisitId, opt.OptCommand.closeEnum, opt.OptCommand.closeReason); opt.AuditInfo.GeneralId = opt.OptCommand.qcChallengeId; if (!fun.IsSuccess) { return ResponseOutput.NotOk(fun.ErrorMessage); } return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } /// <summary> /// 删除QC质疑记录 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/QCOperation/DeleteQCChallenge")] [UnitOfWork] public async Task<IResponseOutput> DeleteQCChallenge(DataInspectionDto<IDDto> opt) { var fun = _qCOperationService.DeleteQCChallenge; opt.AuditInfo.GeneralId = opt.OptCommand.Id; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 一致性核查 质疑的添加/回复 /// </summary> [HttpPost, Route("Inspection/QCOperation/AddCheckChallengeReply")] [UnitOfWork] public async Task<IResponseOutput> AddCheckChallengeReply(DataInspectionDto<CheckChallengeDialogCommand> opt) { var fun = _qCOperationService.AddCheckChallengeReply; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 删除QC质疑记录 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/QCOperation/CloseCheckChallenge")] [UnitOfWork] public async Task<IResponseOutput> CloseCheckChallenge(DataInspectionDto<IDDto> opt) { var fun = _qCOperationService.CloseCheckChallenge; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 手动设置一致性核查通过 /// </summary> [HttpPost, Route("Inspection/QCOperation/SetCheckPass")] [UnitOfWork] public async Task<IResponseOutput> SetCheckPass(DataInspectionDto<IDDto> opt) { var fun = _qCOperationService.SetCheckPass; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// CRC 请求回退 /// </summary> [HttpPost, Route("Inspection/QCOperation/CRCRequstCheckBack")] [UnitOfWork] public async Task<IResponseOutput> CRCRequstCheckBack(DataInspectionDto<IDDto> opt) { var fun = _qCOperationService.CRCRequstCheckBack; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 一致性核查 回退 对话记录不清除 只允许PM回退 /// </summary> [HttpPost, Route("Inspection/QCOperation/CheckBack")] [UnitOfWork] public async Task<IResponseOutput> CheckBack(DataInspectionDto<IDDto> opt) { var fun = _qCOperationService.CheckBack; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// QC修改检查部位和 拍片类型 /// </summary> [HttpPost, Route("Inspection/QCOperation/UpdateModality")] [UnitOfWork] public async Task<IResponseOutput> UpdateModality(DataInspectionDto<UpdateModalityDto> opt) { var fun =await _qCOperationService.UpdateModality(opt.OptCommand.id, opt.OptCommand.type, opt.OptCommand.modality, opt.OptCommand.bodyPart); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo,null, fun); } /// <summary> /// 1、设置为不读片,2 设置为读片(取消 先前设置为不读片) 4 设置为删除(数据库记录软删除) 5 恢复为未删除 /// </summary> [HttpPost, Route("Inspection/QCOperation/SetSeriesState")] [UnitOfWork] public async Task<IResponseOutput> SetSeriesState(DataInspectionDto<SetSeriesStateDto> opt) { var fun = await _qCOperationService.SetSeriesState(opt.OptCommand.subjectVisitId, opt.OptCommand.studyId, opt.OptCommand.seriesId, opt.OptCommand.state); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } /// <summary> /// 设置QC 通过或者不通过 7:QC failed 8:QC passed /// </summary> [HttpPost, Route("Inspection/QCOperation/QCPassedOrFailed")] [UnitOfWork] public async Task<IResponseOutput> QCPassedOrFailed(DataInspectionDto<QCPassedOrFailedDto> opt) { var fun = await _qCOperationService.QCPassedOrFailed(opt.OptCommand.trialId, opt.OptCommand.subjectVisitId, opt.OptCommand.signId, opt.OptCommand.auditState); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } /// <summary> /// 设置、取消 访视紧急 /// </summary> [HttpPost, Route("Inspection/QCOperation/SetVisitUrgent")] [UnitOfWork] public async Task<IResponseOutput> SetVisitUrgent(DataInspectionDto<SetVisitUrgentDto> opt ) { var fun = await _qCOperationService.SetVisitUrgent(opt.OptCommand.trialId, opt.OptCommand.subjectVisitId, opt.OptCommand.setOrCancel); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } /// <summary> /// QA设置 需要重传 /// </summary> [HttpPost, Route("Inspection/QCOperation/SetNeedReupload")] [UnitOfWork] public async Task<IResponseOutput> SetNeedReupload(DataInspectionDto<SetNeedReuploadDto> opt) { var fun = await _qCOperationService.SetNeedReupload(opt.OptCommand.trialId, opt.OptCommand.qcChallengeId); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } /// <summary> /// CRC 设置已经重传完成 /// </summary> [HttpPost, Route("Inspection/QCOperation/SetReuploadFinished")] [UnitOfWork] public async Task<IResponseOutput> SetReuploadFinished(DataInspectionDto<CRCReuploadFinishedCommand> opt) { var fun = _qCOperationService.SetReuploadFinished; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// CRCRequestReUpload /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/QCOperation/CRCRequestReUpload")] [UnitOfWork] public async Task<IResponseOutput> CRCRequestReUpload(DataInspectionDto<IDDto> opt) { var fun = _qCOperationService.CRCRequestReUpload; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/QCOperation/ForwardSVDicomImage")] [UnitOfWork] public async Task<IResponseOutput> ForwardSVDicomImage(DataInspectionDto<ForwardSVDicomImageDto> opt) { var fun = _qCOperationService.ForwardSVDicomImage; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun); } #endregion #region 影像上传 /// <summary> /// 疾病进展确认评估 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/QCOperation/UpdateSubjectAndSVInfo")] [UnitOfWork] public async Task<IResponseOutput> UpdateSubjectAndSVInfo(DataInspectionDto<UploadSubjectAndVisitCommand> opt) { var fun = _qCOperationService.UpdateSubjectAndSVInfo; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 删除影像 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/QCOperation/deleteStudyList")] [UnitOfWork] public async Task<IResponseOutput> deleteStudyList(DataInspectionDto<DeleteStudyList> opt) { var fun = await _qCOperationService.DeleteStudyList(opt.OptCommand.ids, opt.OptCommand.subjectVisitId, opt.OptCommand.trialId); if (!fun.IsSuccess) { return ResponseOutput.NotOk(fun.ErrorMessage); } return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo,null, fun); } /// <summary> /// CRC RequestToQC 批量提交 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/QCOperation/CRCRequestToQC")] [UnitOfWork] public async Task<IResponseOutput> CRCRequestToQC(DataInspectionDto<CRCRequestToQCCommand> opt) { var fun = _qCOperationService.CRCRequestToQC; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 非DICOM影像新增编辑 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/noneDicomStudy/AddOrUpdateNoneDicomStudy")] [UnitOfWork] public async Task<IResponseOutput> AddOrUpdateNoneDicomStudy(DataInspectionDto<NoneDicomStudyAddOrEdit> opt) { var fun = await _noneDicomStudyService.AddOrUpdateNoneDicomStudy(opt.OptCommand); if (!fun.IsSuccess) { return ResponseOutput.NotOk(fun.ErrorMessage); } if (opt.OptCommand.Id == null) { Dictionary<string, object> keyValuePairs = new Dictionary<string, object>(); keyValuePairs.Add("CodeView", fun.Data.StudyCode); opt.AuditInfo.JsonDetail = _inspectionService.AddJsonItem(opt.AuditInfo.JsonDetail, keyValuePairs); } opt.AuditInfo.GeneralId = fun.Data.Id; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo,null, fun); } /// <summary> /// 删除非dicom /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/noneDicom/DeleteNoneDicomStudy")] [UnitOfWork] public async Task<IResponseOutput> DeleteNoneDicomStudy(DataInspectionDto<IDDto> opt) { var fun = _noneDicomStudyService.DeleteNoneDicomStudy; opt.AuditInfo.GeneralId = opt.OptCommand.Id; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 删除非dicom文件 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/noneDicom/deleteNoneDicomStudyFile")] [UnitOfWork] public async Task<IResponseOutput> deleteNoneDicomStudyFile(DataInspectionDto<IDDto> opt) { var fun = _noneDicomStudyService.DeleteNoneDicomStudyFile; opt.AuditInfo.GeneralId = opt.OptCommand.Id; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } #endregion #region 临床数据采集 ClinicalDataService /// <summary> /// 新增或修改既往放疗史 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/clinicalData/AddOrUpdatePreviousHistory")] [UnitOfWork] public async Task<IResponseOutput> AddOrUpdatePreviousHistory(DataInspectionDto<PreviousHistoryAddOrEdit> opt) { var fun = await _clinicalDataService.AddOrUpdatePreviousHistory(opt.OptCommand); opt.AuditInfo.GeneralId = fun.Data; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo,null, fun); } /// <summary> /// 删除既往放疗史 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/clinicalData/DeletePreviousHistory")] [UnitOfWork] public async Task<IResponseOutput> DeletePreviousHistory(DataInspectionDto<IDDto> opt) { var fun = _clinicalDataService.DeletePreviousHistory; opt.AuditInfo.GeneralId = opt.OptCommand.Id; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 新增或修改既往手术史 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/clinicalData/AddOrUpdatePreviousSurgery")] [UnitOfWork] public async Task<IResponseOutput> AddOrUpdatePreviousSurgery(DataInspectionDto<PreviousSurgeryAddOrEdit> opt) { var fun = await _clinicalDataService.AddOrUpdatePreviousSurgery(opt.OptCommand); opt.AuditInfo.GeneralId = fun.Data; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo,null, fun); } /// <summary> /// 删除既往手术史 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/clinicalData/DeletePreviousSurgery")] [UnitOfWork] public async Task<IResponseOutput> DeletePreviousSurgery(DataInspectionDto<IDDto> opt) { var fun = _clinicalDataService.DeletePreviousSurgery; opt.AuditInfo.GeneralId = opt.OptCommand.Id; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 新增或修改既往其他治疗史 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/clinicalData/AddOrUpdatePreviousOther")] [UnitOfWork] public async Task<IResponseOutput> AddOrUpdatePreviousOther(DataInspectionDto<PreviousOtherAddOrEdit> opt) { var fun = await _clinicalDataService.AddOrUpdatePreviousOther(opt.OptCommand); opt.AuditInfo.GeneralId = fun.Data; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo,null, fun); } /// <summary> /// 删除既往其他治疗史 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/clinicalData/DeletePreviousOther")] [UnitOfWork] public async Task<IResponseOutput> DeletePreviousOther(DataInspectionDto<IDDto> opt) { var fun = _clinicalDataService.DeletePreviousOther; opt.AuditInfo.GeneralId = opt.OptCommand.Id; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } #endregion #region 访视计划 /// <summary> /// 新增或添加访视计划 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/VisitPlan/AddOrUpdateVisitStage")] [UnitOfWork] public async Task<IResponseOutput> AddOrUpdateVisitStage(DataInspectionDto<VisitPlanCommand> opt) { var fun = await _visitPlanService.AddOrUpdateVisitStage(opt.OptCommand); if (!fun.IsSuccess) { return ResponseOutput.NotOk(fun.ErrorMessage); } opt.AuditInfo.VisitStageId = Guid.Parse(fun.Data); opt.OptCommand.Id = Guid.Parse(fun.Data); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } /// <summary> /// 删除访视计划对象 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/VisitPlan/DeleteVisitStage")] [UnitOfWork] public async Task<IResponseOutput> DeleteVisitStage(DataInspectionDto<IDDto> opt) { var fun = _visitPlanService.DeleteVisitStage; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 确认访视计划 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/VisitPlan/ConfirmTrialVisitPlan")] [UnitOfWork] public async Task<IResponseOutput> ConfirmTrialVisitPlan(DataInspectionDto<IDDto> opt) { var fun = _visitPlanService.ConfirmTrialVisitPlan; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 下载访视计划 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/VisitPlan/DownloadInflunceStudyList")] [UnitOfWork] public async Task<IResponseOutput> DownloadInflunceStudyList(DataInspectionDto<IDDto> opt) { var fun = _visitPlanService.DownloadInflunceStudyList; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } #endregion #region 访视 [HttpPost, Route("Inspection/subjectVisit/addOrUpdateSV")] [UnitOfWork] public async Task<IResponseOutput> AddOrUpdateSV(DataInspectionDto<SubjectVisitCommand> opt) { var fun = await _subjectVisitService.AddOrUpdateSV(opt.OptCommand); if (!fun.IsSuccess) { return ResponseOutput.NotOk(fun.ErrorMessage); } opt.AuditInfo.SubjectVisitId = Guid.Parse(fun.Data); opt.AuditInfo.SubjectVisitName = opt.OptCommand.VisitName; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } [HttpPost, Route("Inspection/subjectVisit/SetSubjectVisitUrgent")] [UnitOfWork] public async Task<IResponseOutput> SetSubjectVisitUrgent(DataInspectionDto<SetSubjectVisitUrgentCommand> opt) { var fun = await _subjectVisitService.SetSubjectVisitUrgent(opt.OptCommand.SubjectVisitId, opt.OptCommand.isUrgent); if (!fun.IsSuccess) { return ResponseOutput.NotOk(fun.ErrorMessage); } return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } [HttpPost, Route("Inspection/subjectVisit/DeleteSV")] [UnitOfWork] public async Task<IResponseOutput> DeleteSV(DataInspectionDto<DeleteSVCommand> opt) { var fun = await _subjectVisitService.DeleteSV(opt.OptCommand.SubjectVisitId); if (!fun.IsSuccess) { return ResponseOutput.NotOk(fun.ErrorMessage); } return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } [HttpPost, Route("Inspection/subjectVisit/SetSVExecuted")] [UnitOfWork] public async Task<IResponseOutput> SetSVExecuted(DataInspectionDto<DeleteSVCommand> opt) { var fun = await _subjectVisitService.SetSVExecuted(opt.OptCommand.SubjectVisitId); if (!fun.IsSuccess) { return ResponseOutput.NotOk(fun.ErrorMessage); } return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } #endregion #region 配置项目信息 /// <summary> /// 配置 基础逻辑信息 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/configTrialBasicInfo/configTrialBasicInfo")] [UnitOfWork] public async Task<IResponseOutput> ConfigTrialBasicInfo(DataInspectionDto<BasicTrialConfig> opt) { var fun = _trialConfigService.ConfigTrialBasicInfo; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 配置流程 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/configTrialBasicInfo/configTrialProcessInfo")] [UnitOfWork] public async Task<IResponseOutput> ConfigTrialProcessInfo(DataInspectionDto<TrialProcessConfig> opt) { var fun = _trialConfigService.ConfigTrialProcessInfo; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 配置加急信息 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialUrgentInfo")] [UnitOfWork] public async Task<IResponseOutput> ConfigTrialUrgentInfo(DataInspectionDto<TrialUrgentConfig> opt) { var fun = _trialConfigService.ConfigTrialUrgentInfo; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 签名确认 /// </summary> /// <param name="signConfirmDTO">签名确认</param> /// <returns></returns> [HttpPost, Route("Inspection/configTrialBasicInfo/TrialConfigSignatureConfirm")] [UnitOfWork] public async Task<IResponseOutput> TrialConfigSignatureConfirm(DataInspectionDto<SignConfirmDTO> opt) { var fun = _trialConfigService.TrialConfigSignatureConfirm; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 配置 基础逻辑信息并确认 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialBasicInfoConfirm")] [UnitOfWork] public async Task<IResponseOutput> ConfigTrialBasicInfoConfirm(DataInspectionDto<BasicTrialConfig> opt) { var data = await _trialConfigService.ConfigTrialBasicInfo(opt.OptCommand); if (!data.IsSuccess) { return ResponseOutput.NotOk(data.ErrorMessage); } var fun = _trialConfigService.TrialConfigSignatureConfirm; return await _inspectionService.Enforcement(new SignConfirmDTO() { TrialId=opt.OptCommand.TrialId, SignCode=opt.OptCommand.SignCode }, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 配置流程并确认 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialProcessInfoConfirm")] [UnitOfWork] public async Task<IResponseOutput> ConfigTrialProcessInfoConfirm(DataInspectionDto<TrialProcessConfig> opt) { var data = await _trialConfigService.ConfigTrialProcessInfo(opt.OptCommand); if (!data.IsSuccess) { return ResponseOutput.NotOk(data.ErrorMessage); } var fun = _trialConfigService.TrialConfigSignatureConfirm; return await _inspectionService.Enforcement(new SignConfirmDTO() { TrialId = opt.OptCommand.TrialId, SignCode = opt.OptCommand.SignCode }, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 配置加急信息并确认 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialUrgentInfoConfirm")] [UnitOfWork] public async Task<IResponseOutput> ConfigTrialUrgentInfoConfirm(DataInspectionDto<TrialUrgentConfig> opt) { var data = await _trialConfigService.ConfigTrialUrgentInfo(opt.OptCommand); if (!data.IsSuccess) { return ResponseOutput.NotOk(data.ErrorMessage); } var fun = _trialConfigService.TrialConfigSignatureConfirm; return await _inspectionService.Enforcement(new SignConfirmDTO() { TrialId = opt.OptCommand.TrialId, SignCode = opt.OptCommand.SignCode }, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 保存并确认访视计划 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpPost, Route("Inspection/VisitPlan/SaveConfirmTrialVisitPlan")] [UnitOfWork] public async Task<IResponseOutput> SaveConfirmTrialVisitPlan(DataInspectionDto<VisitPlanCommand> opt) { var update = await _visitPlanService.AddOrUpdateVisitStage(opt.OptCommand); if (!update.IsSuccess) { return ResponseOutput.NotOk(update.ErrorMessage); } var fun = _visitPlanService.ConfirmTrialVisitPlan; return await _inspectionService.Enforcement(opt.OptCommand.Id, opt.AuditInfo, opt.SignInfo, fun); } #endregion #region 受试者 /// <summary> /// 添加或更新受试者信息[New] /// </summary> /// <param name="opt"></param> /// <returns></returns> //[TypeFilter(typeof(TrialResourceFilter))] [HttpPost, Route("Inspection/Subject/AddOrUpdateSubject")] [UnitOfWork] public async Task<IResponseOutput> AddOrUpdateSubject(InsSubjectCommand opt) { opt.AuditInfo.SubjectCode = opt.OptCommand.Code; var fun = await _subjectService.AddOrUpdateSubject(opt.OptCommand); opt.AuditInfo.SubjectId = Guid.Parse(fun.Data); //var statusdata = new //{ // Status = "OnVisit", // //OutEnrollmentTime = DateTime.Now.ToString("yyyy-MM-dd"), // //VisitOverTime = DateTime.Now.ToString("yyyy-MM-dd"), // Reason = string.Empty, //}; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, null, fun); } /// <summary> /// 修改受试者状态 /// </summary> /// <param name="opt"></param> /// <returns></returns> /// [HttpPut, Route("Inspection/Subject/UpdateSubjectStatus")] [UnitOfWork] public async Task<IResponseOutput> UpdateSubjectStatus(InsUpdateSubjectStatus opt) { var fun = _subjectService.UpdateSubjectStatus; return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun); } /// <summary> /// 删除受试者 /// </summary> /// <param name="opt"></param> /// <returns></returns> [HttpDelete, Route("Inspection/Subject/DeleteSubject")] [UnitOfWork] public async Task<IResponseOutput> DeleteSubject(InsDeleteSubjectDto opt) { var fun = _subjectService.DeleteSubject; opt.AuditInfo.SubjectCode = opt.OptCommand.Code; var data = await _subjectService.DeleteSubject(opt.OptCommand.SubjectId); return await _inspectionService.Enforcement(opt.OptCommand, opt.AuditInfo, opt.SignInfo, fun, data); } #endregion } }