主题
CatchShop 订单模块数据字典
数据表概览
CatchShop 商城订单模块包含 6 个核心数据表:
| 表名 | 中文名称 | 用途 |
|---|---|---|
shop_orders | 订单主表 | 存储订单基础信息 |
shop_order_items | 订单商品表 | 存储订单中的商品明细 |
shop_order_addresses | 订单地址表 | 存储订单收货地址信息 |
shop_order_refunds | 订单退款表 | 存储退款申请信息 |
shop_order_refund_addresses | 退货地址表 | 存储退货收货地址 |
shop_order_refund_images | 退款图片表 | 存储退款凭证图片 |
1. shop_orders - 订单主表
表说明:存储订单的核心信息,包括订单号、用户、金额、支付、物流等所有主要字段。
| 字段名 | 类型 | 长度 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|---|
id | bigint unsigned | - | 是 | - | 订单 ID(主键,自增) |
order_no | char | 25 | 是 | - | 订单号 |
user_id | bigint unsigned | - | 是 | - | 用户 ID |
total_amount | int unsigned | - | 是 | 0 | 商品总金额(不含优惠折扣,单位:分) |
order_amount | int unsigned | - | 是 | 0 | 订单金额(含优惠折扣,单位:分) |
coupon_id | bigint unsigned | - | 否 | NULL | 优惠券 ID |
coupon_amount | int unsigned | - | 是 | 0 | 优惠券抵扣金额(单位:分) |
points_amount | int unsigned | - | 是 | 0 | 积分抵扣金额(单位:分) |
points_count | int unsigned | - | 是 | 0 | 积分抵扣数量 |
shipping_amount | int unsigned | - | 是 | 0 | 运费金额(单位:分) |
pay_amount | int unsigned | - | 是 | 0 | 实际付款金额(包含运费,单位:分) |
adjustment_amount | int | - | 是 | 0 | 后台修改的订单金额(差价,单位:分) |
pay_type | tinyint unsigned | - | 是 | 1 | 支付方式:1=余额支付,2=微信支付,3=支付宝支付,4=积分支付 |
pay_status | tinyint unsigned | - | 是 | 1 | 付款状态:1=未付款,2=已付款,3=支付失败 |
pay_at | int unsigned | - | 是 | 0 | 付款时间戳 |
out_trade_no | varchar | 64 | 否 | NULL | 第三方支付交易号 |
delivery_type | tinyint unsigned | - | 是 | 1 | 配送方式:1=快递配送,2=自提 |
express_id | bigint unsigned | - | 否 | NULL | 物流公司 ID |
express_company | varchar | 50 | 否 | NULL | 物流公司名称 |
express_no | varchar | 50 | 否 | NULL | 物流单号 |
delivery_status | tinyint unsigned | - | 是 | 1 | 发货状态:1=未发货,2=已发货 |
delivery_at | int unsigned | - | 是 | 0 | 发货时间戳 |
receipt_status | tinyint unsigned | - | 是 | 1 | 收货状态:1=未收货,2=已收货 |
receipt_at | int unsigned | - | 是 | 0 | 收货时间戳 |
order_status | tinyint unsigned | - | 是 | 1 | 订单状态:1=待付款,2=待发货,3=待收货,4=已完成,5=已取消 |
order_source | tinyint unsigned | - | 是 | 1 | 订单来源:1=普通订单,2=秒杀订单,3=拼团订单,4=积分订单 |
order_source_id | bigint unsigned | - | 否 | NULL | 来源记录 ID |
buyer_remark | text | - | 否 | NULL | 买家留言 |
points_reward | int unsigned | - | 是 | 0 | 赠送的积分数量 |
is_settled | tinyint unsigned | - | 是 | 0 | 订单是否已结算:0=未结算,1=已结算 |
is_commented | tinyint unsigned | - | 是 | 0 | 是否已评价:0=否,1=是 |
created_at | timestamp | - | 否 | NULL | 创建时间 |
updated_at | timestamp | - | 否 | NULL | 更新时间 |
deleted_at | timestamp | - | 否 | NULL | 软删除时间 |
索引信息:
- PRIMARY KEY (
id) - UNIQUE KEY
uk_order_no(order_no) - INDEX
idx_user_id(user_id)
关联关系:
user_id→users.id(用户基础信息)coupon_id→coupons.id(优惠券信息)
支付方式枚举:
1- 余额支付2- 微信支付3- 支付宝支付4- 积分支付
订单状态枚举:
1- 待付款2- 已付款3- 已发货4- 已完成5- 已取消
订单来源枚举:
1- 普通订单2- 秒杀订单3- 积分订单4- 拼团订单
2. shop_order_items - 订单商品表
表说明:存储订单中每个商品的详细信息,包括商品快照、价格、数量等。
| 字段名 | 类型 | 长度 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|---|
id | bigint unsigned | - | 是 | - | 主键 ID(自增) |
order_id | bigint unsigned | - | 是 | - | 订单 ID |
user_id | bigint unsigned | - | 是 | - | 用户 ID |
product_id | bigint unsigned | - | 是 | - | 商品 ID |
sku_id | bigint unsigned | - | 否 | NULL | SKU ID |
product_name | varchar | 255 | 是 | - | 商品名称 |
product_no | varchar | 100 | 否 | NULL | 商品编码 |
image_id | bigint unsigned | - | 否 | NULL | 商品封面图 ID |
product_image | varchar | 500 | 否 | NULL | 商品封面图 URL |
product_content | longtext | - | 否 | NULL | 商品详情快照 |
deduct_stock_type | tinyint unsigned | - | 是 | 2 | 库存计算方式:1=下单减库存,2=付款减库存 |
spec_type | tinyint unsigned | - | 是 | 1 | 规格类型:1=单规格,2=多规格 |
sku_no | varchar | 255 | 否 | NULL | 商品 SKU 唯一标识 |
sku_name | varchar | 500 | 否 | NULL | SKU 规格名称 |
sku_attrs | json | - | 否 | NULL | SKU 的规格属性(JSON 格式) |
product_weight | decimal unsigned | 8,2 | 是 | 0.00 | 商品重量(Kg) |
product_price | int unsigned | - | 是 | 0 | 商品价格(单价,单位:分) |
line_price | int unsigned | - | 是 | 0 | 商品划线价(单位:分) |
is_member_discount | tinyint unsigned | - | 是 | 0 | 是否存在会员等级折扣:0=否,1=是 |
member_discount_ratio | tinyint unsigned | - | 是 | 0 | 会员折扣比例(0-100) |
member_price | int unsigned | - | 是 | 0 | 会员折扣的商品单价(单位:分) |
member_discount_amount | int unsigned | - | 是 | 0 | 会员折扣的总额差(单位:分) |
coupon_amount | int unsigned | - | 是 | 0 | 优惠券折扣金额(单位:分) |
points_amount | int unsigned | - | 是 | 0 | 积分抵扣金额(单位:分) |
points_count | int unsigned | - | 是 | 0 | 积分抵扣数量 |
points_reward | int unsigned | - | 是 | 0 | 赠送的积分数量 |
quantity | int unsigned | - | 是 | 0 | 购买数量 |
total_amount | int unsigned | - | 是 | 0 | 商品总价(数量 × 单价,单位:分) |
pay_amount | int unsigned | - | 是 | 0 | 实际付款价(折扣和优惠后,单位:分) |
order_source | tinyint unsigned | - | 是 | 1 | 订单来源:1=普通订单,2=秒杀订单,3=拼团订单,4=积分订单 |
is_commented | tinyint unsigned | - | 是 | 0 | 是否已评价:0=否,1=是 |
created_at | timestamp | - | 否 | NULL | 创建时间 |
updated_at | timestamp | - | 否 | NULL | 更新时间 |
deleted_at | timestamp | - | 否 | NULL | 软删除时间 |
索引信息:
- PRIMARY KEY (
id) - INDEX
idx_order_id(order_id)
关联关系:
order_id→shop_orders.id(订单主表)user_id→users.id(用户表)product_id→shop_products.id(商品表)sku_id→shop_product_sku.id(SKU 表)
3. shop_order_addresses - 订单地址表
表说明:存储订单的收货地址信息,保存下单时的地址快照。
| 字段名 | 类型 | 长度 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|---|
id | bigint unsigned | - | 是 | - | 地址 ID(主键,自增) |
order_id | bigint unsigned | - | 是 | - | 订单 ID |
user_id | bigint unsigned | - | 是 | - | 用户 ID |
recipient_name | varchar | 30 | 是 | - | 收货人姓名 |
recipient_phone | varchar | 20 | 是 | - | 联系电话 |
province_id | bigint unsigned | - | 是 | - | 省份 ID |
city_id | bigint unsigned | - | 是 | - | 城市 ID |
district_id | bigint unsigned | - | 是 | - | 区/县 ID |
province_name | varchar | 50 | 是 | - | 省份名称 |
city_name | varchar | 50 | 是 | - | 城市名称 |
district_name | varchar | 50 | 是 | - | 区/县名称 |
detail_address | varchar | 255 | 是 | - | 详细地址 |
full_address | varchar | 500 | 是 | - | 完整地址 |
created_at | timestamp | - | 否 | NULL | 创建时间 |
updated_at | timestamp | - | 否 | NULL | 更新时间 |
deleted_at | timestamp | - | 否 | NULL | 软删除时间 |
索引信息:
- PRIMARY KEY (
id) - UNIQUE KEY
uk_order_id(order_id)
关联关系:
order_id→shop_orders.id(订单主表)user_id→users.id(用户表)
4. shop_order_refunds - 订单退款表
表说明:存储订单退款申请信息,包括退款原因、金额、状态等。
| 字段名 | 类型 | 长度 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|---|
id | bigint unsigned | - | 是 | - | 售后单 ID(主键,自增) |
refund_no | char | 25 | 是 | - | 售后单号 |
order_id | bigint unsigned | - | 是 | - | 订单 ID |
order_item_id | bigint unsigned | - | 否 | NULL | 订单商品 ID(整单退款时为空) |
user_id | bigint unsigned | - | 是 | - | 用户 ID |
refund_type | tinyint unsigned | - | 是 | - | 售后类型:1=仅退款,2=退货退款,3=换货 |
refund_reason | varchar | 1000 | 是 | - | 用户申请原因(说明) |
audit_status | tinyint unsigned | - | 是 | 0 | 商家审核状态:0=待审核,1=已同意,2=已拒绝 |
audit_time | int unsigned | - | 是 | 0 | 审核时间 |
audit_user_id | bigint unsigned | - | 否 | NULL | 审核人员 ID |
refuse_reason | varchar | 1000 | 否 | NULL | 商家拒绝原因(说明) |
refund_amount | int unsigned | - | 是 | 0 | 申请退款金额(单位:分) |
actual_refund_amount | int unsigned | - | 是 | 0 | 实际退款金额(单位:分) |
is_user_shipped | tinyint unsigned | - | 是 | 0 | 用户是否发货:0=未发货,1=已发货 |
user_ship_time | int unsigned | - | 是 | 0 | 用户发货时间 |
user_express_company | varchar | 50 | 否 | NULL | 用户发货物流公司 |
user_express_no | varchar | 50 | 否 | NULL | 用户发货物流单号 |
is_merchant_received | tinyint unsigned | - | 是 | 0 | 商家收货状态:0=未收货,1=已收货 |
merchant_receive_time | int unsigned | - | 是 | 0 | 商家收货时间 |
is_merchant_shipped | tinyint unsigned | - | 是 | 0 | 商家是否重新发货:0=未发货,1=已发货 |
merchant_ship_time | int unsigned | - | 是 | 0 | 商家发货时间 |
merchant_express_company | varchar | 50 | 否 | NULL | 商家发货物流公司 |
merchant_express_no | varchar | 50 | 否 | NULL | 商家发货物流单号 |
refund_status | tinyint unsigned | - | 是 | 1 | 售后单状态:1=进行中,2=已同意,3=已拒绝,4=已完成,5=已取消 |
created_at | timestamp | - | 否 | NULL | 创建时间 |
updated_at | timestamp | - | 否 | NULL | 更新时间 |
completed_at | int unsigned | - | 是 | 0 | 完成时间 |
deleted_at | timestamp | - | 否 | NULL | 软删除时间 |
索引信息:
- PRIMARY KEY (
id) - INDEX
idx_order_id(order_id) - INDEX
idx_user_id(user_id)
关联关系:
order_id→shop_orders.id(订单主表)order_item_id→shop_order_items.id(订单商品表)user_id→users.id(用户表)
退款类型枚举:
1- 仅退款2- 退货退款
退款状态枚举:
1- 申请中2- 已同意3- 已拒绝4- 已退款
5. shop_order_refund_addresses - 退货地址表
表说明:存储退货时的收货地址信息。
| 字段名 | 类型 | 长度 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|---|
id | bigint unsigned | - | 是 | - | 主键 ID(自增) |
order_refund_id | bigint unsigned | - | 是 | - | 售后单 ID |
recipient_name | varchar | 30 | 是 | - | 收货人姓名 |
recipient_phone | varchar | 20 | 是 | - | 联系电话 |
province_id | bigint unsigned | - | 是 | - | 所在省份 ID |
city_id | bigint unsigned | - | 是 | - | 所在城市 ID |
district_id | bigint unsigned | - | 是 | - | 所在区/县 ID |
province_name | varchar | 50 | 是 | - | 省份名称 |
city_name | varchar | 50 | 是 | - | 城市名称 |
district_name | varchar | 50 | 是 | - | 区/县名称 |
detail_address | varchar | 255 | 是 | - | 详细地址 |
full_address | varchar | 500 | 是 | - | 完整地址 |
created_at | timestamp | - | 否 | NULL | 创建时间 |
updated_at | timestamp | - | 否 | NULL | 更新时间 |
deleted_at | timestamp | - | 否 | NULL | 软删除时间 |
索引信息:
- PRIMARY KEY (
id) - UNIQUE KEY
uk_order_refund_id(order_refund_id)
关联关系:
refund_id→shop_order_refunds.id(退款申请表)
6. shop_order_refund_images - 退款图片表
表说明:存储退款申请时上传的凭证图片。
| 字段名 | 类型 | 长度 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|---|
id | bigint unsigned | - | 是 | - | 主键 ID(自增) |
order_refund_id | bigint unsigned | - | 是 | - | 售后单 ID |
image_path | varchar | 500 | 是 | - | 图片路径 |
image_name | varchar | 255 | 否 | NULL | 图片原始名称 |
image_size | int unsigned | - | 是 | 0 | 图片大小(字节) |
image_type | varchar | 20 | 否 | NULL | 图片类型(jpg,png,gif 等) |
sort | tinyint unsigned | - | 是 | 0 | 排序 |
created_at | timestamp | - | 否 | NULL | 创建时间 |
updated_at | timestamp | - | 否 | NULL | 更新时间 |
deleted_at | timestamp | - | 否 | NULL | 软删除时间 |
索引信息:
- PRIMARY KEY (
id) - INDEX
idx_order_refund_id(order_refund_id)
关联关系:
order_refund_id→shop_order_refunds.id(售后单记录表)
业务规则说明
订单创建规则
- 订单号唯一性:订单号全局唯一,格式为 T + 时间戳 + 随机数
- 金额一致性:各个金额字段必须满足计算关系
- 库存扣减:根据
deduct_stock_type决定扣库存时机 - 地址快照:订单创建时保存地址快照,后续地址变更不影响订单
支付处理规则
- 支付状态流转:未付款 → 已付款 → 支付失败(可逆)
- 支付金额校验:支付金额必须等于订单实付金额
- 重复支付防护:已支付订单不能重复支付
- 支付超时:未付款订单超时自动取消
物流管理规则
- 发货条件:订单必须已付款才能发货
- 物流信息:发货时必须填写快递公司和快递单号
- 收货确认:用户确认收货或系统自动确认收货
- 虚拟商品:虚拟商品无需物流,直接完成
售后处理规则
- 申请条件:已付款订单才能申请售后
- 退款金额:不能超过实际支付金额
- 退货地址:退货退款必须填写退货地址
- 状态流转:申请中 → 已同意/已拒绝 → 已退款
数据一致性规则
- 订单总价:订单商品总价 = 所有商品明细总价之和
- 实付金额:实付金额 = 订单金额 + 运费 - 各种优惠
- 积分使用:积分抵扣数量和金额必须符合兑换比例
- 库存同步:订单创建/取消时必须同步更新商品库存
枚举类定义
订单模块使用了多个枚举类来标准化状态值,位于 modules/Shop/Enums/Order/ 目录:
OrderStatus - 订单状态
php
enum OrderStatus: int
{
case PENDING_PAYMENT = 1; // 待付款
case PENDING_DELIVERY = 2; // 待发货
case PENDING_RECEIPT = 3; // 待收货
case COMPLETED = 4; // 已完成
case CANCELLED = 5; // 已取消
}OrderSource - 订单来源
php
enum OrderSource: int
{
case NORMAL = 1; // 普通订单
case SECKILL = 2; // 秒杀订单
case GROUP_BUY = 3; // 拼团订单
case POINTS = 4; // 积分订单
}PayStatus - 支付状态
php
enum PayStatus: int
{
case PENDING = 1; // 未付款
case PAID = 2; // 已付款
case FAILED = 3; // 支付失败
}PayType - 支付方式
php
enum PayType: int
{
case BALANCE = 1; // 余额支付
case WECHAT = 2; // 微信支付
case ALIPAY = 3; // 支付宝支付
case POINTS = 4; // 积分支付
}DeliveryStatus - 发货状态
php
enum DeliveryStatus: int
{
case NOT_SHIPPED = 1; // 未发货
case SHIPPED = 2; // 已发货
}DeliveryType - 配送方式
php
enum DeliveryType: int
{
case EXPRESS = 1; // 快递配送
case PICKUP = 2; // 自提
}ReceiptStatus - 收货状态
php
enum ReceiptStatus: int
{
case NOT_RECEIVED = 1; // 未收货
case RECEIVED = 2; // 已收货
}RefundStatus - 退款状态
php
enum RefundStatus: int
{
case IN_PROGRESS = 1; // 进行中
case APPROVED = 2; // 已同意
case REJECTED = 3; // 已拒绝
case COMPLETED = 4; // 已完成
case CANCELLED = 5; // 已取消
}RefundType - 退款类型
php
enum RefundType: int
{
case REFUND_ONLY = 1; // 仅退款
case RETURN_REFUND = 2; // 退货退款
case EXCHANGE = 3; // 换货
}AuditStatus - 审核状态
php
enum AuditStatus: int
{
case PENDING = 0; // 待审核
case APPROVED = 1; // 已同意
case REJECTED = 2; // 已拒绝
}枚举使用示例
php
// 在 Repository 中使用枚举
class OrderRepository extends Repository
{
public function findPendingPaymentOrders()
{
return $this->query()
->where('order_status', OrderStatus::PENDING_PAYMENT->value)
->get();
}
public function updateOrderStatus(int $orderId, OrderStatus $status)
{
return $this->query()
->where('id', $orderId)
->update(['order_status' => $status->value]);
}
}
// 在 Service 中使用枚举
class OrderService
{
public function processPayment(Order $order)
{
// 更新支付状态
$order->update([
'pay_status' => PayStatus::PAID->value,
'order_status' => OrderStatus::PENDING_DELIVERY->value,
'pay_at' => time()
]);
}
}枚举方法说明
每个枚举类都实现了 Catch\Enums\Enum 接口,提供以下方法:
value(): 返回枚举的数值name(): 返回枚举的中文名称equal(int $value): 比较枚举值是否相等
这些枚举类确保了订单系统中状态值的一致性和类型安全,避免了硬编码数值的问题。