Skip to content

1.购物车

购物车表

CREATE TABLE `trade_cart`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号,唯一自增。',
    
  `user_id` bigint NOT NULL COMMENT '用户编号',
    
  `spu_id` bigint NOT NULL COMMENT '商品 SPU 编号',
  `sku_id` bigint NOT NULL COMMENT '商品 SKU 编号',
  
  `count` int NOT NULL COMMENT '商品购买数量',
  `selected` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否选中',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 70 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '购物车的商品信息';

注意,它存储的是购物项,用户添加了多个商品 SKU 则会有多条记录。字段可以分成三类:

① user_id 字段:对应的用户编号。 ② spu_id、sku_id 字段:商品 SPU、SKU 相关信息。 ③ count、selected 字段:购买数量和选中状态。相同商品 SKU 被多次添加到购物车时,只会记录一条,count 数量进行累加,直到被下单。

2.交易订单

整体表结构 alt text

trade_order 订单主表 trade_order_item 订单项子表 trade_order_log 订单日志表

2.1 订单表

CREATE TABLE `trade_order`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单编号',
  `no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '订单流水号',
    
  `type` int NOT NULL DEFAULT 0 COMMENT '订单类型',
  `seckill_activity_id` bigint NULL DEFAULT NULL COMMENT '秒杀活动编号',
  `bargain_activity_id` bigint NULL DEFAULT NULL COMMENT '砍价活动编号',
  `bargain_record_id` bigint NULL DEFAULT NULL COMMENT '砍价记录编号',
  `combination_activity_id` bigint NULL DEFAULT NULL COMMENT '拼团活动编号',
  `combination_head_id` bigint NULL DEFAULT NULL COMMENT '拼团团长编号',
  `combination_record_id` bigint NULL DEFAULT NULL COMMENT '拼团记录编号',

  `user_id` bigint UNSIGNED NOT NULL COMMENT '用户编号',    
  `terminal` int NOT NULL COMMENT '订单来源终端',
  `user_ip` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '用户 IP',
    
  `status` int NOT NULL DEFAULT 0 COMMENT '订单状态',
  `cancel_type` int NULL DEFAULT NULL COMMENT '取消类型',
  `comment_status` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否评价',
  `cancel_time` datetime NULL DEFAULT NULL COMMENT '订单取消时间',
  `finish_time` datetime NULL DEFAULT NULL COMMENT '订单完成时间',

  `user_remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户备注',
  `product_count` int NOT NULL COMMENT '购买的商品数量',
  `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '商家备注',
  
  `brokerage_user_id` bigint NULL DEFAULT NULL COMMENT '推广人编号',
  
  `pay_order_id` bigint NULL DEFAULT NULL COMMENT '支付订单编号',
  `pay_status` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否已支付:[0:未支付 1:已经支付过]',
  `pay_time` datetime NULL DEFAULT NULL COMMENT '订单支付时间',
  `pay_channel_code` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '支付成功的支付渠道',
    
  `total_price` int NOT NULL DEFAULT 0 COMMENT '商品原价(总),单位:分',
  `discount_price` int NOT NULL DEFAULT 0 COMMENT '订单优惠(总),单位:分',
  `delivery_price` int NOT NULL DEFAULT 0 COMMENT '运费金额,单位:分',
  `adjust_price` int NOT NULL DEFAULT 0 COMMENT '订单调价(总),单位:分',
  `pay_price` int NOT NULL DEFAULT 0 COMMENT '应付金额(总),单位:分',
  `coupon_price` int NOT NULL DEFAULT 0 COMMENT '优惠劵减免金额,单位:分',
  `point_price` int NOT NULL DEFAULT 0 COMMENT '积分抵扣的金额',
  `vip_price` int NOT NULL DEFAULT 0 COMMENT 'VIP 减免金额,单位:分',

  `coupon_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '优惠劵编号',
  `use_point` int NOT NULL DEFAULT 0 COMMENT '使用的积分',
  `give_point` int NOT NULL DEFAULT 0 COMMENT '赠送的积分',

  `refund_status` tinyint NOT NULL DEFAULT 0 COMMENT '售后状态',
  `refund_point` int NOT NULL DEFAULT 0 COMMENT '退还的使用的积分',
  `refund_price` int NOT NULL DEFAULT 0 COMMENT '退款金额,单位:分',

  `delivery_type` tinyint NOT NULL COMMENT '配送类型',
  `logistics_id` bigint NULL DEFAULT NULL COMMENT '发货物流公司编号',
  `logistics_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '物流公司单号',
  `delivery_time` datetime NULL DEFAULT NULL COMMENT '发货时间',
  `receive_time` datetime NULL DEFAULT NULL COMMENT '收货时间',
  `receiver_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '收件人名称',
  `receiver_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '收件人手机',
  `receiver_area_id` int NULL DEFAULT NULL COMMENT '收件人地区编号',
  `receiver_detail_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '收件人详细地址',
  `pick_up_store_id` bigint NULL DEFAULT NULL COMMENT '自提门店编号',
  `pick_up_verify_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '自提核销码',

  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 128 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '交易订单表';

字段还是非常多的,我们来分块来看看。

① no 字段:订单流水号,主要展示给用户看,由 TradeNoRedisDAO 的 #generate(...) 方法生成。

而 id 字段是数据库自增的订单编号,系统内部使用,一般不展示给用户查看。

② type 字段:订单类型,使用 TradeOrderTypeEnum 枚举,目前有 4 种类型的订单:

普通:一般情况下的订单,未参与秒杀、砍价、拼团活动 秒杀:参与秒杀活动,会关联 seckill_activity_id 字段 砍价:参与砍价活动,会关联 bargain_activity_id、bargain_record_id 字段 拼团:参与拼团活动,会关联 combination_activity_id、combination_head_id、combination_record_id 字段 ③ 【用户】user_id、terminal、user_ip 字段:下单的用户信息。

④ 【状态】status 字段:订单状态,由 TradeOrderStatusEnum 枚举,流转状态如下图: alt text

cancel_type 字段:取消类型,标记 status 为“已取消”的原因,由 TradeOrderCancelTypeEnum 枚举,例如说:超时未支付、退款关闭、买家取消。

comment_status 字段:订单是否评价。目的是,uni-app 筛选未评价的订单列表,也有商城系统会该字段融合到 status 作为“待评价”状态。

⑤ 【支付】pay_status 字段:是否已支付。由于订单可以全部退款变成“已关闭”状态,所以需要 pay_status 区分该订单实际是否发生过支付。

pay_order_id 字段:关联的支付中心的支付单号。对支付中心还不了解的同学,可以阅读下 《支付手册》 文档。

⑥ 【价格】各种价格字段,最终使用 pay_price 字段进行支付,分类如下:

  • 收钱:total_price、delivery_price
  • 优惠:discount_price、coupon_price、point_price、vip_price ? 改价:adjust_price 价格字段拆的这些细,主要是 uni-app 或者管理后台需要展示,同时我们也需要搞清楚一个订单的具体价格明细。

⑦ 【营销】coupon_id、use_point、give_point 字段:优惠劵、积分相关信息。

⑧ 【退款】refund_status 字段:订单的整体售后(退款)状态,由 TradeOrderRefundStatusEnum 枚举,有 3 种状态:未退款、部分退款、全部退款。如果全部退款,则订单 status 变成“已关闭”。refund_point、refund_price 字段:退款的积分、金额。

⑨ 【配送】delivery_type 字段:配送类型,由 DeliveryTypeEnum 枚举,有 2 种类型:

快递发货:使用 logistics_id、logistics_no、receiver_name、receiver_mobile、receiver_area_id、receiver_detail_address 字段 用户自提:使用 pick_up_store_id、pick_up_verify_code 字段 ⑩ 各种 _time 结尾的字段,就是各种阶段、操作的时间,满足业务查询、统计需求。

2.2 订单项表

CREATE TABLE `trade_order_item`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单项编号',
  
  `user_id` bigint UNSIGNED NOT NULL COMMENT '用户编号',
  `order_id` bigint UNSIGNED NOT NULL COMMENT '订单编号',
  `cart_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '购物车项编号',
  
  `spu_id` bigint UNSIGNED NOT NULL COMMENT '商品 SPU 编号',
  `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '商品 SPU 名称',
  `sku_id` bigint UNSIGNED NOT NULL COMMENT '商品 SKU 编号',
  `properties` json NULL COMMENT '商品属性数组,JSON 格式',
  `pic_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '商品图片',
  `count` int NOT NULL COMMENT '购买数量',
  
  `comment_status` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否评价',
  
  `price` int NOT NULL DEFAULT 0 COMMENT '商品原价(单),单位:分',
  `discount_price` int NOT NULL DEFAULT 0 COMMENT '商品级优惠(总),单位:分',
  `delivery_price` int NOT NULL DEFAULT 0 COMMENT '运费金额,单位:分',
  `adjust_price` int NOT NULL DEFAULT 0 COMMENT '订单调价(总),单位:分',
  `pay_price` int NOT NULL DEFAULT 0 COMMENT '子订单实付金额(总),不算主订单分摊金额,单位:分',
  `coupon_price` int NOT NULL DEFAULT 0 COMMENT '优惠劵减免金额,单位:分',
  `point_price` int NOT NULL DEFAULT 0 COMMENT '积分抵扣的金额',
  `vip_price` int NOT NULL DEFAULT 0 COMMENT 'VIP 减免金额,单位:分',
  
  `use_point` int NOT NULL DEFAULT 0 COMMENT '使用的积分',
  `give_point` int NOT NULL DEFAULT 0 COMMENT '赠送的积分',

  `after_sale_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '售后订单编号',
  `after_sale_status` int NOT NULL DEFAULT 0 COMMENT '售后状态',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 124 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '交易订单明细表';

字段也是非常多,但是和订单表类似,我们也来分块来看看。

① 【用户】user_id 字段:对应的用户编号。

② 【订单】order_id 字段:关联的订单编号。

③ 【商品】spu_id、spu_name、sku_id、properties、pic_url、count 字段:商品 SPU、SKU 相关信息。用户下单的每个 SKU 会对应一条 trade_order_item 记录。

④ 【状态】comment_status 字段:订单项是否评价。

⑤ 【价格】price、discount_price、delivery_price、adjust_price、pay_price、coupon_price、point_price、vip_price 字段:订单项的价格信息。

⑥ 【营销】use_point、give_point 字段:订单项的积分信息。

⑦ 【售后】after_sale_id、after_sale_status 字段:订单项的售后信息。每个订单项只能发起一次售后,所以这里只有一个 after_sale_id 字段。

2.3 订单日志表

CREATE TABLE `trade_order_log`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键',
  `user_id` bigint NOT NULL COMMENT '用户编号',
  `user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型',
  `order_id` bigint NOT NULL COMMENT '订单号',
  `before_status` tinyint NULL DEFAULT NULL COMMENT '操作前状态',
  `after_status` tinyint NULL DEFAULT NULL COMMENT '操作后状态',
  `operate_type` int NOT NULL DEFAULT 0 COMMENT '操作类型',
  `content` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '操作内容',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8602 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '交易订单日志';

