当前位置:首页 > PHP

php实现订单状态

2026-01-28 22:15:17PHP

订单状态的基本设计

在PHP中实现订单状态管理,通常需要结合数据库设计和状态机逻辑。订单状态通常包括待支付、已支付、已发货、已完成、已取消等。

数据库表设计示例:

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    order_number VARCHAR(50),
    total_amount DECIMAL(10,2),
    status ENUM('pending', 'paid', 'shipped', 'completed', 'cancelled') DEFAULT 'pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

状态变更方法实现

创建订单状态处理类,封装状态变更逻辑:

php实现订单状态

class OrderStatus {
    private $orderId;
    private $db;

    public function __construct($orderId, $dbConnection) {
        $this->orderId = $orderId;
        $this->db = $dbConnection;
    }

    public function pay() {
        $this->updateStatus('paid');
    }

    public function ship() {
        $this->updateStatus('shipped');
    }

    public function complete() {
        $this->updateStatus('completed');
    }

    public function cancel() {
        $this->updateStatus('cancelled');
    }

    private function updateStatus($newStatus) {
        $stmt = $this->db->prepare("UPDATE orders SET status = ? WHERE id = ?");
        $stmt->execute([$newStatus, $this->orderId]);
    }
}

状态机验证逻辑

添加状态转换验证,确保只有合法的状态变更才能执行:

private $allowedTransitions = [
    'pending' => ['paid', 'cancelled'],
    'paid' => ['shipped', 'cancelled'],
    'shipped' => ['completed'],
    'completed' => [],
    'cancelled' => []
];

private function updateStatus($newStatus) {
    $currentStatus = $this->getCurrentStatus();

    if (!in_array($newStatus, $this->allowedTransitions[$currentStatus])) {
        throw new Exception("Invalid status transition from $currentStatus to $newStatus");
    }

    $stmt = $this->db->prepare("UPDATE orders SET status = ? WHERE id = ?");
    $stmt->execute([$newStatus, $this->orderId]);
}

private function getCurrentStatus() {
    $stmt = $this->db->prepare("SELECT status FROM orders WHERE id = ?");
    $stmt->execute([$this->orderId]);
    return $stmt->fetchColumn();
}

订单状态历史记录

创建订单状态变更历史表,记录所有状态变更:

php实现订单状态

CREATE TABLE order_status_history (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT,
    from_status VARCHAR(20),
    to_status VARCHAR(20),
    changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    changed_by INT,
    FOREIGN KEY (order_id) REFERENCES orders(id)
);

更新状态变更方法,同时记录历史:

private function updateStatus($newStatus) {
    $currentStatus = $this->getCurrentStatus();

    if (!in_array($newStatus, $this->allowedTransitions[$currentStatus])) {
        throw new Exception("Invalid status transition from $currentStatus to $newStatus");
    }

    $this->db->beginTransaction();
    try {
        $stmt = $this->db->prepare("UPDATE orders SET status = ? WHERE id = ?");
        $stmt->execute([$newStatus, $this->orderId]);

        $historyStmt = $this->db->prepare("
            INSERT INTO order_status_history 
            (order_id, from_status, to_status, changed_by) 
            VALUES (?, ?, ?, ?)
        ");
        $historyStmt->execute([
            $this->orderId, 
            $currentStatus, 
            $newStatus,
            $_SESSION['user_id'] ?? null
        ]);

        $this->db->commit();
    } catch (Exception $e) {
        $this->db->rollBack();
        throw $e;
    }
}

状态变更事件处理

使用观察者模式处理状态变更后的相关操作:

class OrderStatusNotifier {
    private $observers = [];

    public function attach(OrderStatusObserver $observer) {
        $this->observers[] = $observer;
    }

    public function notify($orderId, $fromStatus, $toStatus) {
        foreach ($this->observers as $observer) {
            $observer->update($orderId, $fromStatus, $toStatus);
        }
    }
}

interface OrderStatusObserver {
    public function update($orderId, $fromStatus, $toStatus);
}

class EmailNotification implements OrderStatusObserver {
    public function update($orderId, $fromStatus, $toStatus) {
        if ($toStatus === 'shipped') {
            // 发送发货通知邮件
        }
    }
}

标签: 订单状态
分享给朋友:

相关文章

vue实现不同状态

vue实现不同状态

Vue 实现不同状态的方法 使用计算属性(Computed Properties) 计算属性适合处理依赖其他状态变化的派生状态。计算属性会缓存结果,只在依赖变化时重新计算。 data() {…

点菜订单实现vue

点菜订单实现vue

实现点菜订单功能的Vue组件 创建基于Vue的点菜订单系统需要构建几个关键组件,包括菜单展示、购物车和订单提交功能。 菜单展示组件 使用v-for循环渲染菜品列表,每个菜品包含图片、名称、价格和加…

vue实现订单折扣功能

vue实现订单折扣功能

实现订单折扣功能的基本思路 在Vue中实现订单折扣功能通常需要结合前端计算和后端验证。前端负责实时展示折扣后的价格,后端确保折扣逻辑的安全性和准确性。 数据模型设计 订单数据通常包含以下字段: o…

vue循环状态实现

vue循环状态实现

vue循环状态实现 在Vue中实现循环状态管理,通常涉及v-for指令、响应式数据更新以及状态管理工具(如Vuex或Pinia)。以下是几种常见场景的实现方法: 使用v-for渲染列表 通过v-f…

vue订单功能怎么实现

vue订单功能怎么实现

实现Vue订单功能的基本方法 搭建Vue项目结构 使用Vue CLI或Vite创建项目,安装Vue Router和Vuex(或Pinia)进行状态管理。订单功能通常需要后端API支持,安装axios进…

vue怎么实现多选状态

vue怎么实现多选状态

Vue 实现多选状态的方法 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动收集多选的值。适用于复选框组或多选下拉框。 <template> <di…