101 lines
2.2 KiB
Python
101 lines
2.2 KiB
Python
#!/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()}"
|