当前位置:首页 > PHP

php审批怎么实现

2026-02-15 22:43:44PHP

实现 PHP 审批功能的方法

数据库设计

创建一个审批流程相关的数据库表结构,通常包括审批记录表、审批流程表、审批节点表等。例如:

CREATE TABLE approval_records (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    content TEXT,
    status ENUM('pending', 'approved', 'rejected') DEFAULT 'pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE approval_steps (
    id INT AUTO_INCREMENT PRIMARY KEY,
    record_id INT,
    approver_id INT,
    step_order INT,
    status ENUM('pending', 'approved', 'rejected') DEFAULT 'pending',
    comments TEXT,
    updated_at TIMESTAMP
);

提交审批请求

用户提交需要审批的内容时,将数据插入数据库并初始化审批流程:

function submitApproval($userId, $content) {
    $db = new PDO('mysql:host=localhost;dbname=approval_system', 'username', 'password');
    $stmt = $db->prepare("INSERT INTO approval_records (user_id, content) VALUES (?, ?)");
    $stmt->execute([$userId, $content]);
    $recordId = $db->lastInsertId();

    // 初始化审批流程步骤
    $approvers = [2, 3, 4]; // 审批人ID数组
    foreach ($approvers as $order => $approverId) {
        $stmt = $db->prepare("INSERT INTO approval_steps (record_id, approver_id, step_order) VALUES (?, ?, ?)");
        $stmt->execute([$recordId, $approverId, $order + 1]);
    }
    return $recordId;
}

审批处理

审批人处理待审批请求时更新状态:

function processApproval($stepId, $approverId, $status, $comments = '') {
    $db = new PDO('mysql:host=localhost;dbname=approval_system', 'username', 'password');

    // 更新当前步骤状态
    $stmt = $db->prepare("UPDATE approval_steps SET status = ?, comments = ?, updated_at = NOW() WHERE id = ? AND approver_id = ?");
    $stmt->execute([$status, $comments, $stepId, $approverId]);

    // 如果拒绝,直接结束流程
    if ($status === 'rejected') {
        $stmt = $db->prepare("SELECT record_id FROM approval_steps WHERE id = ?");
        $stmt->execute([$stepId]);
        $recordId = $stmt->fetchColumn();

        $stmt = $db->prepare("UPDATE approval_records SET status = 'rejected' WHERE id = ?");
        $stmt->execute([$recordId]);
    }

    // 如果是最后一步且通过,更新主记录状态
    if ($status === 'approved') {
        $stmt = $db->prepare("SELECT record_id FROM approval_steps WHERE id = ?");
        $stmt->execute([$stepId]);
        $recordId = $stmt->fetchColumn();

        $stmt = $db->prepare("SELECT MAX(step_order) FROM approval_steps WHERE record_id = ?");
        $stmt->execute([$recordId]);
        $maxOrder = $stmt->fetchColumn();

        $stmt = $db->prepare("SELECT step_order FROM approval_steps WHERE id = ?");
        $stmt->execute([$stepId]);
        $currentOrder = $stmt->fetchColumn();

        if ($currentOrder == $maxOrder) {
            $stmt = $db->prepare("UPDATE approval_records SET status = 'approved' WHERE id = ?");
            $stmt->execute([$recordId]);
        }
    }
}

审批状态查询

提供接口查询审批状态和进度:

function getApprovalStatus($recordId) {
    $db = new PDO('mysql:host=localhost;dbname=approval_system', 'username', 'password');

    $stmt = $db->prepare("SELECT status FROM approval_records WHERE id = ?");
    $stmt->execute([$recordId]);
    $recordStatus = $stmt->fetchColumn();

    $stmt = $db->prepare("SELECT approver_id, status, comments, updated_at FROM approval_steps WHERE record_id = ? ORDER BY step_order");
    $stmt->execute([$recordId]);
    $steps = $stmt->fetchAll(PDO::FETCH_ASSOC);

    return [
        'record_status' => $recordStatus,
        'steps' => $steps
    ];
}

通知功能

可以通过邮件或站内信通知审批人:

function notifyApprover($approverId, $recordId) {
    // 获取审批人邮箱
    $db = new PDO('mysql:host=localhost;dbname=approval_system', 'username', 'password');
    $stmt = $db->prepare("SELECT email FROM users WHERE id = ?");
    $stmt->execute([$approverId]);
    $email = $stmt->fetchColumn();

    // 发送邮件
    $subject = "新的审批请求待处理";
    $message = "您有一个新的审批请求需要处理,记录ID: $recordId";
    mail($email, $subject, $message);
}

权限控制

确保只有相关审批人能处理对应审批:

php审批怎么实现

function checkApprovalPermission($userId, $stepId) {
    $db = new PDO('mysql:host=localhost;dbname=approval_system', 'username', 'password');
    $stmt = $db->prepare("SELECT COUNT(*) FROM approval_steps WHERE id = ? AND approver_id = ? AND status = 'pending'");
    $stmt->execute([$stepId, $userId]);
    return $stmt->fetchColumn() > 0;
}

标签: php
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP实现打印功能的方法 在PHP中实现打印功能可以通过多种方式完成,包括直接输出到浏览器、生成PDF文件、调用打印机接口等。以下是几种常见的方法: 直接输出HTML内容 PHP可以通过echo或p…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php实现上传图片

php实现上传图片

上传图片的基本流程 PHP 实现图片上传功能需要处理文件接收、验证、保存等步骤。以下是具体实现方法。 创建 HTML 表单 在 HTML 中创建一个表单,设置 enctype="multipart/…

php 无限分类的实现

php 无限分类的实现

无限分类的实现方法 无限分类通常用于构建树形结构数据,如商品分类、多级菜单等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 邻接列表是最简单的实现方式,通过在每个节点中存…

php实现秒杀

php实现秒杀

PHP实现秒杀功能的关键技术 秒杀系统需要解决高并发、数据一致性、系统稳定性等问题。以下是PHP实现秒杀功能的核心技术方案: 数据库优化 使用InnoDB引擎的行级锁和事务特性,确保数据一致性。商品…