如何设计退款 MySQL

问题描述

在一个电子商务平台中,用户可以购买商品并进行退款。每个订单包含多个商品,用户可以选择退款其中的某些商品或者全部商品。需要设计一个 MySQL 数据库来记录订单和退款信息,并提供相应的操作接口。

数据库设计

订单表 (orders)

字段名 类型 描述
id int 订单ID
user_id int 用户ID
create_time datetime 订单创建时间
status enum('paid', 'refunded', 'canceled') 订单状态
total_price decimal(10,2) 订单总价

商品表 (products)

字段名 类型 描述
id int 商品ID
name varchar(100) 商品名称
price decimal(10,2) 商品价格

订单商品表 (order_products)

字段名 类型 描述
order_id int 订单ID
product_id int 商品ID
quantity int 商品数量

退款表 (refunds)

字段名 类型 描述
id int 退款ID
order_id int 订单ID
product_id int 商品ID
quantity int 退款数量
create_time datetime 退款创建时间
status enum('pending', 'approved', 'rejected') 退款状态
reason varchar(200) 退款原因

数据库操作接口

创建订单

INSERT INTO orders (user_id, create_time, status, total_price)
VALUES (1, NOW(), 'paid', 100.00);

添加订单商品

INSERT INTO order_products (order_id, product_id, quantity)
VALUES (1, 1, 2);

查询订单详情

SELECT o.id, o.create_time, o.status, o.total_price,
       p.name, p.price, op.quantity
FROM orders o
JOIN order_products op ON o.id = op.order_id
JOIN products p ON op.product_id = p.id
WHERE o.id = 1;

创建退款请求

INSERT INTO refunds (order_id, product_id, quantity, create_time, status, reason)
VALUES (1, 1, 1, NOW(), 'pending', '商品质量问题');

查询退款请求详情

SELECT r.id, r.create_time, r.status, r.reason,
       o.create_time AS order_create_time,
       p.name, p.price, r.quantity
FROM refunds r
JOIN orders o ON r.order_id = o.id
JOIN products p ON r.product_id = p.id
WHERE r.id = 1;

审批退款请求

UPDATE refunds
SET status = 'approved'
WHERE id = 1;

拒绝退款请求

UPDATE refunds
SET status = 'rejected'
WHERE id = 1;

流程图

flowchart TD
    A[创建订单] --> B[添加订单商品]
    B --> C[查询订单详情]
    C --> D{用户是否申请退款}
    D -- 是 --> E[创建退款请求]
    E --> F[查询退款请求详情]
    F --> G{管理员是否审批退款}
    G -- 是 --> H[审批退款请求]
    G -- 否 --> I[拒绝退款请求]
    H --> J[退款完成]
    I --> J
    J --> K[流程结束]

甘特图

gantt
    title 退款流程甘特图
    dateFormat  YYYY-MM-DD
    section 订单流程
    创建订单          :done, 2022-01-01, 1d
    添加订单商品      :done, 2022-01-01, 1d
    查询订单详情      :done, 2022-01-02, 1d
    section 退款流程
    创建退款请求      :done, 2022-01-02, 1d
    查询退款请求详情  :done, 2022-01-03, 1d
    审批退款请求      :done, 2022-01