每次订单状态变更,都会记录一条日志,方便后续查询、统计。

3.售后退款

整体

alt text

trade_after_sale_:售后订单表 trade_after_sale_log:售后订单日志表

3.1 售后订单表

CREATE TABLE `trade_after_sale` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '售后编号',
  `no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '售后单号',
  `user_id` bigint unsigned NOT NULL COMMENT '用户编号',
  
  `type` tinyint DEFAULT NULL COMMENT '售后类型',

  `status` int NOT NULL DEFAULT '0' COMMENT '售后状态',
  `way` tinyint NOT NULL COMMENT '售后方式',
  
  `refund_price` int NOT NULL DEFAULT '0' COMMENT '退款金额,单位:分',
  `apply_reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '申请原因',
  `apply_description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '补充描述',
  `apply_pic_urls` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '补充凭证图片',
  
  `order_id` bigint unsigned NOT NULL COMMENT '订单编号',
  `order_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '订单流水号',
  `order_item_Id` bigint unsigned NOT NULL COMMENT '订单项编号',
  
  `spu_id` bigint unsigned NOT NULL COMMENT '商品 SPU 编号',
  `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '商品 SPU 名称',
  `sku_id` bigint unsigned NOT NULL COMMENT '商品 SKU 编号',
  `properties` json DEFAULT NULL COMMENT '商品属性数组,JSON 格式',
  `pic_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品图片',
  `count` int NOT NULL COMMENT '购买数量',
  
  `audit_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '审批时间',
  `audit_user_id` bigint unsigned DEFAULT NULL COMMENT '审批人',
  `audit_reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '审批备注',
  
  `logistics_id` bigint DEFAULT NULL COMMENT '退货物流公司编号',
  `logistics_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '退货物流单号',
  `delivery_time` datetime DEFAULT NULL COMMENT '退货时间',
  `receive_time` datetime DEFAULT NULL COMMENT '收货时间',
  `receive_reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收货备注',
  
  `pay_refund_id` bigint unsigned DEFAULT NULL COMMENT '支付退款编号',
  `refund_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '退款时间',

  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='售后订单';

字段还是非常多的,我们来分块来看看。

① no 字段:售后单号,主要展示给用户看,由 TradeNoRedisDAO 的 #generate(...) 方法生成。

而 id 字段是数据库自增的订单编号,系统内部使用,一般不展示给用户查看。

② 【类型】type 字段:售后类型,由 AfterSaleTypeEnum 枚举,分成两种类型:

售中退款:交易完成【前】买家申请退款 售后退款:交易完成【后】买家申请退款 ③ 【状态】status 字段:订单状态,由 AfterSaleStatusEnum 枚举,流转状态如下图:

alt text

way 字段:售后方式,由 AfterSaleWayEnum 枚举,分成两种方式:仅退款、退货退款。如上图所示,退款会多 SELLER_AGREE、BUYER_DELIVERY 两个动作。

④ 【申请】refund_price、apply_reason、apply_description、apply_pic_urls 字段:买家发起售后的基本信息。

⑤ 【订单】order_id、order_no、order_item_Id 字段:关联的订单项信息,一个 trade_order_item 可以发起多次售后,同一时间只允许一个,并且最终只能有一个成功。

如果你希望一个售后订单可以退多个订单项,需要自己加个 trade_after_sale_item 表,将部分【订单信息】【商品信息】挪过去。

⑥ 【商品】spu_id、sku_id、count 字段:关联的商品信息。冗余的 spu_name、pic_url、properties 字段,是为了方便查询。

⑦ 【审核】audit_time、audit_user_id、audit_reason 字段:卖家审核的信息。

⑧ 【退货】logistics_id、logistics_no、delivery_time 字段:买家退货的信息。

receive_time、receive_reason 字段:卖家收货的信息。

⑨ 【退款】pay_refund_id、refund_time 字段:退款的信息。 其中,pay_refund_id 关联的支付中心的退款单号。

3.2 售后订单日志表

CREATE TABLE `trade_after_sale_log` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `user_id` bigint NOT NULL COMMENT '用户编号',
  `user_type` tinyint NOT NULL COMMENT '用户类型',
  `after_sale_id` bigint NOT NULL COMMENT '售后编号',
  `before_status` tinyint DEFAULT NULL COMMENT '售后状态(之前)',
  `after_status` tinyint NOT NULL COMMENT '售后状态(之后)',
  `operate_type` tinyint NOT NULL COMMENT '操作类型',
  `content` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '操作明细',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='售后订单日志';

每次售后状态变更,都会记录一条日志,方便后续查询、统计。

4.快递发货

4.1 快递公司

CREATE TABLE `trade_delivery_express` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '快递公司编码',
  `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '快递公司名称',
  `logo` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '快递公司 logo',
  `sort` int NOT NULL DEFAULT '0' COMMENT '排序',
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='快递公司';

