如何设计退款 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