php实现提醒发货
实现提醒发货功能的方法
数据库设计
创建一个订单表(orders)和一个发货提醒表(shipment_reminders)。订单表包含订单状态字段,发货提醒表记录需要提醒的订单和提醒时间。
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
order_date DATETIME,
status VARCHAR(20), -- 如 'pending', 'shipped'
-- 其他订单字段
);
CREATE TABLE shipment_reminders (
id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT,
remind_date DATETIME,
is_sent BOOLEAN DEFAULT FALSE,
FOREIGN KEY (order_id) REFERENCES orders(id)
);
设置提醒逻辑
当订单状态更新为准备发货时,向提醒表中插入记录。可以设置提醒时间为当前时间加上特定间隔(如24小时)。
function scheduleReminder($orderId) {
$remindDate = date('Y-m-d H:i:s', strtotime('+24 hours'));
$query = "INSERT INTO shipment_reminders (order_id, remind_date) VALUES (?, ?)";
$stmt = $pdo->prepare($query);
$stmt->execute([$orderId, $remindDate]);
}
定时任务检查
创建定时任务(Cron Job)每分钟检查需要发送的提醒。使用PHP CLI脚本或框架的任务调度功能。
function checkPendingReminders() {
$currentTime = date('Y-m-d H:i:s');
$query = "SELECT r.id, o.id as order_id, o.customer_id
FROM shipment_reminders r
JOIN orders o ON r.order_id = o.id
WHERE r.remind_date <= ? AND r.is_sent = FALSE";
$stmt = $pdo->prepare($query);
$stmt->execute([$currentTime]);
return $stmt->fetchAll();
}
发送提醒通知
对于每个找到的提醒记录,发送邮件或短信通知,并标记为已发送。
function sendReminder($reminderId, $orderId, $customerId) {
// 获取客户联系方式
$customer = getCustomerById($customerId);
// 发送邮件示例
$subject = "您的订单即将发货";
$message = "订单 #$orderId 将在24小时内发货,请做好准备。";
mail($customer['email'], $subject, $message);
// 更新提醒状态
$query = "UPDATE shipment_reminders SET is_sent = TRUE WHERE id = ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$reminderId]);
}
前端集成
在订单管理界面添加手动提醒按钮,供管理员直接触发提醒。
<button onclick="sendReminder(<?= $orderId ?>)" class="btn btn-warning">
发送发货提醒
</button>
<script>
function sendReminder(orderId) {
fetch('/api/send-reminder.php?order_id=' + orderId)
.then(response => response.json())
.then(data => alert(data.message));
}
</script>
安全性考虑
验证管理员权限和订单所有权,防止未授权访问。所有数据库查询使用预处理语句防止SQL注入。
function validateOrderAccess($orderId, $userId) {
$query = "SELECT id FROM orders WHERE id = ? AND customer_id = ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$orderId, $userId]);
return $stmt->rowCount() > 0;
}