存储下快递公司的基本信息

4.2 快递运费模版

整体

alt text

  1. 运费模版表
CREATE TABLE `trade_delivery_express_template` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板名称',
  `charge_mode` tinyint NOT NULL COMMENT '配送计费方式',
  `sort` int NOT NULL DEFAULT '0' COMMENT '排序',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='快递运费模板';

关键信息都在两个子表中。

唯一需要注意的是,charge_mode 字段,表示配送计费方式,由 DeliveryExpressChargeModeEnum 枚举,有三种:按件、按重量、按体积

  1. 运费模板【计费】配置表
CREATE TABLE `trade_delivery_express_template_charge` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号,自增',
  
  `template_id` bigint NOT NULL COMMENT '快递运费模板编号',
  `charge_mode` tinyint NOT NULL COMMENT '配送计费方式',
  
  `area_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '配送区域 id',
  
  `start_count` double NOT NULL COMMENT '首件数量',
  `start_price` int NOT NULL COMMENT '起步价,单位:分',
  `extra_count` double NOT NULL COMMENT '续件数量',
  `extra_price` int NOT NULL COMMENT '额外价,单位:分',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='快递运费模板计费配置';

① template_id 字段:关联 trade_delivery_express_template 表的 id 字段,表示该计费配置属于哪个运费模版。而 charge_mode 字段,只是进行冗余存储,减少查询次数。

② area_ids 字段:配送区域 id 数组,存储的区级别。如下图所示: alt text

③ start_count、start_price、extra_count、extra_price 字段:配送计费的具体配置。

5.门店自提

5.1 门店信息

CREATE TABLE `trade_delivery_pick_up_store` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '门店名称',
  `introduction` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '门店简介',
  `phone` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '门店手机',
  `area_id` int NOT NULL COMMENT '区域编号',
  `detail_address` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '门店详细地址',
  `logo` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '门店 logo',
  `opening_time` time NOT NULL COMMENT '营业开始时间',
  `closing_time` time NOT NULL COMMENT '营业结束时间',
  `latitude` double NOT NULL COMMENT '纬度',
  `longitude` double NOT NULL COMMENT '经度',
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '门店状态',
  
  `verify_user_ids` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '核销用户编号数组',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='自提门店';

主要是,存储下门店的基本信息。

比较重要特殊的字段,是 verify_user_ids 字段,存储该门店可核销的管理员用户编号数组,关联的是 system_admin_users 的 id 字段。就是说,下单在该门店的订单,只有这些管理员才能核销。

6.分销返佣

整体 alt text

6.1 分销用户

CREATE TABLE `trade_brokerage_user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户编号',
  `brokerage_enabled` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否成为推广员',
  `brokerage_time` datetime DEFAULT NULL COMMENT '成为分销员时间',
  
  `bind_user_id` bigint DEFAULT NULL COMMENT '推广员编号',
  `bind_user_time` datetime DEFAULT NULL COMMENT '推广员绑定时间',
  
  `brokerage_price` int NOT NULL DEFAULT '0' COMMENT '可用佣金',
  `frozen_price` int NOT NULL DEFAULT '0' COMMENT '冻结佣金',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=249 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='分销用户';

