<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>墨笺文档</title><link>https://mdoc.raoqu.cc/</link><description>Recent content on 墨笺文档</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Tue, 13 Oct 2026 09:37:48 +0800</lastBuildDate><atom:link href="https://mdoc.raoqu.cc/index.xml" rel="self" type="application/rss+xml"/><item><title>LKT</title><link>https://mdoc.raoqu.cc/post/f39539bf1c15190aa5541382/</link><pubDate>Thu, 06 Aug 2026 13:56:09 +0000</pubDate><guid>https://mdoc.raoqu.cc/post/f39539bf1c15190aa5541382/</guid><description>&lt;h1 id="lkt">LKT
&lt;/h1>&lt;h2 id="一先抓住-5-个核心抽象">一、先抓住 5 个核心抽象
&lt;/h2>&lt;p>这类商城容易失控，通常不是业务太复杂，而是把“平台订单、供应商订单、自营订单、代客订单、平台券、店铺券”分别建表，最后形成大量重复逻辑。&lt;/p>
&lt;p>&lt;img src="https://mdoc.raoqu.cc/post/f39539bf1c15190aa5541382/attachments/uploads/1791855463185656000-image.png"
width="794"
height="1146"
srcset="https://mdoc.raoqu.cc/post/f39539bf1c15190aa5541382/attachments/uploads/1791855463185656000-image_hu655ed8ac5ba916e357dc40aacd641fb4_69585_480x0_resize_box_3.png 480w, https://mdoc.raoqu.cc/post/f39539bf1c15190aa5541382/attachments/uploads/1791855463185656000-image_hu655ed8ac5ba916e357dc40aacd641fb4_69585_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="69"
data-flex-basis="166px"
>&lt;img src="https://mdoc.raoqu.cc/post/f39539bf1c15190aa5541382/attachments/uploads/1791855137249594000-image.png"
width="772"
height="266"
srcset="https://mdoc.raoqu.cc/post/f39539bf1c15190aa5541382/attachments/uploads/1791855137249594000-image_hucff7ce5e53c886893781df90cf98fde4_58354_480x0_resize_box_3.png 480w, https://mdoc.raoqu.cc/post/f39539bf1c15190aa5541382/attachments/uploads/1791855137249594000-image_hucff7ce5e53c886893781df90cf98fde4_58354_1024x0_resize_box_3.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="290"
data-flex-basis="696px"
>&lt;/p>
&lt;p>建议围绕下面 5 个对象设计：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>组织主体 Org&lt;/strong>：平台、供应商、店铺经营者只是不同角色。&lt;/li>
&lt;li>&lt;strong>销售报价 Offer&lt;/strong>：同一个 SKU 在不同店铺、供应商、履约方式下形成不同 Offer。&lt;/li>
&lt;li>&lt;strong>交易订单 Order&lt;/strong>：描述谁买、谁下单、买了什么。&lt;/li>
&lt;li>&lt;strong>金额明细 ChargeLine&lt;/strong>：商品价、折扣、卡券、积分、运费全部表现为金额行。&lt;/li>
&lt;li>&lt;strong>履约单 FulfillmentOrder&lt;/strong>：描述谁发货、从哪里发、如何发。&lt;/li>
&lt;/ol>
&lt;p>核心关系可以概括为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">组织 Org
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └─ 店铺 Shop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └─ 销售报价 Offer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├─ SKU
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├─ 销售方
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├─ 供应方
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├─ 履约策略
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └─ 结算策略
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">交易主单 TradeOrder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └─ 店铺订单 SellerOrder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├─ 订单项 OrderItem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├─ 金额行 ChargeLine
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├─ 履约单 FulfillmentOrder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └─ 结算行 SettlementLine
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="二主体模型不要分别设计平台表供应商表商家表">二、主体模型：不要分别设计平台表、供应商表、商家表
&lt;/h1>&lt;h2 id="1-组织表-org">1. 组织表 &lt;code>org&lt;/code>
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">org
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">---
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">legal_name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tenant_id -- 多平台/SaaS时使用
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">created_at
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>平台、供应商、经销商、店铺经营公司都放在这里。&lt;/p>
&lt;h2 id="2-组织角色表-org_role">2. 组织角色表 &lt;code>org_role&lt;/code>
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">org_role
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">role_type -- PLATFORM / SUPPLIER / SELLER / SHOP_OPERATOR /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -- STOCK_OWNER / SHIPPER / SETTLEMENT_PARTY
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scope_type -- GLOBAL / PLATFORM / SHOP
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scope_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">valid_from
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">valid_to
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>一个组织可以同时拥有多个角色。例如平台公司可以同时是：&lt;/p>
&lt;ul>
&lt;li>PLATFORM&lt;/li>
&lt;li>SELLER&lt;/li>
&lt;li>STOCK_OWNER&lt;/li>
&lt;li>SHIPPER&lt;/li>
&lt;/ul>
&lt;p>这比在 &lt;code>org&lt;/code> 中增加大量布尔字段更灵活。&lt;/p>
&lt;h2 id="3-店铺表-shop">3. 店铺表 &lt;code>shop&lt;/code>
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">shop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">----
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">platform_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">owner_org_id -- 店铺所有者
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">operator_org_id -- 实际运营者
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">shop_type
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>自营店铺不需要单独建表：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">owner_org_id = platform_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">operator_org_id = platform_org_id
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>供应商店铺则可以是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">owner_org_id = supplier_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">operator_org_id = supplier_org_id
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="4-组织关系表-org_relation">4. 组织关系表 &lt;code>org_relation&lt;/code>
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">org_relation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">from_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">to_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">relation_type -- SUPPLY_TO / OPERATE_FOR / SETTLE_FOR / AGENT_OF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">contract_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">valid_from
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">valid_to
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用于表示供应关系、代运营关系、代理关系，而不是把这些关系硬编码在组织表中。&lt;/p>
&lt;hr>
&lt;h1 id="三商品模型必须区分-sku-和-offer">三、商品模型：必须区分 SKU 和 Offer
&lt;/h1>&lt;p>商城中最重要的简化，是把“商品是什么”和“商品怎么卖”分开。&lt;/p>
&lt;h2 id="1-商品基础表">1. 商品基础表
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">product_spu
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-----------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">category_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brand_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">product_sku
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-----------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">spu_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sku_code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">spec_json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">weight_gram
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">volume
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>SKU 只描述商品本身，不直接放店铺、供应商、发货方式和销售价格。&lt;/p>
&lt;h2 id="2-销售报价表-offer">2. 销售报价表 &lt;code>offer&lt;/code>
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">offer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-----
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">shop_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sku_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">seller_org_id -- 法律意义上的销售方
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">supplier_org_id -- 供货方，可为空
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">stock_owner_org_id -- 库存所有者
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sale_price
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">market_price
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fulfillment_policy_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">settlement_policy_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">freight_template_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">valid_from
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">valid_to
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>offer&lt;/code> 是整个商城的关键对象。&lt;/p>
&lt;p>同一个 SKU 可以有多个 Offer：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">SKU A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ 平台自营店销售，平台库存，平台发货
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ 平台自营店销售，供应商库存，供应商代发
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├─ 供应商店铺销售，供应商发货
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─ 另一店铺销售，平台仓发货
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不要在 SKU 上放：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">is_self_operated
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">is_supplier_ship
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">supplier_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">shop_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sale_price
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因为这些属性不是商品属性，而是销售关系属性。&lt;/p>
&lt;h2 id="3-履约策略表">3. 履约策略表
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">fulfillment_policy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fulfillment_mode -- PLATFORM_SHIP / SELLER_SHIP /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -- SUPPLIER_DROP_SHIP / PICKUP / VIRTUAL
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">default_shipper_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">default_stock_owner_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">return_receiver_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">allow_split
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>“自营”和“发货”是两个不同维度：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>场景&lt;/th>
&lt;th>seller_org&lt;/th>
&lt;th>stock_owner&lt;/th>
&lt;th>shipper&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>平台自营、平台发货&lt;/td>
&lt;td>平台&lt;/td>
&lt;td>平台&lt;/td>
&lt;td>平台&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>平台自营、供应商代发&lt;/td>
&lt;td>平台&lt;/td>
&lt;td>供应商&lt;/td>
&lt;td>供应商&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>供应商店铺销售发货&lt;/td>
&lt;td>供应商&lt;/td>
&lt;td>供应商&lt;/td>
&lt;td>供应商&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>商家销售、平台仓发货&lt;/td>
&lt;td>商家&lt;/td>
&lt;td>商家或平台&lt;/td>
&lt;td>平台&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>因此，不建议使用单一字段 &lt;code>business_type=SELF/THIRD_PARTY&lt;/code> 决定所有逻辑。&lt;/p>
&lt;hr>
&lt;h1 id="四订单模型主订单店铺订单履约单分开">四、订单模型：主订单、店铺订单、履约单分开
&lt;/h1>&lt;h2 id="1-交易主单-trade_order">1. 交易主单 &lt;code>trade_order&lt;/code>
&lt;/h2>&lt;p>代表用户的一次提交或支付行为。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">trade_order
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-----------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">order_no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">buyer_user_id -- 权益和售后归属人
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">placed_by_user_id -- 实际操作下单的人
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">order_source -- WEB / APP / AGENT / ADMIN / API
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">currency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">goods_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">discount_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">freight_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">payable_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">paid_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">address_snapshot_json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">created_at
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">paid_at
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="代客下单不需要单独建代客订单表">代客下单不需要单独建“代客订单表”
&lt;/h3>&lt;p>只需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">buyer_user_id = 被代下单的客户
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">placed_by_user_id = 客服、销售或代理人员
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">order_source = AGENT
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>必要时增加订单参与者表：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">order_actor
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-----------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">actor_role -- BUYER / PLACER / RECIPIENT / SALESPERSON /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -- CUSTOMER_SERVICE / REFERRER
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">actor_type -- USER / ORG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">actor_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">org_id
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以支持销售归属、客服归属、推荐人、收货人等，而不用不断往订单表增加字段。&lt;/p>
&lt;h2 id="2-店铺订单-seller_order">2. 店铺订单 &lt;code>seller_order&lt;/code>
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">seller_order
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">trade_order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">shop_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">seller_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">settlement_policy_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">goods_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">discount_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">freight_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">payable_amount
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>一张交易主单可以拆成多个店铺订单。&lt;/p>
&lt;p>通常按照下面的组合拆单：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">shop_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ seller_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ settlement_policy_id
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不要直接按供应商拆交易订单，因为供应商更多是供货和履约角色，未必是销售方。&lt;/p>
&lt;h2 id="3-订单项-order_item">3. 订单项 &lt;code>order_item&lt;/code>
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">order_item
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">----------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">seller_order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">offer_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">spu_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sku_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sku_name_snapshot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">spec_snapshot_json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">image_snapshot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">offer_snapshot_json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">quantity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">unit_list_price
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">unit_sale_price
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">item_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>订单中必须保存快照，不能在查看历史订单时重新查询当前商品名称、价格和履约策略。&lt;/p>
&lt;hr>
&lt;h1 id="五统一金额模型所有优惠运费积分都形成金额行">五、统一金额模型：所有优惠、运费、积分都形成金额行
&lt;/h1>&lt;p>商城最容易复杂的部分，是在订单表不断增加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">platform_coupon_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">shop_coupon_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">points_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">member_discount_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">promotion_discount_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">freight_discount_amount
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>更好的方式是建立统一金额明细表。&lt;/p>
&lt;h2 id="order_charge_line">&lt;code>order_charge_line&lt;/code>
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">order_charge_line
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-----------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">trade_order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">seller_order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">order_item_id -- 可为空
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fulfillment_order_id -- 可为空
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scope_type -- ORDER / SELLER_ORDER / ITEM / FULFILLMENT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">charge_type -- GOODS / PROMOTION / COUPON / POINTS /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -- FREIGHT / TAX / SERVICE_FEE / PRICE_ADJUSTMENT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">amount -- 正数增加应付，负数减少应付
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">currency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">source_type -- RULE / BENEFIT_ASSET / MANUAL / FREIGHT_RULE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">source_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">source_version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bearer_org_id -- 谁承担该优惠
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">beneficiary_org_id -- 谁最终获得该金额
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">allocation_method -- 按金额、数量或指定比例分摊
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reverse_of_line_id -- 退款冲销时使用
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">created_at
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如一笔订单：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>金额类型&lt;/th>
&lt;th style="text-align:right">金额&lt;/th>
&lt;th>承担方&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>商品原价&lt;/td>
&lt;td style="text-align:right">+200&lt;/td>
&lt;td>买家&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>商品促销&lt;/td>
&lt;td style="text-align:right">-20&lt;/td>
&lt;td>店铺&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>店铺券&lt;/td>
&lt;td style="text-align:right">-10&lt;/td>
&lt;td>店铺&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>平台券&lt;/td>
&lt;td style="text-align:right">-5&lt;/td>
&lt;td>平台&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>积分抵扣&lt;/td>
&lt;td style="text-align:right">-3&lt;/td>
&lt;td>平台&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>运费&lt;/td>
&lt;td style="text-align:right">+8&lt;/td>
&lt;td>买家&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>最终应付&lt;/td>
&lt;td style="text-align:right">170&lt;/td>
&lt;td>派生结果&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>订单的汇总金额仍然可以保存在 &lt;code>trade_order&lt;/code> 和 &lt;code>seller_order&lt;/code> 中，用于查询性能；但它们应当由金额行汇总得到，金额行才是可审计的明细依据。&lt;/p>
&lt;p>这样新增“满减券”“新人补贴”“直播间补贴”时，通常只需增加 &lt;code>charge_type&lt;/code> 或 &lt;code>source_type&lt;/code>，不需要修改订单表结构。&lt;/p>
&lt;hr>
&lt;h1 id="六营销模型规则权益使用记录三层分离">六、营销模型：规则、权益、使用记录三层分离
&lt;/h1>&lt;p>积分、平台券、店铺券、卡余额、会员折扣不能全部塞进一个促销表，也不应分别写进订单逻辑。&lt;/p>
&lt;p>建议分为三层。&lt;/p>
&lt;h2 id="第一层营销规则">第一层：营销规则
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">marketing_rule
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rule_type -- DIRECT_DISCOUNT / FULL_REDUCTION /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -- COUPON_ISSUE / POINTS_EARN / POINTS_REDEEM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">issuer_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">priority
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">stack_group
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">exclusive_group
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conditions_json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">actions_json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">valid_from
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">valid_to
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>适用范围单独建表：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">marketing_rule_scope
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rule_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">include_exclude -- INCLUDE / EXCLUDE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scope_type -- PLATFORM / SHOP / CATEGORY / SPU / SKU / OFFER
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scope_id
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>平台券和店铺券使用同一模型：&lt;/p>
&lt;ul>
&lt;li>&lt;code>issuer_org_id&lt;/code>：谁发行、谁承担&lt;/li>
&lt;li>&lt;code>scope_type/scope_id&lt;/code>：在哪些平台、店铺或商品使用&lt;/li>
&lt;/ul>
&lt;p>而不是建立 &lt;code>platform_coupon&lt;/code> 和 &lt;code>shop_coupon&lt;/code> 两套表。&lt;/p>
&lt;h2 id="第二层用户权益定义">第二层：用户权益定义
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">benefit_definition
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">benefit_type -- COUPON / POINTS_ACCOUNT / STORED_VALUE_CARD /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -- DISCOUNT_RIGHT / GIFT_CERTIFICATE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">issuer_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">face_value
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">discount_rate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">threshold_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">validity_policy_json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">stack_policy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="第三层用户持有的权益资产">第三层：用户持有的权益资产
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">benefit_asset
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">definition_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">owner_user_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">asset_no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">balance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">quantity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">valid_from
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">valid_to
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status -- AVAILABLE / RESERVED / USED / EXPIRED / FROZEN
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>举例：&lt;/p>
&lt;ul>
&lt;li>一张优惠券：一条 &lt;code>benefit_asset&lt;/code>，数量为 1。&lt;/li>
&lt;li>积分账户：一条 &lt;code>benefit_asset&lt;/code>，余额为积分数。&lt;/li>
&lt;li>储值卡：一条 &lt;code>benefit_asset&lt;/code>，余额为金额。&lt;/li>
&lt;li>会员折扣权：一条 &lt;code>benefit_asset&lt;/code>，表示有效权益。&lt;/li>
&lt;/ul>
&lt;h2 id="权益流水">权益流水
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">benefit_ledger
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">asset_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">biz_type -- ISSUE / EARN / RESERVE / COMMIT /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -- RELEASE / EXPIRE / REFUND / ADJUST
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">delta
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">balance_after
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">biz_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">idempotency_key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">created_at
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="权益占用记录">权益占用记录
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">benefit_reservation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">asset_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reserve_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">used_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status -- RESERVED / COMMITTED / RELEASED
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">expires_at
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">idempotency_key
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>标准流程为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">试算 → 锁定权益 → 创建订单 → 支付成功后核销
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └→ 订单取消后释放
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不能在创建订单时直接扣掉积分或销毁优惠券，否则支付失败、超时取消时很难恢复。&lt;/p>
&lt;hr>
&lt;h1 id="七运费模型运费规则与履约拆单分离">七、运费模型：运费规则与履约拆单分离
&lt;/h1>&lt;h2 id="1-运费模板">1. 运费模板
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">freight_template
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">----------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">owner_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">charge_dimension -- WEIGHT / QUANTITY / VOLUME / FIXED
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="2-运费区域规则">2. 运费区域规则
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">freight_rule
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">template_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">region_group_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">first_unit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">first_fee
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">increment_unit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">increment_fee
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">free_threshold_type -- NONE / AMOUNT / QUANTITY / WEIGHT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">free_threshold_value
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">valid_from
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">valid_to
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>统一支持：&lt;/p>
&lt;ul>
&lt;li>按重量计费&lt;/li>
&lt;li>按件数计费&lt;/li>
&lt;li>固定运费&lt;/li>
&lt;li>首重续重&lt;/li>
&lt;li>首件续件&lt;/li>
&lt;li>满金额包邮&lt;/li>
&lt;li>指定地区包邮&lt;/li>
&lt;/ul>
&lt;p>运费计算产生一条或多条 &lt;code>order_charge_line&lt;/code>，而不是直接把结果写死在订单表。&lt;/p>
&lt;h2 id="3-履约单">3. 履约单
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">fulfillment_order
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-----------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">seller_order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fulfillment_mode
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">shipper_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">stock_owner_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">warehouse_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">address_snapshot_json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">estimated_weight
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">actual_weight
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">customer_freight_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">actual_logistics_cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="4-履约明细">4. 履约明细
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">fulfillment_item
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">----------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fulfillment_order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">order_item_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">quantity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="5-包裹与物流">5. 包裹与物流
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">shipment
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fulfillment_order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">carrier_code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tracking_no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">package_no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">shipped_at
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">received_at
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>履约单建议按以下维度拆分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">shipper_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ stock_owner_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ warehouse_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ fulfillment_mode
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ 收货地址
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>一个店铺订单可以拆成多个履约单，一个履约单也可以包含多个订单项。&lt;/p>
&lt;p>需要特别区分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">买家支付的运费 customer_freight_amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">实际物流成本 actual_logistics_cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>两者不是同一个概念。&lt;/p>
&lt;hr>
&lt;h1 id="八库存模型所有权和仓库必须分开">八、库存模型：所有权和仓库必须分开
&lt;/h1>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">inventory_balance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-----------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">stock_owner_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">warehouse_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sku_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">total_quantity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reserved_quantity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">available_quantity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">inventory_reservation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">---------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">order_item_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">stock_owner_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">warehouse_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sku_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">quantity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">expires_at
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">idempotency_key
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">inventory_ledger
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">----------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">stock_owner_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">warehouse_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sku_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">biz_type
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">biz_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">quantity_delta
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">balance_after
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">created_at
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>重点是库存键包含：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">库存所有者 + 仓库 + SKU
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>同一个仓库可能代管不同供应商的库存，不能只使用 &lt;code>warehouse_id + sku_id&lt;/code>。&lt;/p>
&lt;hr>
&lt;h1 id="九支付和结算必须分开">九、支付和结算必须分开
&lt;/h1>&lt;p>支付描述“买家付了多少钱”，结算描述“平台最终应该给谁多少钱”。&lt;/p>
&lt;h2 id="1-支付单">1. 支付单
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">payment_order
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">trade_order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">payment_no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">payer_user_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">payment_transaction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">payment_order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">channel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">channel_transaction_no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">transaction_type -- PAY / REFUND
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">idempotency_key
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="2-结算明细">2. 结算明细
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">settlement_line
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">---------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">trade_order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">seller_order_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">order_item_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">payer_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">payee_org_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">settlement_type -- GOODS_RECEIVABLE / PLATFORM_COMMISSION /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -- PLATFORM_SUBSIDY / SELLER_DISCOUNT /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -- FREIGHT / SERVICE_FEE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">amount
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">currency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">due_at
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reverse_of_line_id
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如平台券不应简单理解为“订单少收 10 元”：&lt;/p>
&lt;ul>
&lt;li>买家少支付 10 元；&lt;/li>
&lt;li>商家可能仍按原金额收款；&lt;/li>
&lt;li>平台需要向商家补贴 10 元。&lt;/li>
&lt;/ul>
&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">order_charge_line
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>负责解释买家的应付金额；&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">settlement_line
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>负责解释平台、店铺、供应商之间如何分钱。&lt;/p>
&lt;hr>
&lt;h1 id="十几个典型场景如何落到同一套表">十、几个典型场景如何落到同一套表
&lt;/h1>&lt;h2 id="场景一平台自营平台发货">场景一：平台自营、平台发货
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">offer.seller_org_id = 平台
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">offer.stock_owner_org_id = 平台
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fulfillment.shipper_org_id = 平台
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="场景二平台销售供应商代发">场景二：平台销售、供应商代发
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">offer.seller_org_id = 平台
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">offer.supplier_org_id = 供应商A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">offer.stock_owner_org_id = 供应商A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fulfillment.shipper_org_id = 供应商A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>消费者看到的是平台自营，但履约由供应商完成。&lt;/p>
&lt;h2 id="场景三供应商店铺销售">场景三：供应商店铺销售
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">shop.owner_org_id = 供应商A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">offer.seller_org_id = 供应商A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fulfillment.shipper_org_id = 供应商A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="场景四客服代客下单">场景四：客服代客下单
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">trade_order.buyer_user_id = 客户
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">trade_order.placed_by_user_id = 客服
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">trade_order.order_source = AGENT
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>积分、优惠券、售后权益都归 &lt;code>buyer_user_id&lt;/code>，操作审计归 &lt;code>placed_by_user_id&lt;/code>。&lt;/p>
&lt;h2 id="场景五平台券">场景五：平台券
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">benefit_definition.issuer_org_id = 平台
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rule_scope.scope_type = PLATFORM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">charge_line.bearer_org_id = 平台
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="场景六店铺券">场景六：店铺券
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">benefit_definition.issuer_org_id = 店铺经营组织
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rule_scope.scope_type = SHOP
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rule_scope.scope_id = 店铺ID
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">charge_line.bearer_org_id = 店铺经营组织
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="十一推荐的最小核心表集合">十一、推荐的最小核心表集合
&lt;/h1>&lt;p>第一阶段不必一次建设完整体系，可以先落下面这些核心表：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">主体
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. org
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. org_role
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. shop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">商品
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4. product_spu
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">5. product_sku
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">6. offer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">7. fulfillment_policy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">交易
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8. trade_order
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">9. seller_order
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">10. order_item
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">11. order_actor
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">12. order_charge_line
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">营销
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">13. marketing_rule
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">14. marketing_rule_scope
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">15. benefit_definition
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">16. benefit_asset
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">17. benefit_ledger
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">18. benefit_reservation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">履约与库存
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">19. freight_template
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">20. freight_rule
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">21. fulfillment_order
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">22. fulfillment_item
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">23. shipment
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">24. inventory_balance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">25. inventory_reservation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">资金
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">26. payment_order
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">27. payment_transaction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">28. settlement_line
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>复杂度较低的项目，可以先不建立完整库存流水和结算批次，但 &lt;code>order_charge_line&lt;/code>、&lt;code>benefit_ledger&lt;/code> 和 &lt;code>settlement_line&lt;/code> 建议从一开始就保留。&lt;/p>
&lt;hr>
&lt;h1 id="十二落地时最重要的约束">十二、落地时最重要的约束
&lt;/h1>&lt;h2 id="1-规则必须版本化">1. 规则必须版本化
&lt;/h2>&lt;p>修改营销规则、运费模板、履约策略时创建新版本，不覆盖旧版本。&lt;/p>
&lt;p>订单记录：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">rule_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rule_version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">policy_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">policy_version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>历史订单不能使用当前规则重新计算。&lt;/p>
&lt;h2 id="2-金额统一使用最小货币单位">2. 金额统一使用最小货币单位
&lt;/h2>&lt;p>人民币使用“分”：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">amount = 1999
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>表示 19.99 元，避免浮点误差。&lt;/p>
&lt;p>重量统一使用克，折扣可以用万分比：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">discount_rate = 8500
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>表示 85 折。&lt;/p>
&lt;h2 id="3-退款采用反向流水">3. 退款采用反向流水
&lt;/h2>&lt;p>不要直接修改原始金额行、库存流水、权益流水。&lt;/p>
&lt;p>通过：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">reverse_of_line_id
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>生成负向记录，保证完整审计链。&lt;/p>
&lt;h2 id="4-所有锁定和扣减都要有幂等键">4. 所有锁定和扣减都要有幂等键
&lt;/h2>&lt;p>包括：&lt;/p>
&lt;ul>
&lt;li>库存锁定&lt;/li>
&lt;li>积分扣减&lt;/li>
&lt;li>卡券核销&lt;/li>
&lt;li>支付回调&lt;/li>
&lt;li>退款&lt;/li>
&lt;li>结算&lt;/li>
&lt;/ul>
&lt;p>使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">idempotency_key
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>防止支付渠道和消息队列重复回调。&lt;/p>
&lt;h2 id="5-json-只能用于规则和快照">5. JSON 只能用于规则和快照
&lt;/h2>&lt;p>适合放 JSON 的内容：&lt;/p>
&lt;ul>
&lt;li>营销条件和动作&lt;/li>
&lt;li>商品规格快照&lt;/li>
&lt;li>地址快照&lt;/li>
&lt;li>履约策略快照&lt;/li>
&lt;/ul>
&lt;p>不适合放 JSON 的内容：&lt;/p>
&lt;ul>
&lt;li>金额&lt;/li>
&lt;li>状态&lt;/li>
&lt;li>店铺和组织关系&lt;/li>
&lt;li>库存数量&lt;/li>
&lt;li>结算关系&lt;/li>
&lt;li>核心查询条件&lt;/li>
&lt;/ul>
&lt;h2 id="6-核心关系使用明确外键">6. 核心关系使用明确外键
&lt;/h2>&lt;p>&lt;code>source_type + source_id&lt;/code> 这种多态引用，只适合金额流水、操作日志、事件记录等附属表。核心对象之间应使用明确字段和外键，避免建设一张万能业务表。&lt;/p>
&lt;hr>
&lt;h2 id="最终建议">最终建议
&lt;/h2>&lt;p>真正能够简化系统的不是减少表数量，而是减少业务分支：&lt;/p>
&lt;ul>
&lt;li>平台、供应商、店铺统一为&lt;strong>组织和角色&lt;/strong>；&lt;/li>
&lt;li>自营、代销、代发统一由 &lt;strong>Offer 中的销售方、库存方、发货方组合表达&lt;/strong>；&lt;/li>
&lt;li>平台券、店铺券统一为&lt;strong>发行方 + 使用范围 + 承担方&lt;/strong>；&lt;/li>
&lt;li>代客下单统一为&lt;strong>购买人和操作人分离&lt;/strong>；&lt;/li>
&lt;li>商品价、积分、卡券、折扣、运费统一为&lt;strong>金额行&lt;/strong>；&lt;/li>
&lt;li>订单、发货、支付、结算各自独立，通过订单项关联。&lt;/li>
&lt;/ul>
&lt;p>其中最值得优先设计正确的三张表是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">offer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">order_charge_line
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">settlement_line
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这三张表设计稳定后，后续增加直播带货、渠道代理、供应商代发、平台补贴、组合优惠和多仓履约时，通常不需要推翻订单主模型。&lt;/p></description></item><item><title>归档</title><link>https://mdoc.raoqu.cc/page/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mdoc.raoqu.cc/page/archives/</guid><description/></item><item><title>搜索</title><link>https://mdoc.raoqu.cc/page/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mdoc.raoqu.cc/page/search/</guid><description/></item></channel></rss>