// 工作流相关类型定义

export interface IProcessDefinition {
  id?: number;
  process_name: string;          // 流程名称
  process_code: string;          // 流程编码
  source?: string;               // 流程来源
  description?: string;          // 流程描述
  is_active?: boolean;           // 是否启用
  revoke_events?: string[];      // 撤销事件
  nodes_json?: string;           // 节点配置 JSON
  nodes?: INode[];               // 节点列表
  created_at?: string;
  updated_at?: string;
}

export interface INode {
  node_id: string;               // 节点 ID
  node_name: string;             // 节点名称
  node_type: number;             // 节点类型：0-开始，1-审批，2-网关，3-结束
  prev_node_ids?: string[];      // 前置节点 ID 列表
  user_ids?: string[];           // 用户 ID 列表
  roles?: string[];              // 角色列表
  gw_config?: IGatewayConfig;    // 网关配置
  is_cosigned?: number;          // 是否会签：0-否，1-是
  node_start_events?: string[];  // 节点启动事件
  node_end_events?: string[];    // 节点结束事件
  task_finish_events?: string[]; // 任务完成事件
}

export interface IGatewayConfig {
  conditions?: ICondition[];     // 条件分支
  inevitable_nodes?: string[];   // 必经节点
  wait_for_all_prev_node?: number; // 等待所有前置节点：0-否，1-是
}

export interface ICondition {
  expression: string;            // 条件表达式（如"$days>=3"）
  node_id: string;               // 满足条件时跳转的节点 ID
}

export interface IProcessInstance {
  id?: number;
  process_def_id: number;        // 流程定义 ID
  process_def?: IProcessDefinition;
  business_type: string;         // 业务类型
  business_id: number;           // 业务 ID
  status?: number;               // 实例状态：0-运行中，1-已完成，2-已终止，3-已撤销
  starter_id?: number;
  starter?: IUser;
  current_node_id?: string;      // 当前节点 ID
  variables?: string;            // 流程变量 JSON
  finished_at?: string;
  created_at?: string;
  updated_at?: string;
}

export interface ITask {
  id?: number;
  instance_id: number;
  instance?: IProcessInstance;
  node_id: string;
  node_name: string;
  status?: number;               // 任务状态：0-待处理，1-已完成，2-已拒绝，3-已取消
  assignee_id?: number;
  assignee?: IUser;
  comment?: string;
  handled_at?: string;
  created_at?: string;
  updated_at?: string;
}

export interface IUser {
  id: number;
  openid: string;
  nickname?: string;
  real_name?: string;
  phone?: string;
}
