php审批怎么实现
实现 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;
}