① 【自身】id 字段:用户编号,对应会员用户(买家)表的 id 字段。因为要存储分佣的绑定关系,所以每个用户都会在这个表有个记录。

brokerage_enabled 字段:是否成为分销用户。只有为 true 的用户才能进行分销。

② 【上级】bind_user_id 字段:推广员编号,自己对应的上级,或者说是由哪个用户分销用户推广来的,后续订单佣金算他的。

③ 【佣金】brokerage_price、frozen_price 字段:可用佣金、冻结佣金。

6.2 分销记录

CREATE TABLE `trade_brokerage_record` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '编号',
  
  `user_id` bigint NOT NULL COMMENT '用户编号',
  `source_user_id` bigint NOT NULL DEFAULT '0' COMMENT '来源用户编号',
  `source_user_level` int NOT NULL DEFAULT '0' COMMENT '来源用户等级',
  
  `biz_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '业务编号',
  `biz_type` tinyint NOT NULL DEFAULT '0' COMMENT '业务类型:1-订单,2-提现',
  `title` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '标题',
  `description` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '说明',
  
  `price` int NOT NULL DEFAULT '0' COMMENT '金额',
  `total_price` int NOT NULL DEFAULT '0' COMMENT '当前总佣金',
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0-待结算,1-已结算,2-已取消',
  `frozen_days` int NOT NULL DEFAULT '0' COMMENT '冻结时间(天)',
  `unfreeze_time` datetime DEFAULT NULL COMMENT '解冻时间',

  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_user_id` (`user_id`) USING BTREE COMMENT '用户编号',
  KEY `idx_biz` (`biz_type`,`biz_id`) USING BTREE COMMENT '业务',
  KEY `idx_status` (`status`) USING BTREE COMMENT '状态'
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='佣金记录';

