#!/usr/bin/env python # -*- coding: utf-8 -*- """ 工作流引擎基础模块 定义核心类型、枚举和数据类 """ import logging import uuid from dataclasses import dataclass from datetime import datetime from enum import Enum from typing import Dict, Any logger = logging.getLogger(__name__) class NodeType(Enum): """节点类型""" START = 'start' END = 'end' APPROVAL = 'approval' HANDLE = 'handle' COPY = 'copy' CONDITION = 'condition' PARALLEL = 'parallel' DELAY = 'delay' NOTIFY = 'notify' SERVICE = 'service' SUBFLOW = 'subflow' DATA_UPDATE = 'data_update' class TaskAction(Enum): """任务操作""" APPROVE = 'approve' REJECT = 'reject' TRANSFER = 'transfer' RETURN = 'return' DELEGATE = 'delegate' ADD_SIGN = 'add_sign' class MultiApprovalType(Enum): """多人审批类型""" SEQUENTIAL = 'sequential' PARALLEL = 'parallel' ANY = 'any' class InstanceStatus(Enum): """流程实例状态""" PENDING = 'pending' APPROVED = 'approved' REJECTED = 'rejected' CANCELED = 'canceled' class TaskStatus(Enum): """任务状态""" PENDING = 'pending' WAITING = 'waiting' APPROVED = 'approved' REJECTED = 'rejected' RETURNED = 'returned' TRANSFERRED = 'transferred' DELEGATED = 'delegated' HANDLED = 'handled' CANCELED = 'canceled' READ = 'read' @dataclass class ExecutionContext: """ 执行上下文 在流程执行过程中传递的上下文信息 """ instance: Any form_data: Dict current_user_id: str flow_definition: Dict db: Any = None def get_initiator_id(self) -> str: """获取发起人ID""" return self.instance.initiator_id if self.instance else '' def get_instance_id(self) -> str: """获取实例ID""" return str(self.instance.id) if self.instance else '' def get_current_node_id(self) -> str: """获取当前节点ID""" return self.instance.current_node_id if self.instance else '' def generate_instance_no() -> str: """生成流程实例编号""" now = datetime.now() return f"WF{now.strftime('%Y%m%d%H%M%S')}{str(uuid.uuid4())[:8].upper()}"