Files
number/后端架构设计/03-数据库设计-订单支付邀请.md
2026-03-17 12:09:43 +08:00

9.6 KiB
Raw Permalink Blame History

数据库设计文档(订单 / 支付 / 邀请模块)

一、订单模块

1.1 orders 表 - 订单主表

CREATE TABLE orders (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  order_no VARCHAR(50) NOT NULL UNIQUE COMMENT '订单号(全局唯一)',
  user_id BIGINT NOT NULL COMMENT '用户ID',
  total_amount DECIMAL(10, 2) NOT NULL COMMENT '应付总金额(元)',
  cash_amount DECIMAL(10, 2) DEFAULT 0.00 COMMENT '现金支付部分',
  points_used INT DEFAULT 0 COMMENT '使用积分数',
  points_deduct_amount DECIMAL(10, 2) DEFAULT 0.00 COMMENT '积分抵扣金额',
  status ENUM('pending','paid','completed','cancelled','refunding','refunded') DEFAULT 'pending',
  payment_method ENUM('wechat','alipay','points','mixed') COMMENT '支付方式',
  remark VARCHAR(500) COMMENT '备注',
  cancel_reason VARCHAR(255) COMMENT '取消原因',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  paid_at TIMESTAMP NULL COMMENT '支付时间',
  expired_at TIMESTAMP NULL COMMENT '超时取消时间',
  FOREIGN KEY (user_id) REFERENCES users(id),
  INDEX idx_user_id (user_id),
  INDEX idx_status (status),
  INDEX idx_order_no (order_no),
  INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';

订单号生成规则ORD + 年月日时分秒 + 6位序列号,例如 ORD20260316143022000001

状态流转

pending → paid → completed
pending → cancelled超时/主动取消)
paid    → refunding → refunded

1.2 order_items 表 - 订单项

