当前位置:首页 > 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);
}

权限控制

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

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实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (in…

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n!…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Rat…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…