93 lines
3.0 KiB
Python
93 lines
3.0 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
条件分支节点处理器
|
|
处理条件判断和分支选择
|
|
"""
|
|
import logging
|
|
from typing import Dict, TYPE_CHECKING
|
|
|
|
from online_dev.workflow.engine.handlers.base_handler import BaseNodeHandler
|
|
|
|
if TYPE_CHECKING:
|
|
from online_dev.workflow.engine.base import ExecutionContext
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ConditionHandler(BaseNodeHandler):
|
|
"""
|
|
条件分支节点处理器
|
|
|
|
根据条件表达式选择执行的分支
|
|
- 条件组之间是 OR 关系
|
|
- 组内条件是 AND 关系
|
|
- 支持默认分支
|
|
"""
|
|
|
|
async def execute(self, context: 'ExecutionContext', node: Dict) -> None:
|
|
"""
|
|
执行条件节点:评估条件并选择分支
|
|
"""
|
|
from online_dev.workflow.engine.condition_evaluator import condition_evaluator
|
|
|
|
branches = node.get('branches', [])
|
|
node_id = self.get_node_id(node)
|
|
|
|
logger.info(f"处理条件分支 - 节点: {node_id}, 分支数: {len(branches)}")
|
|
|
|
# 按优先级评估每个分支
|
|
for branch in branches:
|
|
config = branch.get('config', {})
|
|
|
|
# 默认分支
|
|
if config.get('isDefault'):
|
|
logger.info(f"进入默认分支: {branch.get('name')}")
|
|
await self._enter_branch(context, node, branch)
|
|
return
|
|
|
|
# 评估条件
|
|
groups = config.get('groups', [])
|
|
if condition_evaluator.evaluate_groups(groups, context.form_data):
|
|
logger.info(f"条件满足,进入分支: {branch.get('name')}")
|
|
await self._enter_branch(context, node, branch)
|
|
return
|
|
|
|
# 没有分支满足条件
|
|
logger.warning(f"条件节点 {node_id} 没有满足的分支,结束流程")
|
|
await self.engine._end_instance(context, 'rejected')
|
|
|
|
async def _enter_branch(
|
|
self,
|
|
context: 'ExecutionContext',
|
|
condition_node: Dict,
|
|
branch: Dict,
|
|
) -> None:
|
|
"""
|
|
进入分支
|
|
|
|
Args:
|
|
context: 执行上下文
|
|
condition_node: 条件节点
|
|
branch: 选中的分支
|
|
"""
|
|
# 记录条件分支选择日志(系统自动执行,不关联用户)
|
|
await self.create_log(
|
|
context, condition_node, 'condition',
|
|
comment=f'进入分支: {branch.get("name", "")}',
|
|
extra_data={
|
|
'branch_name': branch.get('name', ''),
|
|
'branch_id': branch.get('id', ''),
|
|
},
|
|
operator_id='',
|
|
)
|
|
|
|
branch_children = branch.get('children')
|
|
|
|
if branch_children:
|
|
# 分支有子节点,推进到分支内的第一个节点
|
|
await self.advance_to_next(context, {'children': branch_children})
|
|
else:
|
|
# 分支无子节点,继续推进条件节点的下一节点
|
|
await self.advance_to_next(context, condition_node)
|