#!/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