① id 字段:编号,自增主键。目前佣金每次发生变化时,都会生成一条记录,例如说订单分佣、佣金提现等等。

② 【分销关系】user_id 字段:用户编号,对应分销用户表的 id 字段。

source_user_id 字段:来源用户编号,例如说,订单分佣时,就是订单的买家编号。source_user_level 字段:来源用户等级,例如说,一级分佣、二级分佣。如下图所示:

alt text

上下级关系:A 推广 B,B 推广了 C A 购买商品:自己没有返佣 B 购买商品:A 获得一级返佣 C 购买商品:B 获得一级返佣,A 获得二级返佣 ③ 【业务】biz_id、biz_type 字段:业务编号、业务类型(由 BrokerageRecordBizTypeEnum 枚举)。title、description 字段:标题、说明,主要用于展示。

例如说,订单分佣时,biz_type 为 1,biz_id 为订单编号。具体 TradeBrokerageOrderHandler 处理器,订单被支付时,会生成分佣记录。 ④ 【佣金】price、total_price 字段:分佣金额、当前总佣金。每个商品的佣金,可以全局设置,也可以自定设置,如下图所示: ⑤ 【状态】status 字段:状态,由 BrokerageRecordStatusEnum 枚举,目前就待结算(冻结)、已结算(生效)、已取消(失效)三种状态。