CREATE TABLE order_items (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  order_id BIGINT NOT NULL COMMENT '订单ID',
  skill_id BIGINT NOT NULL COMMENT 'SkillID',
  skill_name VARCHAR(200) NOT NULL COMMENT 'Skill名称快照',
  skill_cover VARCHAR(500) COMMENT 'Skill封面快照(腾讯云COS)',
  unit_price DECIMAL(10, 2) NOT NULL COMMENT '下单时单价快照',
  quantity INT DEFAULT 1,
  total_price DECIMAL(10, 2) NOT NULL COMMENT '小计',
  FOREIGN KEY (order_id) REFERENCES orders(id),
  INDEX idx_order_id (order_id),
  INDEX idx_skill_id (skill_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单项表';

1.3 order_refunds 表 - 退款记录

CREATE TABLE order_refunds (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  order_id BIGINT NOT NULL COMMENT '订单ID',
  refund_no VARCHAR(50) NOT NULL UNIQUE COMMENT '退款单号',
  refund_amount DECIMAL(10, 2) NOT NULL COMMENT '退款金额',
  refund_points INT DEFAULT 0 COMMENT '退回积分',
  reason VARCHAR(255) COMMENT '退款原因',
  images JSON COMMENT '凭证图片(腾讯云COS URL数组)',
  status ENUM('pending','approved','rejected','completed') DEFAULT 'pending',
  reject_reason VARCHAR(255) COMMENT '拒绝原因',
  operator_id BIGINT COMMENT '处理人(管理员ID)',
  processed_at TIMESTAMP NULL COMMENT '处理时间',
  remark VARCHAR(255) COMMENT '处理备注',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  completed_at TIMESTAMP NULL COMMENT '退款完成时间',
  FOREIGN KEY (order_id) REFERENCES orders(id),
  INDEX idx_order_id (order_id),
  INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='退款表';

变更说明:原 handled_by 重命名为 operator_id;新增 processed_at(处理时间)和 remark(处理备注),与 AdminServiceImpl.processRefund() 对齐。

二、支付模块

2.1 recharge_orders 表 - 充值订单

CREATE TABLE recharge_orders (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  recharge_no VARCHAR(50) NOT NULL UNIQUE COMMENT '充值单号',
  user_id BIGINT NOT NULL,
  amount DECIMAL(10, 2) NOT NULL COMMENT '充值金额(元)',
  bonus_points INT DEFAULT 0 COMMENT '赠送积分',
  total_points INT NOT NULL COMMENT '到账总积分(按金额换算+赠送)',
  payment_method ENUM('wechat','alipay') NOT NULL,
  status ENUM('pending','paid','failed','cancelled') DEFAULT 'pending',
  transaction_id VARCHAR(100) COMMENT '微信/支付宝交易流水号',
  notify_data TEXT COMMENT '支付回调原始数据',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  paid_at TIMESTAMP NULL COMMENT '支付完成时间',
  FOREIGN KEY (user_id) REFERENCES users(id),
  INDEX idx_user_id (user_id),
  INDEX idx_status (status),
  INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='充值订单表';

充值赠送规则(在 application.yml 中配置):

充值金额 赠送积分 到账总积分
¥10 10 1010
¥50 60 5060
¥100 150 10150
¥500 800 50800
¥1000 2000 102000

到账总积分 = 充值金额 × 1001元=100积分+ 赠送积分

2.2 payment_records 表 - 支付流水

CREATE TABLE payment_records (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  user_id BIGINT NOT NULL,
  biz_type ENUM('order','recharge') NOT NULL COMMENT '业务类型',
  biz_id BIGINT NOT NULL COMMENT '业务ID(order_id 或 recharge_id)',
  biz_no VARCHAR(50) NOT NULL COMMENT '业务单号',
  amount DECIMAL(10, 2) NOT NULL COMMENT '支付金额',
  payment_method ENUM('wechat','alipay','points') NOT NULL,
  transaction_id VARCHAR(100) COMMENT '三方交易号',
  status ENUM('pending','success','failed') DEFAULT 'pending',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (user_id) REFERENCES users(id),
  INDEX idx_user_id (user_id),
  INDEX idx_biz_no (biz_no),
  INDEX idx_transaction_id (transaction_id),
  INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付流水表';

三、邀请模块

3.1 invite_codes 表 - 邀请码

CREATE TABLE invite_codes (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  user_id BIGINT NOT NULL COMMENT '邀请人ID',
  code VARCHAR(50) NOT NULL UNIQUE COMMENT '邀请码(大写字母+数字)',
  invite_url VARCHAR(500) COMMENT '邀请链接',
  is_active BOOLEAN DEFAULT TRUE COMMENT '是否启用',
  use_count INT DEFAULT 0 COMMENT '已使用次数',
  max_use_count INT DEFAULT -1 COMMENT '最大使用次数(-1为不限)',
  expired_at TIMESTAMP NULL COMMENT '过期时间(NULL为永不过期)',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (user_id) REFERENCES users(id),
  UNIQUE KEY uk_user_code (user_id),
  INDEX idx_code (code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邀请码表';

变更说明:原 status ENUM('active','inactive') 改为 is_active BOOLEANused_count 重命名为 use_count;新增 max_use_count(最大使用次数)、expired_at(过期时间)、updated_at,与 InviteCode.java 实体对齐。

3.2 invite_records 表 - 邀请记录

CREATE TABLE invite_records (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  inviter_id BIGINT NOT NULL COMMENT '邀请人ID',
  invitee_id BIGINT NOT NULL COMMENT '被邀请人ID',
  invite_code VARCHAR(50) COMMENT '使用的邀请码',
  status ENUM('registered','first_paid') DEFAULT 'registered' COMMENT '状态',
  inviter_reward_points INT DEFAULT 0 COMMENT '邀请人获得积分',
  invitee_reward_points INT DEFAULT 0 COMMENT '被邀请人获得积分',
  reward_given BOOLEAN DEFAULT FALSE COMMENT '奖励是否已发放',
  rewarded_at TIMESTAMP NULL COMMENT '奖励发放时间',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (inviter_id) REFERENCES users(id),
  FOREIGN KEY (invitee_id) REFERENCES users(id),
  UNIQUE KEY uk_invitee (invitee_id),
  INDEX idx_inviter_id (inviter_id),
  INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邀请记录表';

变更说明:字段 inviter_reward_points / invitee_reward_pointsInviteRecord.java 实体对齐;新增 rewarded_at 字段。

四、Redis 缓存 Key 设计

Key 说明 TTL
user:info:{userId} 用户基本信息缓存 30分钟
user:token:{token} JWT Token黑名单(登出时写入) 与token同期
user:points:{userId} 用户积分余额缓存 5分钟
skill:detail:{skillId} Skill详情缓存 10分钟
skill:hot:list 热门Skill列表 1小时
skill:category:list 分类列表 24小时
sign_in:lock:{userId}:{date} 签到幂等锁 24小时
invite:code:{code} 邀请码验证缓存 1小时
order:lock:{orderNo} 订单支付分布式锁 30秒
captcha:sms:{phone} 短信验证码 5分钟

五、数据库初始化 SQL 执行顺序

1. V1__init_users.sql          -- users, user_profiles, user_auth
2. V2__init_skills.sql         -- skill_categories, skills, skill_reviews, skill_downloads
3. V3__init_points.sql         -- user_points, points_records, points_rules
4. V4__init_orders.sql         -- orders, order_items, order_refunds
5. V5__init_payments.sql       -- recharge_orders, payment_records
6. V6__init_invites.sql        -- invite_codes, invite_records

文档版本v1.1 创建日期2026-03-16 最后更新2026-03-16修复字段缺失问题