morningWashConfig = $config; Logger::debug("MorningWashStrategy 初始化完成"); } /** * 执行晨洗判断 */ protected function doExecute(ProcessContext $context, ProcessNodeInterface $node): ProcessContext { $isEnd = $context->getCurrentStep() == '结束'; $needMorning = $this->checkNeedMorningWash($context) && $isEnd; $morningWash = new MorningWashStatus( needMorningWash: $needMorning, morningWashed: !$needMorning, startTime: $context->getMorningWash()->startTime, todayWashRecords: $context->getMorningWash()->todayWashRecords ); return $context->createModifyBuilder()->setMorningWash($morningWash)->build(); } /** * 检查是否需要晨洗 */ protected function checkNeedMorningWash(ProcessContext $context): bool { return match ($this->morningWashConfig->mode) { MorningMode::None => false, MorningMode::All => true, MorningMode::StorageTime => $this->checkByStorageTime($context), MorningMode::DailyFirst => $this->checkByDailyFirst($context), MorningMode::SpecificTypes => $this->checkBySpecificTypes($context), }; } /** * 根据存储时间判断(义乌模式) * 普通镜柜超过阈值小时需要晨洗,无菌镜柜免晨消 */ protected function checkByStorageTime(ProcessContext $context): bool { $storageInTime = $context->getStorage()->inTime; $lastActionType = $context->getPreviousAction()?->action_type_name; $lastProcessName = $context->getPreviousAction()?->process_name; // 如果最后一次操作是存储且已取出 if ($lastActionType === '存储' && $lastProcessName === '内镜取出') { return false; } // 如果最后一次操作是存储且未取出,检查存储时间 if ($lastActionType === '存储' && $lastProcessName === '内镜放入' && $storageInTime) { $storageHours = (time() - strtotime($storageInTime)) / 3600; return $storageHours > $this->morningWashConfig->storageThreshold; } // 检查今天是否已有洗消记录 return $this->hasWashRecordToday($context); } /** * 根据每天第一次判断(忠县模式) */ protected function checkByDailyFirst(ProcessContext $context): bool { return $this->hasWashRecordToday($context); } /** * 检查今天是否已有洗消记录 */ protected function hasWashRecordToday(ProcessContext $context): bool { return $context->getMorningWash()->todayWashRecords === 0; } /** * 根据特定类型判断 */ protected function checkBySpecificTypes(ProcessContext $context): bool { $specificTypes = $this->morningWashConfig->getExpand('specific_types', []); return in_array($context->getEndoscope()->type, $specificTypes); } /** * 获取策略名称 */ public function getName(): string { return '晨洗判断策略(' . $this->morningWashConfig->mode->name . ')'; } }