+
96
-

回答

要设计一个系统,用户通过分享邀请新用户注册并购买商品后返佣金,MySQL表结构可以设计如下:

1. 用户表(users)

记录每个用户的基本信息,包括邀请人信息。

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(255) NOT NULL,
  email VARCHAR(255) UNIQUE NOT NULL,
  inviter_id INT,  -- 邀请人ID,引用users表中的id
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
id: 用户唯一ID。username: 用户名。email: 用户邮箱。inviter_id: 邀请人ID(可为空,表示没有邀请人)。created_at: 用户注册时间。2. 订单表(orders)

记录用户下的订单信息,关键字段包括下单用户和订单总金额。

CREATE TABLE orders (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT NOT NULL,  -- 下单用户ID,引用users表中的id
  total_amount DECIMAL(10, 2) NOT NULL,  -- 订单总金额
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
id: 订单唯一ID。user_id: 下单的用户ID,关联users表的id。total_amount: 订单总金额。created_at: 订单创建时间。3. 佣金表(commissions)

记录每个用户通过邀请下单获得的佣金情况。

CREATE TABLE commissions (
  id INT AUTO_INCREMENT PRIMARY KEY,
  inviter_id INT NOT NULL,  -- 邀请人ID,引用users表中的id
  invitee_id INT NOT NULL,  -- 被邀请人ID,引用users表中的id
  order_id INT NOT NULL,    -- 被邀请人下的订单ID,引用orders表中的id
  commission_amount DECIMAL(10, 2) NOT NULL,  -- 佣金金额
  status ENUM('pending', 'paid') DEFAULT 'pending',  -- 佣金状态:未结算或已结算
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
id: 佣金记录ID。inviter_id: 邀请人的用户ID。invitee_id: 被邀请人的用户ID。order_id: 被邀请人生成的订单ID,关联orders表的id。commission_amount: 佣金金额,通常根据订单金额的百分比计算。status: 佣金状态,pending表示等待支付,paid表示已经支付。created_at: 佣金记录生成时间。4. 结算记录表(commission_payouts)

记录佣金结算的情况。

CREATE TABLE commission_payouts (
  id INT AUTO_INCREMENT PRIMARY KEY,
  inviter_id INT NOT NULL,  -- 邀请人ID,引用users表中的id
  total_commission DECIMAL(10, 2) NOT NULL,  -- 结算总金额
  payout_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP  -- 结算时间
);
id: 结算记录ID。inviter_id: 结算给邀请人的用户ID。total_commission: 结算给邀请人的总佣金金额。payout_date: 佣金支付日期。5. 佣金计算逻辑

假设邀请奖励是订单金额的 5%,可以在订单生成时,自动计算佣金并插入到佣金表中。

function processCommission($invitee_id, $order_id, $total_amount) {
    // 连接数据库
    $conn = new mysqli("localhost", "username", "password", "database");

    // 查找被邀请人的邀请人ID
    $sql = "SELECT inviter_id FROM users WHERE id = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("i", $invitee_id);
    $stmt->execute();
    $result = $stmt->get_result();
    if ($result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $inviter_id = $row['inviter_id'];

        if ($inviter_id) {
            // 计算佣金 (5% 的订单总金额)
            $commission_amount = $total_amount * 0.05;

            // 插入佣金记录
            $sql = "INSERT INTO commissions (inviter_id, invitee_id, order_id, commission_amount, status) VALUES (?, ?, ?, ?, 'pending')";
            $stmt = $conn->prepare($sql);
            $stmt->bind_param("iiid", $inviter_id, $invitee_id, $order_id, $commission_amount);
            $stmt->execute();
        }
    }

    $stmt->close();
    $conn->close();
}
6. 结算佣金

可以定期执行批量支付佣金(例如每月结算一次),并将相应佣金状态标记为已支付。

function settleCommissions($inviter_id) {
    // 连接数据库
    $conn = new mysqli("localhost", "username", "password", "database");

    // 获取邀请人所有待支付的佣金
    $sql = "SELECT SUM(commission_amount) AS total_commission FROM commissions WHERE inviter_id = ? AND status = 'pending'";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("i", $inviter_id);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    $total_commission = $row['total_commission'];

    if ($total_commission > 0) {
        // 插入结算记录
        $sql = "INSERT INTO commission_payouts (inviter_id, total_commission) VALUES (?, ?)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("id", $inviter_id, $total_commission);
        $stmt->execute();

        // 更新佣金状态为已支付
        $sql = "UPDATE commissions SET status = 'paid' WHERE inviter_id = ? AND status = 'pending'";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("i", $inviter_id);
        $stmt->execute();
    }

    $stmt->close();
    $conn->close();
}

这样一个系统可以记录用户邀请信息、生成佣金、并支持定期结算佣金。

网友回复

我知道答案,我要回答