303 lines
10 KiB
Python
303 lines
10 KiB
Python
#!/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
|