storageSingleReader; // 非单读卡器模式不处理 if (!$singleReaderMode) { return CanHandleResult::cannotHandle(); } // 读卡器类型必须是'内镜放入'或'内镜取出' if (!in_array($context->getReader()->type, ['内镜放入', '内镜取出'])) { return CanHandleResult::cannotHandle(); } $isInStorage = $context->getStorage()->isInStorage; if ($isInStorage) { // 内镜已在库中,执行出库 $validSteps = ['内镜放入', '结束']; if (!$this->isRequiredNode($context->getCurrentStep(), $validSteps)) { Logger::debug('[StorageNode] 当前步骤 {} 不符合出库条件', [$context->getCurrentStep()]); return CanHandleResult::cannotHandle(); } } else { // 内镜不在库中,执行入库 $validSteps = ['', '结束', '内镜取出', '测漏正常', '测漏异常']; if (!$this->isRequiredNode($context->getCurrentStep(), $validSteps)) { Logger::debug('[StorageNode] 当前步骤 {} 不符合入库条件', [$context->getCurrentStep()]); return CanHandleResult::cannotHandle(); } } return CanHandleResult::canHandle(); } /** * 具体处理逻辑 * 根据 isInStorage 状态判断执行入库还是出库 */ protected function doHandle(ProcessContext $context): ProcessContext { $builder = $context->createModifyBuilder()->setProcessType('存储'); // 根据当前状态判断执行入库还是出库(canHandle 已经验证过状态) if (!$context->getStorage()->isInStorage) { // 入库操作 Logger::debug('[StorageNode] 内镜入库成功 endoscope={}', [$context->getEndoscope()->name]); $builder->setCurrentStep('内镜放入') ->setStorage(StorageStatus::inStorage(date('Y-m-d H:i:s'))); } else { // 出库操作 Logger::debug('[StorageNode] 内镜出库成功 endoscope={}', [$context->getEndoscope()->name]); $builder->setCurrentStep('内镜取出') ->setStorage(StorageStatus::outOfStorage()); } return $builder ->setNeedDatabaseOperation() ->setDbOperation(DbOperationType::INSERT) ->setNeedWebSocketNotify() ->build(); } }