-- 审批流程框架数据库表结构
-- 创建时间：2025-09-06

-- 1. 审批流程定义表
DROP TABLE IF EXISTS `approval_workflow_definition`;
CREATE TABLE `approval_workflow_definition` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `workflow_code` varchar(50) NOT NULL COMMENT '流程代码',
  `workflow_name` varchar(100) NOT NULL COMMENT '流程名称',
  `workflow_type` varchar(50) NOT NULL COMMENT '流程类型(PERSONAL:个人级别,SECTION:科级,GROUP:班组级,SEIZURE_REPORT:查获上报)',
  `description` varchar(500) DEFAULT NULL COMMENT '流程描述',
  `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_workflow_code` (`workflow_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审批流程定义表';

-- 2. 审批节点定义表
DROP TABLE IF EXISTS `approval_node_definition`;
CREATE TABLE `approval_node_definition` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `workflow_id` bigint(20) NOT NULL COMMENT '流程定义ID',
  `node_code` varchar(50) NOT NULL COMMENT '节点代码',
  `node_name` varchar(100) NOT NULL COMMENT '节点名称',
  `node_type` varchar(50) NOT NULL COMMENT '节点类型(START:开始,APPROVE:审批,NOTIFY:通知,END:结束)',
  `sort_order` int(11) NOT NULL COMMENT '节点顺序',
  `approver_type` varchar(50) DEFAULT NULL COMMENT '审批人类型(USER:指定用户,ROLE:角色,DEPT:部门,GROUP_LEADER:班组长,SECTION_LEADER:科长)',
  `approver_value` varchar(200) DEFAULT NULL COMMENT '审批人值',
  `can_reject` char(1) DEFAULT '0' COMMENT '是否可驳回(0否 1是)',
  `is_required` char(1) DEFAULT '1' COMMENT '是否必须审批(0否 1是)',
  `timeout_hours` int(11) DEFAULT NULL COMMENT '超时小时数',
  `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_workflow_id` (`workflow_id`),
  UNIQUE KEY `uk_workflow_node` (`workflow_id`, `node_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审批节点定义表';

-- 3. 审批实例表
DROP TABLE IF EXISTS `approval_instance`;
CREATE TABLE `approval_instance` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `instance_no` varchar(50) NOT NULL COMMENT '实例编号',
  `workflow_id` bigint(20) NOT NULL COMMENT '流程定义ID',
  `title` varchar(200) NOT NULL COMMENT '审批标题',
  `business_type` varchar(50) NOT NULL COMMENT '业务类型',
  `business_id` bigint(20) NOT NULL COMMENT '业务ID',
  `business_data` text COMMENT '业务数据(JSON格式)',
  `submitter_id` bigint(20) NOT NULL COMMENT '提交人ID',
  `submitter_name` varchar(50) NOT NULL COMMENT '提交人姓名',
  `submit_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '提交时间',
  `current_node_id` bigint(20) DEFAULT NULL COMMENT '当前节点ID',
  `status` varchar(20) DEFAULT 'RUNNING' COMMENT '实例状态(RUNNING:运行中,COMPLETED:已完成,REJECTED:已驳回,CANCELLED:已取消)',
  `completion_time` datetime DEFAULT NULL COMMENT '完成时间',
  `urgent_level` varchar(20) DEFAULT 'NORMAL' COMMENT '紧急程度(LOW:低,NORMAL:普通,HIGH:高,URGENT:紧急)',
  `form_data` json DEFAULT NULL COMMENT '表单数据',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_instance_no` (`instance_no`),
  KEY `idx_workflow_id` (`workflow_id`),
  KEY `idx_submitter_id` (`submitter_id`),
  KEY `idx_business` (`business_type`, `business_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审批实例表';

-- 4. 审批任务表
DROP TABLE IF EXISTS `approval_task`;
CREATE TABLE `approval_task` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `task_no` varchar(50) NOT NULL COMMENT '任务编号',
  `instance_id` bigint(20) NOT NULL COMMENT '实例ID',
  `node_id` bigint(20) NOT NULL COMMENT '节点ID',
  `task_name` varchar(100) NOT NULL COMMENT '任务名称',
  `assignee_id` bigint(20) NOT NULL COMMENT '处理人ID',
  `assignee_name` varchar(50) NOT NULL COMMENT '处理人姓名',
  `assign_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '分配时间',
  `status` varchar(20) DEFAULT 'PENDING' COMMENT '任务状态(PENDING:待处理,APPROVED:已同意,REJECTED:已驳回,CANCELLED:已取消)',
  `complete_time` datetime DEFAULT NULL COMMENT '完成时间',
  `comment` text COMMENT '审批意见',
  `form_data` json DEFAULT NULL COMMENT '表单数据',
  `timeout_time` datetime DEFAULT NULL COMMENT '超时时间',
  `is_timeout` char(1) DEFAULT '0' COMMENT '是否超时(0否 1是)',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_task_no` (`task_no`),
  KEY `idx_instance_id` (`instance_id`),
  KEY `idx_node_id` (`node_id`),
  KEY `idx_assignee_id` (`assignee_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审批任务表';

-- 5. 审批历史表
DROP TABLE IF EXISTS `approval_history`;
CREATE TABLE `approval_history` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `instance_id` bigint(20) NOT NULL COMMENT '实例ID',
  `task_id` bigint(20) DEFAULT NULL COMMENT '任务ID',
  `node_id` bigint(20) DEFAULT NULL COMMENT '节点ID',
  `node_name` varchar(100) DEFAULT NULL COMMENT '节点名称',
  `action` varchar(50) NOT NULL COMMENT '操作(SUBMIT:提交,APPROVE:同意,REJECT:驳回,CANCEL:取消,COMPLETE:完成)',
  `operator_id` bigint(20) NOT NULL COMMENT '操作人ID',
  `operator_name` varchar(50) NOT NULL COMMENT '操作人姓名',
  `operation_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
  `comment` text COMMENT '操作意见',
  `form_data` json DEFAULT NULL COMMENT '表单数据',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_instance_id` (`instance_id`),
  KEY `idx_task_id` (`task_id`),
  KEY `idx_operator_id` (`operator_id`),
  KEY `idx_operation_time` (`operation_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审批历史表';

-- 6. 审批抄送表
DROP TABLE IF EXISTS `approval_cc`;
CREATE TABLE `approval_cc` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `instance_id` bigint(20) NOT NULL COMMENT '实例ID',
  `cc_user_id` bigint(20) NOT NULL COMMENT '抄送用户ID',
  `cc_user_name` varchar(50) NOT NULL COMMENT '抄送用户姓名',
  `cc_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '抄送时间',
  `is_read` char(1) DEFAULT '0' COMMENT '是否已读(0否 1是)',
  `read_time` datetime DEFAULT NULL COMMENT '阅读时间',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_instance_id` (`instance_id`),
  KEY `idx_cc_user_id` (`cc_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审批抄送表';

-- 初始化审批流程定义数据
INSERT INTO `approval_workflow_definition` VALUES
(1, 'PERSONAL_LEVEL', '个人级别审批流程', 'PERSONAL', '被检查级别为个人，无需审批，发送待办通知', '0', 'admin', NOW(), 'admin', NOW(), '个人级别检查流程'),
(2, 'SECTION_LEVEL', '科级审批流程', 'SECTION', '被检查级别为科级，需经科长节点审批', '0', 'admin', NOW(), 'admin', NOW(), '科级检查流程'),
(3, 'GROUP_LEVEL', '班组级审批流程', 'GROUP', '被检查级别为班组级，需班组长处理', '0', 'admin', NOW(), 'admin', NOW(), '班组级检查流程'),
(4, 'SEIZURE_REPORT_STAFF', '查获上报流程(安检员)', 'SEIZURE_REPORT', '安检员提交的查获上报流程', '0', 'admin', NOW(), 'admin', NOW(), '安检员查获上报流程'),
(5, 'SEIZURE_REPORT_LEADER', '查获上报流程(班组长)', 'SEIZURE_REPORT', '班组长提交的查获上报流程', '0', 'admin', NOW(), 'admin', NOW(), '班组长查获上报流程');

-- 初始化审批节点定义数据

-- 个人级别流程节点
INSERT INTO `approval_node_definition` VALUES
(1, 1, 'START', '开始', 'START', 1, NULL, NULL, '0', '1', NULL, '0', 'admin', NOW(), 'admin', NOW(), '流程开始'),
(2, 1, 'NOTIFY', '通知确认', 'NOTIFY', 2, 'USER', NULL, '0', '1', 24, '0', 'admin', NOW(), 'admin', NOW(), '发送待办通知给组员'),
(3, 1, 'END', '归档', 'END', 3, NULL, NULL, '0', '1', NULL, '0', 'admin', NOW(), 'admin', NOW(), '流程结束归档');

-- 科级流程节点
INSERT INTO `approval_node_definition` VALUES
(4, 2, 'START', '开始', 'START', 1, NULL, NULL, '0', '1', NULL, '0', 'admin', NOW(), 'admin', NOW(), '流程开始'),
(5, 2, 'SECTION_LEADER', '科长审批', 'APPROVE', 2, 'SECTION_LEADER', NULL, '1', '1', 48, '0', 'admin', NOW(), 'admin', NOW(), '科长选择整改班组'),
(6, 2, 'GROUP_LEADER_RECTIFY', '班组长整改', 'APPROVE', 3, 'GROUP_LEADER', NULL, '1', '1', 72, '0', 'admin', NOW(), 'admin', NOW(), '班组长填写整改详情'),
(7, 2, 'SECTION_REVIEW', '科长复审', 'APPROVE', 4, 'SECTION_LEADER', NULL, '1', '1', 48, '0', 'admin', NOW(), 'admin', NOW(), '科长审批整改结果'),
(8, 2, 'QUALITY_REVIEW', '质检科审批', 'APPROVE', 5, 'DEPT_SECTION_LEADER', 'quality_inspector', '1', '1', 48, '0', 'admin', NOW(), 'admin', NOW(), '质检科最终审批'),
(9, 2, 'END', '归档', 'END', 6, NULL, NULL, '0', '1', NULL, '0', 'admin', NOW(), 'admin', NOW(), '流程结束归档');


-- 班组级流程节点
INSERT INTO `approval_node_definition` VALUES
(10, 3, 'START', '开始', 'START', 1, NULL, NULL, '0', '1', NULL, '0', 'admin', NOW(), 'admin', NOW(), '流程开始'),
(11, 3, 'SECTION_LEADER', '科长审批', 'APPROVE', 2, 'SECTION_LEADER', NULL, '1', '1', 48, '0', 'admin', NOW(), 'admin', NOW(), '科长审批选择班组'),
(12, 3, 'GROUP_LEADER_RECTIFY', '班组长整改', 'APPROVE', 3, 'GROUP_LEADER', NULL, '1', '1', 72, '0', 'admin', NOW(), 'admin', NOW(), '班组长填写整改详情'),
(13, 3, 'SECTION_REVIEW', '科长复审', 'APPROVE', 4, 'SECTION_LEADER', NULL, '1', '1', 48, '0', 'admin', NOW(), 'admin', NOW(), '科长最终审批'),
(14, 3, 'END', '归档', 'END', 5, NULL, NULL, '0', '1', NULL, '0', 'admin', NOW(), 'admin', NOW(), '流程结束归档');

-- 查获上报流程(安检员)节点
INSERT INTO `approval_node_definition` VALUES
(15, 4, 'START', '开始', 'START', 1, NULL, NULL, '0', '1', NULL, '0', 'admin', NOW(), 'admin', NOW(), '安检员提交'),
(16, 4, 'GROUP_LEADER', '班组长审批', 'APPROVE', 2, 'GROUP_LEADER', NULL, '1', '1', 24, '0', 'admin', NOW(), 'admin', NOW(), '班组长审批'),
(17, 4, 'END', '归档', 'END', 3, NULL, NULL, '0', '1', NULL, '0', 'admin', NOW(), 'admin', NOW(), '流程结束归档');

-- 查获上报流程(班组长)节点  
INSERT INTO `approval_node_definition` VALUES
(18, 5, 'START', '开始', 'START', 1, NULL, NULL, '0', '1', NULL, '0', 'admin', NOW(), 'admin', NOW(), '班组长提交'),
(19, 5, 'SECTION_LEADER', '科长审批', 'APPROVE', 2, 'SECTION_LEADER', NULL, '1', '1', 48, '0', 'admin', NOW(), 'admin', NOW(), '科长审批'),
(20, 5, 'END', '归档', 'END', 3, NULL, NULL, '0', '1', NULL, '0', 'admin', NOW(), 'admin', NOW(), '流程结束归档');