frozen_days 字段:冻结时间(天),例如说,订单分佣时,可以设置冻结时间,冻结时间内,佣金不可提现。解冻通过 BrokerageRecordUnfreezeJob 定时任务实现。

6.3 分销提现

CREATE TABLE `trade_brokerage_withdraw` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  
  `user_id` bigint NOT NULL COMMENT '用户编号',
  
  `price` int NOT NULL DEFAULT '0' COMMENT '提现金额',
  `fee_price` int NOT NULL DEFAULT '0' COMMENT '提现手续费',
  `total_price` int NOT NULL DEFAULT '0' COMMENT '当前总佣金',
 
  `type` tinyint NOT NULL DEFAULT '0' COMMENT '提现类型:1-钱包;2-银行卡;3-微信;4-支付宝',
  `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '真实姓名',
  `account_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '账号',
  `bank_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '银行名称',
  `bank_address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '开户地址',
  `account_qr_code_url` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '收款码',
  
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '状态:0-审核中,10-审核通过 20-审核不通过;预留:11 - 提现成功;21-提现失败',
  `audit_reason` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审核驳回原因',
  `audit_time` datetime DEFAULT NULL COMMENT '审核时间',
  
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_user_id` (`user_id`) USING BTREE COMMENT '用户编号',
  KEY `idx_audit_status` (`status`) USING BTREE COMMENT '状态'
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='佣金提现';

字段虽然比较多,但是都比较简单,就不一一介绍了,只挑选部分重点的。 ① type 字段,提现类型,由 BrokerageWithdrawTypeEnum 枚举,目前支持钱包、银行卡、微信、支付宝。具体需要填写哪些字段,可见 AppBrokerageWithdrawCreateReqVO 类的注释。

② status 字段,提现状态,由 BrokerageWithdrawStatusEnum 枚举,可以分成三个阶段:分佣用户申请、管理员审核(通过、不通过)、管理员打款(成功、失败)。