feat: restore source parity and harden agent runtime

This commit is contained in:
2026-06-22 11:17:26 +08:00
parent e33f08277b
commit 0793eb82d6
596 changed files with 168879 additions and 290 deletions
@@ -0,0 +1,302 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
工作流 Schema 定义
"""
from datetime import datetime
from typing import Optional, List, Any
from pydantic import BaseModel, ConfigDict, Field
from app.base_schema import CSTDatetime
# ============ 流程定义 Schema ============
class WorkflowDefinitionCreate(BaseModel):
"""创建流程定义"""
application_id: Optional[str] = Field(None, description="所属应用ID")
name: str = Field(..., max_length=100, description="流程名称")
code: str = Field(..., max_length=100, pattern=r"^[a-zA-Z][a-zA-Z0-9_]*$", description="流程编码(字母开头,只能包含字母、数字和下划线)")
workflow_type: str = Field(default="other", max_length=20, description="流程类型: approval/application/business/hr/finance/admin/other")
icon: str = Field(default="", max_length=100, description="流程图标")
icon_bg_color: str = Field(default="", max_length=200, description="图标背景色(支持渐变色)")
category: str = Field(default="", max_length=50, description="分类")
description: str = Field(default="", description="描述")
form_code: str = Field(..., max_length=100, description="关联表单编码")
document_template_codes: List[str] = Field(default_factory=list, description="关联文档模板编码列表")
flow_definition: dict = Field(default_factory=dict, description="流程定义")
sort: int = Field(default=0, description="排序(数值越小越靠前)")
class WorkflowDefinitionUpdate(BaseModel):
"""更新流程定义"""
name: Optional[str] = Field(None, max_length=100, description="流程名称")
workflow_type: Optional[str] = Field(None, max_length=20, description="流程类型")
icon: Optional[str] = Field(None, max_length=100, description="流程图标")
icon_bg_color: Optional[str] = Field(None, max_length=200, description="图标背景色(支持渐变色)")
category: Optional[str] = Field(None, max_length=50, description="分类")
description: Optional[str] = Field(None, description="描述")
form_code: Optional[str] = Field(None, max_length=100, description="关联表单编码")
document_template_codes: Optional[List[str]] = Field(None, description="关联文档模板编码列表")
flow_definition: Optional[dict] = Field(None, description="流程定义")
sort: Optional[int] = Field(None, description="排序(数值越小越靠前)")
class WorkflowDefinitionOut(BaseModel):
"""流程定义输出"""
id: str
application_id: Optional[str] = None
name: str
code: str
workflow_type: str = "other"
icon: str = ""
icon_bg_color: str = ""
category: str
description: str
status: str
version: int
form_code: str
form_name: str
document_template_codes: List[str] = []
flow_definition: dict
created_at: Optional[CSTDatetime] = Field(None, alias="sys_create_datetime")
updated_at: Optional[CSTDatetime] = Field(None, alias="sys_update_datetime")
model_config = ConfigDict(from_attributes=True, populate_by_name=True)
class WorkflowDefinitionListOut(BaseModel):
"""流程定义列表输出"""
id: str
application_id: Optional[str] = None
application_name: Optional[str] = ""
name: str
code: str
workflow_type: str = "other"
icon: str = ""
icon_bg_color: str = ""
category: str
description: str
status: str
version: int
form_code: str
form_name: str
sort: int = 0
created_at: Optional[CSTDatetime] = Field(None, alias="sys_create_datetime")
updated_at: Optional[CSTDatetime] = Field(None, alias="sys_update_datetime")
model_config = ConfigDict(from_attributes=True, populate_by_name=True)
# ============ 导入导出 Schema ============
class WorkflowImportCheckIn(BaseModel):
"""流程导入预检查"""
code: str = Field(..., description="流程编码")
class WorkflowImportCheckOut(BaseModel):
"""流程导入预检查结果"""
code_exists: bool = Field(..., description="流程编码是否已存在")
can_import: bool = Field(..., description="是否可以直接导入")
class WorkflowImportIn(BaseModel):
"""流程配置导入"""
application_id: Optional[str] = Field(None, description="所属应用ID")
name: str = Field(..., max_length=100, description="流程名称")
code: str = Field(..., max_length=100, pattern=r"^[a-zA-Z][a-zA-Z0-9_]*$", description="流程编码")
workflow_type: str = Field(default="other", max_length=20, description="流程类型")
icon: str = Field(default="", max_length=100, description="流程图标")
icon_bg_color: str = Field(default="", max_length=200, description="图标背景色")
category: str = Field(default="", max_length=50, description="分类")
description: str = Field(default="", description="描述")
form_code: str = Field(..., max_length=100, description="关联表单编码")
document_template_codes: List[str] = Field(default_factory=list, description="关联文档模板编码列表")
flow_definition: dict = Field(default_factory=dict, description="流程定义")
sort: int = Field(default=0, description="排序")
# ============ 流程实例 Schema ============
class WorkflowInstanceCreate(BaseModel):
"""发起流程"""
workflow_code: str = Field(..., description="流程编码")
title: str = Field(..., max_length=200, description="流程标题")
form_data: dict = Field(..., description="表单数据")
class WorkflowInstanceOut(BaseModel):
"""流程实例输出"""
id: str
instance_no: str
title: str
status: str
workflow_id: str
workflow_name: str = ""
workflow_code: str = ""
form_code: str
form_data_id: str
current_node_id: str
current_node_name: str
initiator_id: str
initiator_name: str = ""
started_at: Optional[CSTDatetime] = None
completed_at: Optional[CSTDatetime] = None
has_document_templates: bool = False
model_config = ConfigDict(from_attributes=True)
class WorkflowInstanceListOut(BaseModel):
"""流程实例列表输出"""
id: str
instance_no: str
title: str
status: str
workflow_name: str = ""
application_name: str = ""
current_node_name: str
has_document_templates: bool
initiator_name: str = ""
started_at: Optional[CSTDatetime] = None
completed_at: Optional[CSTDatetime] = None
model_config = ConfigDict(from_attributes=True)
# ============ 任务 Schema ============
class TaskApproveInput(BaseModel):
"""审批任务"""
action: str = Field(..., description="操作: approve/reject/return")
comment: str = Field(default="", description="审批意见")
signature: Optional[str] = Field(None, description="签名数据(base64格式)")
return_to: Optional[str] = Field(None, description="驳回目标: initiator(发起人) 或 节点ID")
form_data: Optional[dict] = Field(None, description="修改后的表单数据(审批人编辑了可编辑字段时传入)")
class TaskHandleInput(BaseModel):
"""办理任务"""
comment: str = Field(default="", description="办理意见")
form_data: Optional[dict] = Field(None, description="修改后的表单数据(办理人编辑了可编辑字段时传入)")
class TaskReviseInput(BaseModel):
"""修改任务(驳回后重新提交)"""
form_data: dict = Field(..., description="修改后的表单数据")
comment: str = Field(default="", description="修改说明")
class TaskTransferInput(BaseModel):
"""转交任务"""
to_user_id: str = Field(..., description="转交给用户ID")
comment: str = Field(default="", description="转交说明")
class TaskDelegateInput(BaseModel):
"""委派任务"""
to_user_id: str = Field(..., description="委派给用户ID")
comment: str = Field(default="", description="委派说明")
class TaskAddSignInput(BaseModel):
"""加签任务"""
sign_type: str = Field(..., description="加签类型: before(前加签)/after(后加签)/parallel(并行加签)")
to_user_ids: List[str] = Field(..., description="加签人ID列表")
comment: str = Field(default="", description="加签说明")
class WorkflowTaskOut(BaseModel):
"""任务输出"""
id: str
instance_id: str
instance_no: str = ""
instance_title: str = ""
node_id: str
node_name: str
task_type: str
status: str
assignee_id: str
assignee_name: str = ""
comment: str
signature_file_id: Optional[str] = None
handled_at: Optional[CSTDatetime] = None
sys_create_datetime: Optional[CSTDatetime] = None
# 取消原因(or_sign=或签被他人审批自动取消, revoked=发起人撤回, 空=其他)
cancel_reason: str = ""
# 流程信息
workflow_name: str = ""
initiator_name: str = ""
started_at: Optional[CSTDatetime] = None
# 表单信息(任务详情时返回)
form_code: Optional[str] = None
form_config: Optional[dict] = None
form_data: Optional[dict] = None
form_permissions: Optional[list] = None
action_permissions: Optional[list] = None
require_signature: Optional[bool] = False
last_return_log: Optional[dict] = None
model_config = ConfigDict(from_attributes=True)
class WorkflowTaskListOut(BaseModel):
"""任务列表输出"""
id: str
instance_id: str
instance_no: str = ""
instance_title: str = ""
instance_status: str = ""
node_name: str
task_type: str
status: str
assignee_id: str = ""
assignee_name: str = ""
workflow_name: str = ""
initiator_name: str = ""
started_at: Optional[CSTDatetime] = None
sys_create_datetime: Optional[CSTDatetime] = None
has_document_templates: bool = False
# 超时相关字段
timeout_at: Optional[CSTDatetime] = None
timeout_action: str = ""
is_timeout: bool = False
# 流程图标
workflow_icon: str = ""
workflow_icon_bg_color: str = ""
model_config = ConfigDict(from_attributes=True)
# ============ 日志 Schema ============
class WorkflowLogOut(BaseModel):
"""日志输出"""
id: str
node_id: str
node_name: str
action: str
operator_id: str
operator_name: str = ""
comment: str
extra_data: Optional[dict] = None
sys_create_datetime: Optional[CSTDatetime] = None
model_config = ConfigDict(from_attributes=True)
# ============ 通用 Schema ============
class MessageResponse(BaseModel):
"""消息响应"""
message: str
class CountResponse(BaseModel):
"""计数响应"""
count: int