test
This commit is contained in:
@@ -7,7 +7,7 @@ DB_PASSWORD = user
|
||||
DB_DEBUG = false
|
||||
|
||||
|
||||
BLOCK_MODE = false
|
||||
BLOCK_MODE = true
|
||||
|
||||
|
||||
FLOW_PROCESS_CONFIG_KEY = standard
|
||||
|
||||
File diff suppressed because one or more lines are too long
+16
-4
@@ -3,7 +3,6 @@
|
||||
namespace app\config;
|
||||
|
||||
|
||||
|
||||
class Config
|
||||
{
|
||||
/**
|
||||
@@ -84,9 +83,20 @@ class Config
|
||||
get => $this->blockMode;
|
||||
}
|
||||
|
||||
public function setBlockMode(bool $value)
|
||||
|
||||
/**
|
||||
* @param bool $value
|
||||
* @return void
|
||||
* @deprecated 禁止使用,改方法仅仅用于 test 方法
|
||||
*/
|
||||
public function setBlockMode(bool $value): void
|
||||
{
|
||||
echo "\033[31m获取禁止修改热修改阻断模式,这只是用于测试方法\033[0m\n";
|
||||
$stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 10);
|
||||
$isContainTests = false;
|
||||
foreach ($stack as $item) if (str_contains($item['file'] ?? '', 'tests')) {
|
||||
$isContainTests = true;
|
||||
}
|
||||
if (!$isContainTests) throw new \RuntimeException('禁止修改阻断模式');
|
||||
$this->blockMode = $value;
|
||||
}
|
||||
|
||||
@@ -146,7 +156,9 @@ class Config
|
||||
$this->enableVirtualCleanerParser = self::getBoolEnv('ENABLE_VIRTUAL_CLEANER_PARSER', false);
|
||||
}
|
||||
|
||||
private function __clone() {}
|
||||
private function __clone()
|
||||
{
|
||||
}
|
||||
|
||||
private function detectCircularDependency(): void
|
||||
{
|
||||
|
||||
@@ -150,6 +150,19 @@ class ProcessContextBuilder
|
||||
$builder->isOperatorCard = $context->isOperatorCard();
|
||||
$builder->stepDurations = $context->getStepDurations();
|
||||
|
||||
// 遍历当前类的属性,检查哪些未被修改(对比默认值)
|
||||
$reflection = new \ReflectionClass($builder);
|
||||
$unmodifiedProperties = [];
|
||||
foreach ($reflection->getProperties() as $property) {
|
||||
$property->setAccessible(true); // 允许访问私有/受保护属性
|
||||
$defaultValue = $reflection->getDefaultProperties()[$property->getName()] ?? null;
|
||||
if ($property->getValue($builder) === $defaultValue) {
|
||||
$unmodifiedProperties[] = $property->getName();
|
||||
}
|
||||
}
|
||||
if (empty($unmodifiedProperties)){
|
||||
Logger::warn("from ProcessContext 创建 ProcessContextBuilder 时存在未修改的属性");
|
||||
}
|
||||
return $builder;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace flow;
|
||||
|
||||
class PartTimeFlowProcessor
|
||||
{
|
||||
|
||||
}
|
||||
@@ -199,12 +199,18 @@ class VirtualContextBuilder
|
||||
*/
|
||||
public function currentStep(string $step): self
|
||||
{
|
||||
// 自动从环境配置加载该步骤的时长(如果未手动设置)
|
||||
$duration = $this->processStatus->duration;
|
||||
if ($duration === null && isset($this->stepDurations[$step])) {
|
||||
$duration = $this->stepDurations[$step];
|
||||
}
|
||||
|
||||
$this->processStatus = new ProcessStatus(
|
||||
currentStep: $step,
|
||||
processType: $this->processStatus->processType,
|
||||
batchNo: $this->processStatus->batchNo,
|
||||
actionStartTime: $this->processStatus->actionStartTime,
|
||||
duration: $this->processStatus->duration,
|
||||
duration: $duration,
|
||||
previousAction: $this->processStatus->previousAction
|
||||
);
|
||||
return $this;
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace tests\flow;
|
||||
|
||||
use app\flow\config\ProcessConfig;
|
||||
use app\flow\context\ProcessContext;
|
||||
use app\flow\enum\VoiceMessage;
|
||||
use app\flow\ProcessEngine;
|
||||
use app\flow\context\bean\EndoscopeInfo;
|
||||
use app\flow\context\bean\OperatorInfo;
|
||||
@@ -160,16 +161,22 @@ class VirtualityFlowProcessor
|
||||
if (isset($this->operatorSessions[$readerData['id']])) {
|
||||
$opData = $this->operatorSessions[$readerData['id']];
|
||||
$builder->customOperator($opData['id'], $opData['name'], $opData['rfid']);
|
||||
} else {
|
||||
// 获取上一个记录的操作员
|
||||
$opData = $currentState->getOperator();
|
||||
$builder->customOperator($opData->id, $opData->name, $opData->rfid);
|
||||
|
||||
}
|
||||
|
||||
// 继承之前的流程状态
|
||||
if ($currentState !== null) {
|
||||
$st = strtotime($currentState->getActionStartTime());
|
||||
$duration = time() - $st;
|
||||
if (empty($st) || $duration <= 0) $duration = null;
|
||||
if (empty($st) || $duration < 0) $duration = null;
|
||||
$builder->currentStep($currentState->getCurrentStep())
|
||||
->batchNo($currentState->getBatchNo())
|
||||
->setDuration($duration)
|
||||
->actionStartTime(date("Y-m-d H:i:s"))
|
||||
->processType($currentState->getProcessType());
|
||||
|
||||
// 设置 previousAction:上一步骤名称就是当前状态的 currentStep
|
||||
@@ -186,7 +193,7 @@ class VirtualityFlowProcessor
|
||||
// 未刷人员卡检查
|
||||
if (!$context->hasOperator() && !isset($this->operatorSessions[$readerData['id']])) {
|
||||
$result = $context->createModifyBuilder()
|
||||
->error(\app\flow\enum\VoiceMessage::PLEASE_SWIPE_OPERATOR)
|
||||
->error(VoiceMessage::PLEASE_SWIPE_OPERATOR)
|
||||
->build();
|
||||
$this->history[] = $result;
|
||||
return $result;
|
||||
|
||||
@@ -94,7 +94,9 @@ class BlockTest extends TestCase
|
||||
|
||||
$engine = ProcessEngine::createStandard();
|
||||
$result = $engine->execute($context);
|
||||
|
||||
// 输出语音
|
||||
Logger::info("测试时间验证策略阻断 - 阻断模式开启 success:{}",[$result->isSuccess()]);
|
||||
Logger::info($result->getFullVoice());
|
||||
// 阻断模式下,时间不足应该导致流程失败
|
||||
$this->assertFalse($result->isSuccess(), '阻断模式下,时长不足应失败');
|
||||
}
|
||||
|
||||
@@ -76,6 +76,50 @@ class ManualWashTest extends TestCase
|
||||
// 验证最终步骤成功
|
||||
$this->assertTrue($result5->isSuccess(), '干燥步骤 isSuccess() 应为 true');
|
||||
}
|
||||
/**
|
||||
* 测试完整手工洗流程:清洗 -> 漂洗 -> 消毒 -> 终末漂洗 -> 干燥
|
||||
* 使用真实环境引擎执行
|
||||
*/
|
||||
public function testCompleteManualWashProcess2(): void
|
||||
{
|
||||
$operator = '操作员 1';
|
||||
$endoscope = '胃镜 1';
|
||||
|
||||
// 步骤 1:清洗
|
||||
$result1 = $this->processor->swipe($operator, $endoscope, '清洗');
|
||||
$this->assertSuccess($result1, '清洗步骤应成功');
|
||||
$this->assertStep($result1, '清洗');
|
||||
$this->assertNeedDatabaseOperation($result1);
|
||||
$batchNo = $result1->getBatchNo();
|
||||
$this->assertNotEmpty($batchNo, '应生成批次号');
|
||||
|
||||
// 步骤 2:漂洗
|
||||
$result2 = $this->processor->swipe($operator, $endoscope, '漂洗');
|
||||
$this->assertSuccess($result2, '漂洗步骤应成功');
|
||||
$this->assertStep($result2, '漂洗');
|
||||
$this->assertBatchNoEquals($result2, $batchNo, '批次号应保持一致');
|
||||
|
||||
// 步骤 3:消毒
|
||||
$result3 = $this->processor->swipe($operator, $endoscope, '消毒');
|
||||
$this->assertSuccess($result3, '消毒步骤应成功');
|
||||
$this->assertStep($result3, '消毒');
|
||||
$this->assertBatchNoEquals($result3, $batchNo, '批次号应保持一致');
|
||||
|
||||
// 步骤 4:终末漂洗
|
||||
$result4 = $this->processor->swipe($operator, $endoscope, '终末漂洗');
|
||||
$this->assertSuccess($result4, '终末漂洗步骤应成功');
|
||||
$this->assertStep($result4, '终末漂洗');
|
||||
$this->assertBatchNoEquals($result4, $batchNo, '批次号应保持一致');
|
||||
|
||||
// 步骤 5:干燥
|
||||
$result5 = $this->processor->swipe($operator, $endoscope, '干燥');
|
||||
$this->assertSuccess($result5, '干燥步骤应成功');
|
||||
$this->assertStep($result5, '干燥');
|
||||
$this->assertBatchNoEquals($result5, $batchNo, '批次号应保持一致');
|
||||
|
||||
// 验证最终步骤成功
|
||||
$this->assertTrue($result5->isSuccess(), '干燥步骤 isSuccess() 应为 true');
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试使用便捷方法执行完整手工洗流程
|
||||
|
||||
Reference in New Issue
Block a user