1. 文档目标

本文不是 application/config/tables.php 的机械复制,而是 DGJ2.0 的数据导航手册。它要回答:

  1. 一个业务现象应该先查哪张主表;
  2. 主表、明细表、数量过程表、库存流水、支付表怎样关联;
  3. 知道 sid 后怎样算出真实分表;
  4. id、iid、srcOrderId、srcOrderEntryId、billNo、srcOrderNo 分别表达什么;
  5. 哪些表是业务事实、过程事实、当前结果、配置或日志;
  6. 表中金额、数量、状态和软删除字段怎样解释;
  7. 改一张公共表时需要回归哪些上下游。

适用场景:

  • 新人理解 DGJ 的数据模型;
  • 按采购单、销售单、出库单、活动单、渠道单排查;
  • 核对库存、付款、报表和业务页面差异;
  • 新增字段、索引、分表或迁移脚本前做影响评估;
  • 编写补偿任务、数据修复 SQL 或只读巡检;
  • 识别“代码常量表”和“实际运行物理表”不一致的问题。
字段说明来自当前模型查询、写入代码和 tables.php,不等同于目标环境的完整 DDL。字段类型、默认值、索引、唯一键和字符集必须用对应环境的 SHOW CREATE TABLE 或 information_schema 再确认。

2. 数据地图总览

flowchart LR
    BASE["基础资料\n商品 / 客户 / 仓库 / 货位"]
    PO["采购域\n采购主明细 / 发货 / 入库 / 退货"]
    SA["销售域\n销售主明细 / 出库 / 销退"]
    INV["库存域\n业务流水 / 实时结果 / 盘点"]
    FIN["财务域\n收付款 / 账户 / 核销"]
    ACT["活动域\n普通活动 / 赠品 / 秒杀"]
    CH["渠道域\n订单 / 售后 / 签收"]
    MOVE["移动与微仓\nE站 / 补货 / 退货 / 对账"]
    ROBOT["机器人与报价\n会话 / 规则 / 报价单"]
    SYS["系统域\n账号 / 权限 / 菜单 / 配置"]
    OUT["外部系统\n订单中心 / 支付 / OA / 配送"]
    REPORT["报表与同步\nDWD / Hologres / MQ"]

    BASE --> PO
    BASE --> SA
    BASE --> INV
    ACT --> PO
    ACT --> SA
    CH --> SA
    MOVE --> SA
    ROBOT --> SA
    PO --> INV
    SA --> INV
    PO --> FIN
    SA --> FIN
    SYS --> BASE
    OUT --> PO
    OUT --> SA
    OUT --> FIN
    PO --> REPORT
    SA --> REPORT
    INV --> REPORT
    FIN --> REPORT

2.1 五类表必须分开理解

类别作用代表表排查时回答的问题
主单事实表达一张业务单据的整体状态和汇总t_scm_po_order, 销售/出库分表单据是否存在、当前整体状态是什么
明细事实表达商品行、金额行或业务行采购明细、销售明细、付款明细哪一行商品或金额出了问题
过程数量保存待发、在途、已收、关闭等分解t_scm_po_order_info_qty数量在哪个阶段卡住
流水事实保存一次业务动作造成的变化库存流水、账户流水、操作日志变化何时、因何发生
当前结果保存此刻可用结果或快照t_scm_inventory_real_time、缓存表页面当前应展示多少

不能只凭当前结果反推完整过程,也不能只凭一条流水断言当前结果正确。

3. tables.php 的使用边界

当前 application/config/tables.php 静态统计结果:

指标当前值含义
字符串 define() 行448包含一次重复定义
唯一常量名447代码检索入口数量
唯一物理表前缀/表名445两组不同常量指向同一物理表

3.1 已发现的配置重复和别名

类型常量/物理表当前事实风险
重复常量SCM_PO_RETURN_ORDER_LOGISTICS在 164、175 行重复定义相同值PHP 运行环境可能产生重复常量告警;修改一处容易漏另一处
物理表别名SCM_SIMPLE_CODE, BS_GOODS_SIMPLE_CODE都指向 t_bs_goods_simple_code搜索单一常量会漏调用方
物理表别名ADM_USERS, SYSTEM_USERS都指向 t_admin_users后台账号相关影响面需合并计算

3.2 常量名不是实际分表名

SCM_PO_ORDER_INFO 的值是前缀 t_scm_po_order_info。真正查询时,模型会拼接:

t_scm_po_order_info_{sid % 32}

因此下面的 SQL 通常是错的:

SELECT * FROM t_scm_po_order_info WHERE billNo = 'CG...';

必须先拿到 sid,再算分片。

4. 分表规则总表

业务对象常量物理表规则分片数代码证据
采购明细SCM_PO_ORDER_INFOt_scm_po_order_info_{sid % 32}32PoOrderInfoModel::getPoInfoSubTable()
采购发货明细SCM_PO_OUT_INFOt_scm_po_out_info_{sid % 32}32PoOutInfoModel::getPoOutInfoTable()
采购入库明细SCM_PU_INVOICE_INFOt_scm_pu_invoice_info_{sid % 32}32SCM_PU_INVOICE_NUM 和调用方拼表
销售主单SCM_SA_ORDERt_scm_sa_order_{sid % 16}16SaOrderModel::setSid()
销售明细SCM_SA_ORDER_INFOt_scm_sa_order_info_{sid % 16}16SaOrderInfoModel::setSid()
销售出库主单SCM_SA_INVOICEt_scm_sa_invoice_0_{sid % 64}64SaInvoiceModel::setSid()
销售出库明细SCM_SA_INVOICE_INFOt_scm_sa_invoice_info_0_{sid % 64}64SaInvoiceInfoModel::setSid()
库存流水SCM_INVENTORYt_scm_inventory_0_{sid % 128}128InventoryModel, InventorySubModel
收付款主单SCM_PAYMENTt_scm_payment_{sid % 32}32PaymentModel::getPaymentSubTable()
收付款明细SCM_PAYMENT_INFOt_scm_payment_info_{sid % 32}32PaymentInfoModel::getPaymentInfoSubTable()
采购/销售账户SCM_ACCOUNT 系列需核对具体模型拼表常量定义 16SCM_ACCOUNT_SUB_NUM
动态成本日表BS_COST_PRICE_DAY前缀后拼分片16BS_COST_PRICE_DAY_NUM
盘点明细SCM_INVENTORY_CHECK_INFOt_scm_inventory_check_info{sid 个位数}10tables.php 注释和盘点实现
对账单主表T_BS_STATEMENT_BILL需按 Statement 模型确认后缀64T_BS_STATEMENT_BILL_NUM

4.1 分片计算示例

假设 sid = 1017:

对象计算实际表
采购明细1017 % 32 = 25t_scm_po_order_info_25
销售主明细1017 % 16 = 9t_scm_sa_order_9, t_scm_sa_order_info_9
销售出库1017 % 64 = 57t_scm_sa_invoice_0_57, t_scm_sa_invoice_info_0_57
库存流水1017 % 128 = 121t_scm_inventory_0_121
收付款1017 % 32 = 25t_scm_payment_25, t_scm_payment_info_25
盘点明细个位数 7物理后缀需按盘点模型确认是否带分隔符
flowchart TD
    INPUT["输入业务单号"] --> SID{"是否已知 sid"}
    SID -->|否| MAIN["先查未分片入口表、日志或来源系统"]
    SID -->|是| TYPE{"业务对象"}
    TYPE -->|采购明细| M32["sid % 32"]
    TYPE -->|销售单| M16["sid % 16"]
    TYPE -->|销售出库| M64["sid % 64"]
    TYPE -->|库存流水| M128["sid % 128"]
    M32 --> TABLE["拼出真实物理表"]
    M16 --> TABLE
    M64 --> TABLE
    M128 --> TABLE
    TABLE --> VERIFY["查询时同时过滤 sid 与 isDelete"]

4.2 分片查询的硬规则

  1. 不能在不知道 sid 时猜分表;
  2. 即使已经落到正确分表,仍要带 sid 条件;
  3. 主表和明细表可能使用不同分片规则;
  4. 部分老代码保留未分片 oldTable,不能默认新老表同时写;
  5. 跨服务站查询不能只查一个分片;
  6. 数据修复必须先输出计算出的物理表名供复核;
  7. 生产 SQL 不能把用户输入直接拼进表名或条件。

5. 通用关系键字典

字段常见含义典型关联常见误区
sid服务站/租户标识分片、权限和业务隔离只用于分表计算而忘记放进 WHERE
id当前表主键主单自身、明细行自身不同表的 id 没有天然关系
iid所属主单 ID明细 iid = 主表.id有的表使用蛇形字段或其他命名
billNo / bill_no当前单据编号主明细同单号编号可用于定位,不一定是数据库唯一键
srcOrderId来源主单 ID采购退货到原采购、出库到销售单来源类型不同但 ID 值可能碰撞
srcOrderEntryId来源明细行 ID出库明细到销售明细不能用 srcOrderId 代替行级关联
srcOrderNo来源单号外部单、原销售单、采购单上游重用单号会造成幂等风险
srcOrderType来源业务类型活动、渠道、秒杀、预订单与 orderType、transType 不是同一维度
transType交易类型库存、账户、收付款和单据方向相同状态在不同交易类型下含义不同
skuId中心 SKU 编码商品、订单、外部中心字符串编码,不宜按本地自增 ID 处理
invId / inv_id本地商品 ID订单、库存、商品主档同一 SKU 在站点侧可能对应不同本地记录
locationId仓库 IDt_bs_storage.id字段名像 location,实际常表示仓库
locationAreaId货位 IDt_bs_storage_area.id不能与仓库定位表混为一谈
buId业务对象 ID供应商或客户要结合单据类型判断角色
isDelete软删除多数业务查询固定为 0删除记录仍可能参与错误的自定义 SQL

5.1 主明细与来源关系图

erDiagram
    PO_ORDER ||--o{ PO_ORDER_INFO : "id = iid"
    PO_ORDER ||--o{ PO_INFO_QTY : "id = po_order_id"
    PO_ORDER_INFO ||--o{ PO_OUT_INFO : "id = srcOrderEntryId"
    PO_ORDER ||--o{ PU_INVOICE : "id = srcOrderId"
    PO_ORDER_INFO ||--o{ PU_INVOICE_INFO : "id = srcOrderEntryId"
    SA_ORDER ||--o{ SA_ORDER_INFO : "id = iid"
    SA_ORDER ||--o{ SA_INVOICE : "id = srcOrderId"
    SA_ORDER_INFO ||--o{ SA_INVOICE_INFO : "id = srcOrderEntryId"
    PAYMENT ||--o{ PAYMENT_INFO : "id = iid"
关系来自代码约定,不代表数据库实际存在外键约束。DGJ 老系统大量关系由应用维护,必须警惕孤儿明细。

6. 字段口径和单位

6.1 金额

场景当前代码口径注意事项
DGJ 业务表金额通常按元保存和计算仍需核对字段精度和舍入
支付中心回调多个金额字段按分传入PayCenterNotify 落付款主明细时除以 100
PoOrderPayInfo 回调字段当前代码保留上游原值与付款表比较前必须统一单位
折扣/返利/服务费分散在多个字段不能只比较 totalAmount
报表 DWD由同步层转换后统计报表口径可能晚于业务库且公式不同

6.2 数量

字段/概念含义
qty当前行原始或本次业务数量,必须结合表和 transType
wait_out_qty采购待发数量
going_out_qty采购配送中数量
sign_qty已签收数量
in_qty已入库数量
going_refund_qty待退货数量
finish_refund_qty已完成退货数量
close_qty已关闭数量
locked_qty秒杀下单锁定数量
used_qty秒杀已消费数量
实时库存 qty当前仓库货位上的结果数量

采购数量过程的理想守恒关系要结合业务分支验证:

原采购数量
= 待发 + 配送中 + 已入库 + 待退货 + 已完成退货 + 已关闭

代码中的退货流转会在字段间搬运数量,不能直接把所有字段无条件相加。专项公式以第 14、16 篇为准。

7. 基础资料域

7.1 商品、价格和物料关系

常量物理表角色关键代码字段/关系主要读写方
BS_GOODSt_bs_goods服务站商品主档id/invId, skuId, 名称、状态、分类品牌商品同步、采购、销售、库存
BS_GOODS_EXTt_bs_goods_ext商品扩展配置本地商品 ID、销售/展示扩展商品 Service、APP/E站
BS_GOODS_STOt_bs_goods_sto商品仓库配置商品、仓库、库存相关配置库存和可售计算
BS_GOODS_SALE_INVENTORYt_bs_goods_sale_inventory商品销售库存商品可销售数量或口径商品列表、销售
BS_GOODS_PURPRICEt_bs_goods_purprice商品结算价SKU、站点、价格采购价格和报表
BS_GOODS_INFOt_bs_goods_info服务站结算价配置商品、服务站、价格采购商品查询
BS_GOODS_AREA_PRICEt_bs_goods_area_price区域价格区域和商品关系区域定价
BS_COST_PRICEt_bs_cost_price动态成本当前值站点、商品、成本出库成本、利润
BS_COST_PRICE_DAYt_bs_cost_price_day_*动态成本日快照sid 分片、业务日期历史成本和报表
BS_GOODS_CHANGEt_bs_goods_change物料合并映射原编码、新编码商品替换和历史兼容
BS_GOODS_PACKAGEt_bs_goods_package套包关系主 SKU、子 SKU、比例套包库存、秒杀
BS_GOODS_SALES_PRICE_LIMITt_bs_goods_sales_price_limit销售价限制SKU、上下限、状态商品中心回调、销售校验
BS_GOODS_SIMPLE_CODEt_bs_goods_simple_code物料简码SKU、简码搜索、报价、机器人

7.2 客户、供应商、门店

常量物理表角色关键关系
BS_CONTACTt_bs_contact客户/供应商主档id = buId,通过 type 等字段区分角色
BS_CONTACT_CONFIGt_bs_contact_config客户业务配置contact_id 关联客户,含支付、报价和功能开关
BS_CONTACT_INFOt_bs_contact_info维修厂信息客户扩展资料
BS_CONTACT_EXTt_bs_contact_ext供应商扩展contactId 关联供应商
BS_CONTACT_ADDRt_bs_contact_addr收货地址contactId 关联客户/供应商
BS_CONTACT_GROUPt_bs_contact_group客户组分组规则和状态
BS_CONTACT_GROUP_MEMBERt_bs_contact_group_member客户组成员组 ID 与客户 ID
BS_STOREt_bs_store门店主档销售单 storeId
BS_STORE_EXTt_bs_store_ext门店扩展门店配置
BS_CONTACT_STORE_RELt_bs_contact_store_rel客户门店关系客户到门店多对多

7.3 仓库与货位

常量物理表含义关系
BS_STORAGEt_bs_storage仓库主档订单/库存 locationId 常指向此表
BS_STORAGE_LOCATIONt_bs_storage_location仓库定位/地址信息仓库配送定位,不等于库存货位
BS_AREAt_bs_storage_area仓内货位库存 locationAreaId
BS_AREA_RELt_bs_storage_area_rel货位映射关系关联仓库与货位,代码联查 area_id
BS_STORAGE_CONTAINERt_bs_storage_container微仓货柜移动商城微仓容器
BS_STORAGE_CONTAINER_AREAt_bs_storage_container_area货柜货位关系货柜到货位映射
erDiagram
    BS_GOODS ||--o{ BS_GOODS_STO : "商品仓配置"
    BS_GOODS ||--o{ INVENTORY_RT : "invId / skuId"
    BS_STORAGE ||--o{ BS_AREA_REL : "仓库关系"
    BS_AREA ||--o{ BS_AREA_REL : "area_id"
    BS_STORAGE ||--o{ INVENTORY_RT : "location_id"
    BS_AREA ||--o{ INVENTORY_RT : "location_area_id"
    BS_CONTACT ||--o{ BS_CONTACT_CONFIG : "contact_id"
    BS_CONTACT ||--o{ BS_CONTACT_ADDR : "contactId"
    BS_STORE ||--o{ SA_ORDER : "storeId"

8. 采购域

8.1 核心表字典

常量物理表/规则角色关键字段和关系写入时机
SCM_PO_ORDERt_scm_po_order采购主单id, sid, billNo, billStatus, orderType, srcOrderType, srcOrderId, srcOrderNo提交采购、外部订单转单、退货
SCM_PO_ORDER_EXTt_scm_po_order_ext主单扩展采购 ID、外部来源和兼容字段主单创建或外部同步
SCM_PO_ORDER_INFO32 分片商品明细id, iid, invId, skuId, qty, price, amount, srcOrderEntryId创建采购商品行
SCM_PO_ORDER_INFO_QTYt_scm_po_order_info_qty数量状态po_order_id, sku_id, is_gift 和八类过程数量创建明细时初始化,发货/入库/退货/关闭时搬运
SCM_PO_RECEIVE_TIMEt_scm_po_receive_time预计到货采购明细和预计时间订单中心同步
SCM_PO_ORDER_PAYINFOt_scm_po_order_payinfo在线支付拆分iid, billNo, 账户类型、金额、服务费支付中心成功回调
SCM_PO_OUT_INFO32 分片上游发货/在途明细来源采购行、发货数量、外部出库 ID配送/订单中心发货消息
SCM_PO_OUT_INFO_EXTt_scm_po_out_info_ext发货扩展运单、外部属性发货同步
SCM_PO_CLOSE_INFOt_scm_po_close_info关闭明细srcOrderId、关闭数量、原因整单/行关闭
SCM_PU_INVOICEt_scm_pu_invoice采购入库主单入库单号、来源采购、状态、仓库签收/入库
SCM_PU_INVOICE_INFO32 分片入库商品明细来源采购行、仓库、货位、数量、成本采购入库
SCM_PO_LOGt_scm_po_log采购操作日志采购单、动作、操作者、时间关键状态操作
SCM_PU_LOGt_scm_pu_log入库日志入库单、动作、操作者入库操作
SCM_PO_RETURN_CLOSEt_scm_po_return_close采购退货关单退货来源、关单状态外部退货关闭
SCM_PO_RETURN_ORDER_LOGISTICSt_scm_po_return_order_logistics采购退货物流退货单、承运商、运单号退货发运
SCM_PO_ORDER_ADDRESSt_scm_po_order_address客户地址快照采购单和收货地址下单时快照
SCM_PO_CARTt_scm_po_cart采购购物车服务站、用户、状态加购
SCM_PO_CART_INFOt_scm_po_cart_info购物车商品购物车、SKU、数量、历史记录加购更新
SCM_PRE_ORDERt_pre_order新预订单主表来源、支付和状态预订单下单
SCM_PRE_ORDER_INFOt_pre_order_info新预订单明细预订单、SKU、数量预订单下单

8.2 采购数据链

flowchart LR
    ORDER["采购主单\nt_scm_po_order"]
    INFO["采购明细\n32 分片"]
    QTY["数量过程\nt_scm_po_order_info_qty"]
    PAY["支付拆分\nt_scm_po_order_payinfo"]
    OUT["采购发货\n32 分片"]
    IN["采购入库主明细\n主表 + 32 分片"]
    INV["库存流水 + 实时库存"]
    CLOSE["关闭/退货/物流"]

    ORDER -->|"id=iid"| INFO
    ORDER -->|"id=po_order_id"| QTY
    ORDER --> PAY
    INFO -->|"id=srcOrderEntryId"| OUT
    INFO -->|"id=srcOrderEntryId"| IN
    OUT --> QTY
    IN --> QTY
    IN --> INV
    ORDER --> CLOSE
    CLOSE --> QTY

8.3 PoOrderInfoQtyModel 的字段搬运

动作参数增加字段减少字段业务含义
going_out_qtygoing_out_qtywait_out_qty上游已发货,进入在途
sign_qtysign_qty, in_qtygoing_out_qty签收并入库
going_refund_qty_1going_refund_qtywait_out_qty未发货商品申请退货
going_refund_qty_2going_refund_qtyin_qty已入库商品申请退货
finish_refund_qtyfinish_refund_qtygoing_refund_qty退货已完成
close_qtyclose_qtywait_out_qty未发货行关闭
cancel_refund_qty_1wait_out_qtygoing_refund_qty取消未发货退货
cancel_refund_qty_2in_qtygoing_refund_qty取消已入库退货

9. 销售、出库和配送域

9.1 核心表字典

常量物理表/规则角色关键字段和关系
SCM_SA_ORDER16 分片销售主单id, sid, billNo, buId, sourceType, billStatus, payType, srcOrderId/srcOrderNo
SCM_SA_ORDER_INFO16 分片销售商品明细iid = 销售主单.id,商品、数量、价格、来源行
SCM_SA_ORDER_INFO_EXTt_scm_sa_order_info_ext销售行扩展销售明细 ID、活动/外部属性
SCM_SA_ORDER_LOGt_scm_sa_order_log销售操作日志单据、状态动作、操作者
SCM_SA_ODER_CLOSE_INFOt_scm_sa_order_close_info销售关闭行原销售行、关闭数量和原因
SCM_SA_ORDER_ACTIVITY_RELt_scm_sa_order_activity_rel销售活动关系sa_order_id, activity_id, contact_id, sid
SCM_SA_ORDER_OFFER_RELt_scm_sa_order_offer_rel销售报价关系销售单与报价单
SCM_SA_INVOICE64 分片销售出库主单id, billNo, transType, billStatus, srcOrderId, srcOrderNo, 配送和核销字段
SCM_SA_INVOICE_INFO64 分片出库商品明细iid = 出库主单.id,srcOrderEntryId = 销售明细.id,仓库货位、数量、成本
SCM_SA_INVOICE_INFO_EXTt_scm_sa_invoice_info_ext出库行扩展外部渠道和配送扩展
SCM_SA_INVOICE_CHECKt_scm_sa_invoice_check验货记录出库单、商品、验货状态
SCM_SA_RETURN_LOGt_scm_abnormal_return_log异常退货日志原出库、退货原因、处理状态
SCM_THIRD_PARTY_DELIVERY_ORDERt_scm_third_party_delivery_order三方配送单平台、运单、配送状态
SCM_SA_INVOICE_DELIVERY_RELATIONt_sa_invoice_delivery_relation出库配送关系出库 ID 与三方配送 ID

9.2 销售到库存和财务

flowchart LR
    SA["销售主单\n16 分片"] --> SI["销售明细\n16 分片"]
    SA --> OUT["销售出库主单\n64 分片"]
    SI --> OI["销售出库明细\n64 分片"]
    OUT --> DEL["三方配送单"]
    DEL --> REL["出库配送关系"]
    OI --> INV["库存流水\n150601/150602"]
    INV --> RT["实时库存"]
    OUT --> PI["收付款明细"]
    PI --> PM["收付款主单"]
    OUT --> SYNC["dgj_notify 下游同步"]

9.3 不能混淆的三组状态

对象表回答的问题
销售单状态SCM_SA_ORDER是否待出库、部分出库、完成或关闭
出库单状态SCM_SA_INVOICE是否已过账、撤销、配送或签收
收款/核销状态SCM_PAYMENT* 和出库字段钱是否收、欠款是否核销

10. 库存域

10.1 核心表字典

常量物理表/规则数据角色关键字段/关系
SCM_INVENTORYt_scm_inventory_0_{sid % 128}当前月库存流水sid, 单据、transType, invId, skuId, 仓库货位、qty
SCM_INVENTORY_INFOt_scm_inventory_info历史兼容/明细定义实际使用范围需结合调用方确认
TH_SCM_INVENTORYth_scm_inventory往月库存归档月份和历史流水
SCM_INVENTORY_REAL_TIMEt_scm_inventory_real_time当前实时库存结果sid, inv_id, sku_id, location_id, location_area_id, area_type, qty
SCM_INVENTORY_WARNINGt_scm_inventory_warning库存预警配置商品、上限、下限
SCM_INVENTORY_CHECKt_scm_inventory_check盘点主单盘点状态、人员、时间、站点
SCM_INVENTORY_CHECK_INFO10 分片盘点商品明细账面数、实盘数、差异、商品货位
SCM_PD_CHECKt_scm_pd_check盘点控制sid, upper_limit_ratio, status
SCM_PD_REASONt_scm_pd_reason盘点原因差异原因字典
SCM_BALANCE_AMOUNTt_scm_balance_amount每日结存金额服务站、日期、结存金额

10.2 流水和实时库存的写入关系

sequenceDiagram
    participant B as 业务 Service
    participant I as InventorySer
    participant L as 128 分片库存流水
    participant R as 实时库存
    participant C as 动态成本/缓存/MQ

    B->>I: save(单据与商品仓位变化)
    I->>L: 插入过程流水
    I->>R: qty = qty + changeQty
    I->>C: 更新成本或发送库存事件
    Note over L,R: 两类事实都成功才表示库存链路完整

InventoryRealTimeModel::changeQty() 使用 INSERT ... ON DUPLICATE KEY UPDATE qty = qty + VALUES(qty)。这意味着目标环境必须存在能唯一定位“站点 + 商品 + 仓库 + 货位 + 区域类型”的唯一约束,否则可能产生重复结果行。唯一索引需用 DDL 实证确认。

10.3 库存方向

transType业务库存方向
150501采购入库增加
150502销售退货入库增加
150601销售出库减少
150602销售退货/红字出库语义结合具体实现确认符号
150706其他入库增加
150806其他出库减少
150701盘盈增加
150801盘亏减少
180510盘点形成盘点业务事实

11. 财务域

11.1 核心表字典

常量物理表/规则角色关键关系
SCM_PAYMENTt_scm_payment_{sid % 32}收付款主单id, billNo, billType, transType, buId, totalAmount, billStatus
SCM_PAYMENT_INFOt_scm_payment_info_{sid % 32}收付款业务明细iid = 主单.id,来源单 stlId/stlNo、账户、金额
SCM_PAYMENT_LOGt_scm_payment_log收付款操作日志付款单和动作
SCM_ACCOUNTt_scm_account 系列当月账户流水业务对象、账户、方向、金额
SCM_ACCOUNT_INFOt_scm_account_info账户流水清单来源单、交易类型和金额
TH_SCM_ACCOUNTth_scm_account往月账户归档历史账户事实
SCM_REPAYMENT_ORDERt_scm_repayment_order授信还款单还款单号、金额、状态、支付关系
SCM_WITHDRAW_ORDERt_scm_withdraw_order提现申请提现来源、状态和金额
SCM_PO_ORDER_PAYINFOt_scm_po_order_payinfo采购在线支付扩展采购 ID、支付类型、金额拆分

11.2 一次采购支付的落表顺序

sequenceDiagram
    participant MQ as paycenter_notify
    participant C as PayCenterNotify
    participant PO as 采购/预订单
    participant PM as Payment 32分片
    participant PI as PaymentInfo 32分片
    participant AC as Account 流水
    participant PP as PoOrderPayInfo

    MQ->>C: paycenter_pay_result
    C->>PO: 校验来源和当前状态
    C->>PM: 写付款主单
    C->>PI: 写账户/来源明细
    C->>AC: 写账户变化
    C->>PP: 保存支付拆分
    C->>PO: 推进支付状态和时间

财务排查至少要同时核对五处:业务主单、付款主单、付款明细、账户流水、采购支付扩展。只存在其中一张表不能证明完整落账。

12. 活动、赠品与秒杀域

12.1 普通活动和赠品

常量物理表角色
SALE_ACTIVITYt_sale_activity普通活动主表
SALE_ACTIVITY_PLANactivity_plan活动方案
SALE_ACTIVITY_TEMPLATEactivity_template活动模板
SALE_ACTIVITY_JOINt_sale_activity_join活动订单/参与记录
SALE_ACTIVITY_JOIN_DETAILt_sale_activity_join_detail活动参与明细
PO_ORDER_ACTIVITYpo_order_activity活动与采购单关系
GIFT_ACTIVITYt_gift_activity赠品活动主表
GIFT_ACTIVITY_GOODSt_gift_activity_goods赠品活动商品
GIFT_ACTIVITY_ORDER_RELt_gift_activity_order_rel赠品活动与订单关系
SALE_USAGESt_sale_usages活动使用记录

12.2 秒杀

常量物理表角色关键字段/关系
FLASH_ACTIVITYt_flash_activity秒杀主表时间、OA、启用、库存口径
FLASH_ACTIVITY_GOODSt_flash_activity_goods秒杀商品规则活动 ID、SKU、总量、限购、locked_qty, used_qty
FLASH_ACTIVITY_STATION_SCOPEt_flash_activity_station_scope服务站范围活动、名单类型、sid
FLASH_CARTt_flash_cart秒杀购物车站点、活动商品、数量、有效状态
FLASH_ORDERt_flash_order秒杀订单主表活动、站点、状态、采购单、支付
FLASH_ORDER_DETAILt_flash_order_detail秒杀订单商品秒杀单、活动商品、数量和价格
FLASH_ACTIVITY_LOGt_flash_activity_log活动操作日志活动、动作、操作者、结果
erDiagram
    FLASH_ACTIVITY ||--o{ FLASH_ACTIVITY_GOODS : activity_id
    FLASH_ACTIVITY ||--o{ FLASH_ACTIVITY_STATION_SCOPE : activity_id
    FLASH_ACTIVITY_GOODS ||--o{ FLASH_CART : activity_goods_id
    FLASH_ACTIVITY ||--o{ FLASH_ORDER : activity_id
    FLASH_ORDER ||--o{ FLASH_ORDER_DETAIL : order_id
    FLASH_ORDER ||--o| PO_ORDER : "采购来源关系"

秒杀库存不是 t_scm_inventory_real_time 的同义词。它至少涉及:物理可用库存、活动总量、锁定量、使用量、单站限购和购物车有效性。

13. 渠道与大客户域

常量物理表角色关键关联
CHANNEL_ORDERt_channel_order渠道订单主单平台来源单号、DGJ 销售单、状态
CHANNEL_ORDER_INFOt_channel_order_info渠道商品明细order_id、商品、数量、发货数量
CHANNEL_AFTERSALEt_channel_aftersale渠道售后主单平台售后号、原渠道单、状态
CHANNEL_AFTERSALE_INFOt_channel_aftersale_info售后商品明细售后 ID、原订单行、退货数量
CHANNEL_ORDER_SIGN_DETAILt_channel_order_sign_detail签收明细渠道订单行、签收数量
SCM_BIG_ORDERt_scm_big_order老大客户订单与新 Channel 域并存
SCM_BIG_ORDER_INFOt_scm_big_order_info老大客户明细老链路商品行
SCM_BIG_ORDER_INFO_NCt_scm_big_order_info_NC下发 NC 明细NC 同步事实
SCM_BIG_ORDER_INFO_OPSt_scm_big_order_info_ops下发 OPS 明细OPS 同步事实
flowchart LR
    EXT["DCD / FC / CZG"] --> CO["CHANNEL_ORDER"]
    CO --> CI["CHANNEL_ORDER_INFO"]
    CO --> SA["销售主明细 16 分片"]
    SA --> OUT["销售出库 64 分片"]
    OUT --> SIGN["CHANNEL_ORDER_SIGN_DETAIL"]
    CO --> AF["CHANNEL_AFTERSALE"]
    AF --> AI["CHANNEL_AFTERSALE_INFO"]
    AI --> RET["销售退货/退款"]

渠道状态使用字符串,不能按采购/销售数字枚举解释。CHS、CHR 是渠道单号前缀,180601/180602 是业务交易类型,两者也不能互换。

14. 移动商城、微仓和对账单

14.1 移动商城与微仓

常量物理表角色
BS_MOVE_MALL_USERt_bs_move_mall_user移动商城客户和服务站绑定
BS_STORAGE_CONTAINERt_bs_storage_container微仓货柜
BS_STORAGE_CONTAINER_AREAt_bs_storage_container_area货柜货位关系
BS_MOVE_STORAGE_PRICEt_bs_move_storage_price微仓商品价格
SCM_MOVE_SUPPLYt_scm_move_supply微仓补货主单
SCM_MOVE_SUPPLY_INFOt_scm_move_supply_info微仓补货明细
SCM_MOVE_RE_ORDERt_scm_move_re_order微仓退货主单
SCM_MOVE_RE_ORDER_INFOt_scm_move_re_order_info微仓退货明细
SCM_MOVE_SUPPLY_SHIELDt_scm_move_supply_shield补货屏蔽
SCM_MOVE_REPLENISH_RECORDt_scm_move_replenish_record推荐补货记录
BS_CHAT_GROUP_RELATIONt_bs_chat_group_relation微仓与微信群关系

14.2 新旧对账单

常量物理表角色
SCM_ACCOUNTS_CHECKt_scm_accounts_check旧客户对账单
SCM_ACCOUNTS_CHECK_INFOt_scm_accounts_check_info旧对账明细
T_BS_STATEMENT_BILLt_bs_statement_bill_v2V2 对账主单,配置 64 分片
T_BS_STATEMENT_BILL_DETAILt_bs_statement_bill_detail_v2对账业务明细
T_BS_STATEMENT_BILL_DETAIL_ITEMt_bs_statement_bill_detail_item_v2对账商品项
T_BS_STATEMENT_BILL_TASKt_bs_statement_bill_task_v2生成/发送任务
T_BS_STATEMENT_STRATEGYt_bs_statement_strategy_v2对账策略
T_BS_STATEMENT_STRATEGY_RELATIONt_bs_statement_strategy_relation_v2策略客户关系
T_BS_STATEMENT_SEND_RECORDt_bs_statement_send_record_v2发送记录
T_BS_NEED_STATEMENT_USERt_bs_need_statement_user待对账客户

新旧对账表并存时不能把数据简单 UNION 后求和,必须先确认是否是迁移、双写、按日期切换还是不同业务入口。

15. 报价、机器人与 AI 域

常量物理表角色
SCM_OFFER_ORDERt_scm_offer_order报价主单
SCM_OFFER_ORDER_INFOt_scm_offer_order_info报价商品明细
SCM_ROBOT_OFFER_ORDER_APPLYt_scm_robot_offer_order_apply机器人报价申请
SCM_ROBOT_CONVERSATIONt_scm_robot_conversation机器人会话
SCM_ROBOT_PRE_CONVERSATIONt_scm_robot_pre_conversation老预会话
ROBOT_CONVERSATION_PREt_robot_conversation_preRobotV2 预会话
SCM_ROBOT_CONVERSATION_RECORDt_scm_robot_conversation_record会话消息记录
SCM_ROBOT_IMAGE_PARSEt_scm_robot_image_parse图片解析记录
SCM_ROBOT_SEARCH_LOGt_scm_robot_search_log搜索日志
T_SCM_ROBOT_QUOTE_CONFIGt_scm_robot_quote_config报价范围主配置
T_SCM_ROBOT_QUOTE_CONFIG_INFOt_scm_robot_quote_config_info报价范围明细
SCM_QUOTE_RANGEt_scm_quote_rangeAI 报价范围
SCM_QUOTE_RANGE_CONFIGt_scm_quote_range_config报价关联配置
SCM_QUOTE_RANGE_CONFIG_INFOt_scm_quote_range_config_info报价配置明细
SCM_QUOTE_RANGE_CONTACTt_scm_quote_range_contact报价范围客户
T_SCM_ROBOT_QUOTE_REPLAY_CONFIGt_scm_robot_quote_replay_config报价回复配置
T_SCM_ROBOT_ORDER_QTY_CONFIGt_scm_robot_order_qty_config机器人下单数量配置

会话表、预会话表和消息记录表不是同一生命周期。排查“机器人回复了但没有报价单”时要按“入站消息 -> 会话/预会话 -> 意图/搜索日志 -> 报价申请 -> 报价主明细 -> 销售单”逐层查。

16. 系统、权限和终端域

常量物理表角色
SYS_ADMINt_sys_admin系统用户
SYS_ADMIN_CONFIGt_sys_admin_config员工账号配置
ACL_SYS_RESOURCEt_acl_sys_resource新资源定义
ACL_SYS_RESOURCE_RULEt_acl_sys_resource_rule资源授权规则
SYS_MENUt_sys_menu功能菜单和权限
SYS_MENU_DATAt_sys_menu_data数据权限
SYS_MENU_CONFIGt_sys_menu_config菜单控制
SYS_OPS_MENU_RULE_NEWt_sys_ops_menu_rule_newOPS 新菜单规则
SYS_OPS_WHITELISTt_sys_ops_whitelist服务站白名单
SYS_STATION_CONFIGt_sys_station_config站点配置键值
SYS_LOGt_sys_log服务站操作日志
SYS_APIS_LOG*t_sys_apis_log*多张接口日志表
SYS_INNER_TOKENt_sys_inner_token内部用户令牌
APP_DEVICEt_app_deviceAPP 登录设备
SYS_PC_AUTHSt_sys_pc_authsPC 授权
SYS_PC_MACHINESt_sys_pc_machines机器码绑定
SYS_PC_LOGIN_CONTROLt_sys_pc_login_controlPC 登录控制
SYS_PDA_OPTION_LOGt_sys_pda_option_logPDA 操作日志

权限可见性通常是资源、菜单、用户、数据权限、站点版本、OPS 规则和白名单共同计算的结果,不能只改 t_sys_menu。

17. 其他仓储和专项单据索引

业务主表明细/辅助表说明
其他出入库SCM_OI_INVOICESCM_OI_INVOICE_INFO, SCM_OI_LOG交易类型决定入库或出库
站内调拨SCM_TF_INVOICESCM_TF_INVOICE_INFO, SCM_TF_LOG同服务站仓库间调拨
站间调拨SCM_STF_INVOICESCM_STF_INVOICE_INFO两个服务站、在途和双边库存
调拨申请SCM_STF_APPLYSCM_STF_APPLY_INFO申请与实际调拨单分开
成本调整SCM_UPDATE_COSTSCM_UPDATE_COST_INFO影响成本和利润
不良品SCM_BADGOODS仓位 area_type不良品数量和仓位
拆包出库SCM_PACKAGE_ORDERSCM_PACKAGE_ORDER_INFO套包拆分和库存
退货申请SCM_APPLY_RETURN_ORDERSCM_APPLY_RETURN_ORDER_INFO审核申请,不等于已退货入账
首配BS_DELIVERY_PLAN模板、模板项、商品方案配置转采购
轮胎理赔TYRE_REGISTRATIONTYRE_CLAIM, TYRE_PROPERTY, BS_IMAGE登记、理赔、属性和图片
C端活动MKT_CLIENT_ACTIVITY商品、关系、图片、申请C端营销专区
优惠券MKT_CLIENT_COUPON_TEMPLATESMKT_CLIENT_COUPON_SEND_LOG模板与发放记录
帮助中心HELP_QUESTIONHELP_ANSEWER, HELP_QUESTION_LIB问答和题库
知识库KNOWLEDGEKNOWLEDGE_CATEGORY, KNOWLEDGE_COLLECT内容、分类、收藏

18. 从单号开始的查询路径

18.1 采购单号

flowchart TD
    N["采购单号 / 外部来源单号"] --> P["t_scm_po_order"]
    P --> S["取得 sid、id、状态、来源类型"]
    S --> I["采购明细 sid%32"]
    S --> Q["数量状态表"]
    S --> O["发货明细 sid%32"]
    S --> U["入库主表 + 明细 sid%32"]
    S --> F["付款 sid%32 + payinfo"]
    U --> V["库存流水 sid%128 + 实时库存"]

18.2 销售或出库单号

flowchart TD
    N["销售单 / 出库单 / 来源单号"] --> S16["销售主单 sid%16"]
    S16 --> I16["销售明细 sid%16"]
    S16 --> O64["出库主单 sid%64"]
    O64 --> I64["出库明细 sid%64"]
    O64 --> D["配送关系和三方配送单"]
    O64 --> P32["收款主明细 sid%32"]
    I64 --> V128["库存流水 sid%128"]
    V128 --> RT["实时库存"]

19. 可直接复用的只读 SQL

以下 SQL 只作为结构模板。执行前替换站点和单号,确认库名、字段名及权限;生产默认只读。

19.1 计算分片

SET @sid = 1017;
SELECT
    @sid % 16  AS sa_order_shard,
    @sid % 32  AS po_payment_shard,
    @sid % 64  AS sa_invoice_shard,
    @sid % 128 AS inventory_shard,
    @sid % 10  AS inventory_check_shard;

19.2 采购主单和明细

SET @sid = 1017;
SET @bill_no = 'CG_REPLACE_ME';

SELECT id, sid, billNo, billStatus, orderType, srcOrderType,
       srcOrderId, srcOrderNo, payment, totalQty, totalAmount,
       createTime, modifyTime, isDelete
FROM t_scm_po_order
WHERE sid = @sid AND billNo = @bill_no;

-- @sid % 32 = 25 时:
SELECT id, iid, billNo, invId, skuId, qty, price, amount,
       srcOrderEntryId, srcOrderId, srcOrderNo, isGift, isDelete
FROM t_scm_po_order_info_25
WHERE sid = @sid AND billNo = @bill_no;

19.3 采购数量过程

SELECT po_order_id, bill_no, sku_id, is_gift, qty,
       wait_out_qty, going_out_qty, sign_qty, in_qty,
       going_refund_qty, finish_refund_qty, close_qty
FROM t_scm_po_order_info_qty
WHERE po_order_id = :po_order_id;

检查负数和明显超量:

SELECT *
FROM t_scm_po_order_info_qty
WHERE po_order_id = :po_order_id
  AND (
      wait_out_qty < 0 OR going_out_qty < 0 OR in_qty < 0 OR
      going_refund_qty < 0 OR finish_refund_qty < 0 OR close_qty < 0
  );

19.4 销售与出库

-- @sid % 16 = 9
SELECT id, sid, billNo, buId, sourceType, billStatus, payType,
       srcOrderId, srcOrderNo, totalAmount, createTime, isDelete
FROM t_scm_sa_order_9
WHERE sid = @sid AND billNo = :sa_bill_no;

SELECT id, iid, billNo, invId, skuId, qty, price, amount,
       srcOrderEntryId, srcOrderId, srcOrderNo, isDelete
FROM t_scm_sa_order_info_9
WHERE sid = @sid AND iid = :sa_order_id;

-- @sid % 64 = 57
SELECT id, sid, billNo, billStatus, transType, srcOrderId,
       srcOrderNo, totalQty, totalAmount, amount, hxStateCode, isDelete
FROM t_scm_sa_invoice_0_57
WHERE sid = @sid AND (billNo = :invoice_no OR srcOrderNo = :sa_bill_no);

19.5 库存流水与实时库存

-- @sid % 128 = 121
SELECT id, sid, billNo, transType, invId, skuId,
       locationId, locationAreaId, qty, createTime, isDelete
FROM t_scm_inventory_0_121
WHERE sid = @sid
  AND skuId = :sku_id
  AND createTime >= :start_time
ORDER BY id;

SELECT id, sid, inv_id, sku_id, location_id, location_area_id,
       area_type, qty
FROM t_scm_inventory_real_time
WHERE sid = @sid AND sku_id = :sku_id
ORDER BY location_id, location_area_id, area_type;

19.6 收付款

-- @sid % 32 = 25
SELECT id, sid, billNo, billType, transType, buId,
       totalAmount, billStatus, srcOrderId, srcOrderNo,
       createTime, isDelete
FROM t_scm_payment_25
WHERE sid = @sid
  AND (billNo = :payment_no OR srcOrderNo = :source_order_no);

SELECT id, iid, sid, billNo, transType, amount, diffAmount,
       accId, wayId, stlId, stlNo, buId, isDelete
FROM t_scm_payment_info_25
WHERE sid = @sid AND iid = :payment_id;

19.7 孤儿明细巡检

-- 示例:销售主明细使用同一 16 分片。
SELECT i.id, i.iid, i.billNo
FROM t_scm_sa_order_info_9 i
LEFT JOIN t_scm_sa_order_9 o ON o.id = i.iid
WHERE i.sid = @sid
  AND i.isDelete = 0
  AND o.id IS NULL
LIMIT 100;

20. 代码检索命令

20.1 从表常量找读写方

rg -n "SCM_PO_ORDER_INFO|SCM_PO_ORDER_INFO_QTY" application
rg -n "SCM_SA_ORDER_INFO|SCM_SA_INVOICE_INFO" application
rg -n "SCM_INVENTORY_REAL_TIME|SCM_INVENTORY_SUB_NUM" application
rg -n "SCM_PAYMENT|SCM_PAYMENT_INFO|SCM_ACCOUNT" application

20.2 找动态表名

rg -n "sid.*%|%.*SUB_NUM|_0_.*sid|setSid\(" application/models application/Services application/service

20.3 找关系字段

rg -n "srcOrderId|srcOrderEntryId|srcOrderNo|sourceType|srcOrderType" application/Services application/service application/models

20.4 找写操作

rg -n "insert_batch|->insert\(|->update\(|ON DUPLICATE KEY" application/models application/Services application/service

21. 常见故障与数据表现

现象优先检查常见原因
主单有,明细查不到sid 和分片计算查了未分片表或错误后缀
采购显示在途但不能入库po_order_info_qty、发货明细going_out_qty 未更新或来源行不匹配
入库单存在但库存没增加入库明细、库存流水、实时库存业务单落库后库存事务失败或回滚边界不一致
销售单已完成但没有出库单销售主明细和出库分表srcOrderId/srcOrderEntryId 断链
出库存在但三方配送查不到配送关系表外部单创建失败或关系写入失败
支付成功但付款单不存在Payment 分片和回调日志单位/状态校验失败、事务回滚、查错分片
付款单存在但采购仍待支付采购状态和事务后任务部分落账、状态推进失败或重复回调
实时库存与流水合计不同月份、历史归档、软删除、货位漏流水、重复实时更新、归档边界或修复脚本
秒杀余量不对活动商品、购物车、秒杀单、采购单锁定/使用/释放补偿漏执行
报表与业务表不一致DWD 延迟和过滤状态同步延迟、口径不同、站点参数错误
权限改了不生效资源、菜单、规则、缓存只改一层或缓存未失效

22. 数据修复前的安全门槛

  1. 明确环境、库、sid、单号和真实分表;
  2. 先保存只读查询结果和受影响行数;
  3. 画出主表、明细、过程表、流水和当前结果的关系;
  4. 明确哪个表是源事实,不能用结果表反向覆盖源事实;
  5. 确认是否有 MQ、缓存、DWD、搜索索引和外部系统需要同步;
  6. 设计幂等条件,重复执行不能重复加减数量或金额;
  7. 小范围事务执行,检查影响行数;
  8. 修复后按业务页面、SQL、日志和下游四层验证;
  9. 保留回滚 SQL,但不要把回滚理解成无条件反向加减;
  10. 将原因、SQL、验证证据沉淀到第 47 篇数据修复治理文档。
flowchart TD
    FOUND["发现数据差异"] --> READ["只读取证:主明细/流水/日志"]
    READ --> SOURCE{"确定源事实了吗"}
    SOURCE -->|否| STOP["停止写库,继续核对"]
    SOURCE -->|是| PLAN["修复方案 + 幂等 + 回滚 + 影响面"]
    PLAN --> REVIEW["双人复核表名、sid、行数"]
    REVIEW --> EXEC["事务执行"]
    EXEC --> VERIFY["业务库 + 页面 + MQ + 报表验证"]
    VERIFY --> DOC["记录证据与长期修复"]

23. 表结构变更风险矩阵

变更风险必须验证
新增非空字段老写入路径缺字段默认值、历史行、批量插入、同步脚本
修改状态字段类型枚举比较失效字符串/整数比较、索引、消息 payload
修改金额精度舍入和对账差异支付、退款、核销、报表、导出
修改数量类型小数/负数被截断套包、称重类商品、退货、库存
新增唯一索引历史脏数据导致 DDL 失败重复行巡检、并发写入和幂等键
修改分片数新旧路由分裂历史路由、双读、迁移、回滚
删除旧表兼容老代码仍读 oldTable全仓调用方和定时任务
修改 isDelete 语义软删数据重现或漏统计所有自定义 SQL、报表和缓存
重命名关系字段主明细断链Controller、Service、Model、MQ、DWD
给大表加索引锁表和存储膨胀在线 DDL、执行计划、回滚窗口

24. 回归清单

24.1 分表

  • 用 sid 分别覆盖 16、32、64、128 的不同余数;
  • 新增、查询、更新、软删都落到相同分片;
  • 主单和明细按各自规则正确联查;
  • 跨站点任务不会只处理当前登录站点;
  • 旧表兼容读取不会造成重复数据。

24.2 采购

  • 普通采购、退货、预订单、秒杀转采购、赠品采购;
  • 待发、在途、入库、关闭、退货数量守恒;
  • 采购发货和入库来源行能追到原明细;
  • 在线支付拆分与采购金额一致;
  • 主单、明细、数量状态和日志同步。

24.3 销售

  • 销售创建、部分出库、全部出库、关闭和销退;
  • 销售明细与出库明细逐行关联;
  • 活动、报价和渠道来源关系不丢;
  • 三方配送关系可追溯;
  • 收款、核销、欠款和出库状态独立正确。

24.4 库存

  • 采购入库、销售出库、销售退货、采购退货;
  • 其他出入库、盘盈盘亏、站内/站间调拨;
  • 流水和实时库存同事务或具备补偿;
  • 普通仓位和不良品仓位分开;
  • 月末归档后当前月与历史查询连续。

24.5 财务、活动和外部链路

  • 付款主明细、账户、业务单金额单位一致;
  • 重复支付消息不会重复落账;
  • 秒杀锁量、使用、释放和采购关系完整;
  • 渠道订单、签收、售后到 DGJ 单据可双向追溯;
  • MQ、缓存、搜索和 DWD 不因字段变更失效。

25. 代码证据索引

结论证据
全部表常量和分片数application/config/tables.php
采购 32 分片和字段application/models/orders/PoOrderInfoModel.php
采购发货 32 分片application/models/orders/PoOutInfoModel.php
采购过程数量搬运application/models/orders/PoOrderInfoQtyModel.php
销售主明细 16 分片application/models/saOrders/SaOrderModel.php, SaOrderInfoModel.php
销售出库主明细 64 分片application/models/saOrders/SaInvoiceModel.php, SaInvoiceInfoModel.php
库存流水 128 分片application/models/bs/InventoryModel.php, InventorySubModel.php
实时库存原子加减application/models/bs/InventoryRealTimeModel.php
收付款 32 分片application/models/payment/PaymentModel.php, PaymentInfoModel.php
库存统一写入application/Services/Storage/InventorySer.php
支付中心落表application/controllers/tasks/PayCenterNotify.php
秒杀读写application/Services/Activity/FlashSaleSer.php 和 models/activity/*
渠道订单/售后application/controllers/tasks/ChannelOrderNotify.php, models/channel/*

26. 仍需环境确认

  1. 核心表完整 SHOW CREATE TABLE,尤其字段类型、默认值和唯一索引;
  2. 各环境是否都已经完成采购、销售、出库、付款和库存分表迁移;
  3. oldTable 的真实读写范围及历史数据截止日期;
  4. 账户表的实际分片规则和新旧月表切换方式;
  5. 库存实时表的唯一键是否覆盖 area_type;
  6. 盘点明细真实表名的分隔符和路由实现;
  7. V2 对账单 64 分片的真实后缀规则;
  8. 当前月流水转 th_* 历史表的任务、时间点和失败补偿;
  9. DWD 从业务表抽取的增量键、删除同步和延迟 SLA;
  10. 表结构变更是否有统一在线 DDL、灰度和回滚规范;
  11. 重复常量与物理表别名是否可以安全收敛;
  12. 是否存在未写入 tables.php、仅在 Model 中硬编码的生产业务表。

这些环境证据确认后,应把 DDL 摘要、索引和实际路由回填本文;本文不会把静态代码推断伪装成生产数据库事实。

请求-日志-数据变更追踪卡

多入口请求链路

场景调用方与入口请求载荷/上下文Controller/ConsumerService/Provider汇合点最终业务事实
单据写入PC/App/Inner/OpenAPIsid、业务单号、主明细参数领域 Controller领域 Service + Modeltables.php 常量映射的主表/明细表一张主单、多条明细和扩展/关系事实
库存写入采购、销售、退货、调拨、盘点业务单号、SKU、仓位、数量、transType各业务入口InventorySer库存主单、分片明细、实时表过程流水与当前库存共同成立
资金写入支付/收款页面或支付 MQ来源单号、支付单号、金额、账户财务 Controller/ConsumerPayment/Account Service支付、账户、业务关系表资金过程与订单状态关联
异步关系写入MQ/外部回调/补偿任务消息键、外部单号、状态tasks/*Provider/领域 Service关系表、日志表、业务主表外部结果映射为本地状态

日志证据矩阵

链路段日志来源可检索锚点成功信号失败信号与下一段关联方式
请求入口Web/Inner/OpenAPI 日志request_id、URI、sid、业务单号命中目标方法并返回主键路由/鉴权/校验失败主键与表主记录关联
Model 写入Service 异常与数据库日志Model 类、物理表、主键、SQL 错误影响行数符合预期并 commitduplicate、deadlock、rollback用主表 PK/FK 查明细与关系表
分片访问分片 Model 与 SQL 日志业务主键、分片键、后缀命中正确分片查错分片、主明细数量不一致分片规则 + 主单键对账
异步更新Consumer/Provider 日志message ID、业务键、外部单号ACK 且目标行状态变化NACK、找不到关系、旧消息回退外部单号映射本地主键

环节数据变更台账

步骤代码位置事务读取事实写入表/缓存/MQ字段或数量变化回查证据
定位物理表application/config/tables.php + Model事务外常量、Model 构造、分片键无常量名 -> 物理表名;不能只凭类名猜表rg -n "TABLE_CONST|tableName"
写主单领域 Service + 主 Model本地事务来源唯一性、当前状态主表insert 或 status: old -> newPK、sid、billNo、来源单号
写明细/扩展明细 Model与主单同事务为目标主单 PK、商品/金额/数量_INFO、_EXT、关系表insert/update/delete;明细合计应回到主表FK、明细条数、数量金额合计
写过程事实库存/资金/状态日志 Model领域事务或独立异步事务当前累计量、消息业务键流水/日志/分片表累计值 old -> old +/- n,过程记录 insert流水净额、消息幂等键
同步派生层MqSer、Cache、Search、Reportcommit 后异步已提交 OLTP 事实MQ、Redis、ES/HologresOLTP 不再改变;派生层逐步追平消费 ACK、缓存值、数据日期

子模块级独立追踪

子模块追踪:base-tables 基础资料域表

环节入口/触发请求/业务键代码链路读取事实写入与字段变化日志证据异常与补偿
定位读取商品、客户、供应商、仓库和货位请求request ID、sid、skuId/invId、contact/storage/location IDapplication/config/tables.php -> basedata Controller/Service -> Goods/Contact/Storage ModelBS_GOODS/EXT/STO、BS_CONTACT、BS_STORE、BS_STORAGE/LOCATION查询只读,不写业务表;逻辑 ID -> 物理表/关联键request ID + sid + 主键/编码查错 sid、逻辑删除或站点扩展会误判不存在;先核主表再核站点表
维护同步基础资料保存或商品中心事件message/request ID、业务主键、versionapplication/controllers/basedata/* / tasks/ItemCenterNotify.php -> Service/Model唯一键、当前 status/version、引用关系配置事务 insert/update,名称、属性、状态 old -> new;缓存索引 commit 后异步主键/编码 + operator/message ID + update time重复事件按版本幂等;派生失败只补缓存索引,不重写主表

子模块追踪:purchase-tables 采购域表

环节入口/触发请求/业务键代码链路读取事实写入与字段变化日志证据异常与补偿
主明细定位采购保存、提交、支付、出入库、关闭/退货sid、billNo/id、source order、SKUapplication/controllers/scm/InvPo.php -> InvPoService/PoOrderSer -> ModelsSCM_PO_ORDER/EXT/INFO/INFO_QTY、地址和来源关系领域事务 insert/update;status/qty/amount old -> newrequest ID + billNo + source order + SKU必须同时查主、明细和数量表;只改主状态不能恢复过程事实
过程表支付、发货、关闭、退货物流payOrderNo、PO billNo、SKU、logistics noapplication/controllers/tasks/PayCenterNotify.php / 采购 Service -> process ModelsSCM_PO_ORDER_PAYINFO、SCM_PO_OUT_INFO、SCM_PO_CLOSE_INFO、退货物流表过程记录 insert,累计量 old -> old+n;异步回调按业务键幂等PO/pay/logistics/message IDs主表与过程量冲突以过程事实和外部终态仲裁,补缺失过程而非猜状态

子模块追踪:sale-tables 销售与出库域表

环节入口/触发请求/业务键代码链路读取事实写入与字段变化日志证据异常与补偿
销售订单PC/E站/App/渠道创建销售sid、sale billNo、source order、customer、SKUapplication/Services/SaOrders/SaOrderSer.php -> Sale ModelsSCM_SA_ORDER/INFO/INFO_EXT销售事务 insert/update,订单状态、订购量、应收 old -> newrequest ID + source/sale billNo来源单唯一性防重复;主明细金额数量必须闭合
出库配送销售出库、配送和签收sale/invoice/delivery IDs、SKU、qtyapplication/Services/SaOrders/SaInvoiceSer.php / ThirdDeliverySer.phpSCM_SA_INVOICE/INFO/EXT、SCM_THIRD_PARTY_DELIVERY_ORDER、配送关系出库/消费事务 insert/update;outQty old -> old+n,delivery status 单向推进invoice/delivery/message IDs外部配送与本地事务非原子;只补关系/状态,不重做已完成出库

子模块追踪:inventory-tables 库存域表与分片

环节入口/触发请求/业务键代码链路读取事实写入与字段变化日志证据异常与补偿
流水所有库存动作business bill、sid、SKU/invId、transType、date/shardapplication/Services/Storage/InventorySer.php -> InventoryModel/SubModelSCM_INVENTORY 与 128 分片 SCM_INVENTORY_INFO、历史 TH_SCM_INVENTORY外层事务 insert 主单/分片明细,qty=本次 +n/-nbillNo + transType + inventory ID + shard分片规则、跨月归档要先确认;主单有明细无按原业务键补断点
当前量流水同事务增减/库存查询四维键 sid+invId/skuId+storage+locationapplication/models/bs/InventoryRealTimeModel.phpSCM_INVENTORY_REAL_TIME 当前 qty原子 update/insert,qty old -> old+delta;预警表另行派生four-dimension key + affected rows实时与流水差异不能只改实时表;以基准+净流水重建并保留补偿证据

子模块追踪:finance-tables 财务域表

环节入口/触发请求/业务键代码链路读取事实写入与字段变化日志证据异常与补偿
支付单付款/收款发起与 PayCenter 回调payOrderNo、source bill、amount、payment typeapplication/controllers/tasks/PayCenterNotify.php -> PaymentModel/PaymentInfoModelSCM_PAYMENT/INFO 和来源支付关系财务事务 insert/update;status pending -> confirmed/failed,paid old -> old+npayOrderNo + source bill + message ID同支付单只能一次落账;外部成功本地失败按原 payOrderNo 补偿
账户分录核销、退款、还款和额度调整account ID、finance bill、original pay/refund IDapplication/service/scm/AccountService.php / 财务 ServiceSCM_ACCOUNT/INFO、SCM_REPAYMENT_ORDER余额/已核销/已退 old +/- n,分录 insert;事务内保持金额守恒finance/original bill + account + before/after不单改余额;正反流水、来源关系与外部最终态必须一起验收

子模块追踪:activity-tables 活动与秒杀域表

环节入口/触发请求/业务键代码链路读取事实写入与字段变化日志证据异常与补偿
活动配置普通/赠品/秒杀 OPS 保存activity ID、SKU、sid scope、versionapplication/Services/Activity/FlashActivitySer.php 及活动 ServiceSALE_ACTIVITY、GIFT_ACTIVITY/GOODS、FLASH_ACTIVITY/GOODS/STATION_SCOPE配置事务 insert/update,status/config old -> newactivity + SKU/sid + operator草稿/审批状态限制写入;范围和商品集合应同事务或可回滚
交易数量秒杀加购、下单、支付、关闭cart/flash/PO/pay IDs、SKU、qtyapplication/Services/Activity/FlashSaleSer.phpFLASH_CART/ORDER/DETAIL 与采购来源关系locked/used/released old +/- n,order status 单向推进activity/cart/flash/PO/pay IDs按稳定关系幂等;数量守恒优先于单一状态字段

子模块追踪:channel-tables 渠道与大客户域表

环节入口/触发请求/业务键代码链路读取事实写入与字段变化日志证据异常与补偿
渠道意图外部下单/人工代建channel、source order、local channel order、SKUapplication/Services/Channel/BaseOrder.phpCHANNEL_ORDER/INFO 和客户/站点绑定渠道事务 insert/update;status、shipped_num old -> newchannel + source/local order外部单号必须幂等;不能只看渠道表忽略内部事实单
售后事实售后申请、审核、退货入库/退款source aftersale、original order、internal return/refund IDsapplication/Services/Channel/BaseAftersale.phpCHANNEL_AFTERSALE/INFO、签收明细和内部退货/库存/资金apply/return/refund qty old -> old+n;状态单向推进aftersale/original/internal IDs本地与外部部分成功按关系补断点,禁止整链重放

子模块追踪:move-tables 移动商城、微仓与对账域表

环节入口/触发请求/业务键代码链路读取事实写入与字段变化日志证据异常与补偿
移动/微仓E站下单、补货、调拨、移动退货source/supply/transfer/return bill、two sids、SKUapplication/Services/MoveMall/* -> 销售/调拨/库存 ServiceSCM_MOVE_MAIN、移动关系和销售/库存事实领域事务 insert/update,status/qty old -> newsource/internal bills + transType跨域关系串联分段补偿;两站库存和在途守恒
对账单策略任务生成、发送、收款同步strategy/task/bill/send IDs、period、source invoicesapplication/Services/Statement/*strategy/relation/task、bill/detail/item、send recordtask/status/retry/received amount old -> new;文件/发送异步task/bill/send + source invoice三层快照和来源金额闭合;发送失败不重建账单

子模块追踪:system-tables 系统、权限、机器人与专项表

环节入口/触发请求/业务键代码链路读取事实写入与字段变化日志证据异常与补偿
权限系统菜单加载、授权、白名单/迁移user/role/resource/menu ID、sid、batchapplication/Services/MenuRule/MenuRuleSer.php / System ServiceACL_SYS_RESOURCE/RULE、SYS_MENU*、SYS_OPS_MENU_RULE*、SYS_OPS_WHITELIST配置事务关系增删、status/order old -> newuser/resource/menu + operator/batch权限缓存与 DB 分层验证;迁移重复批次不重复关系
机器人专项IM/RobotV2 会话、报价和图片回调message/request/conversation/offer IDsapplication/Services/MoveMall/RobotV2/* / AI ServiceSCM_ROBOT_CONVERSATION/PRE/RECORD、报价配置/订单会话 state/context old -> new,record insert;外部 AI 异步conversation + request/message ID重复消息/回调 0 副作用;不同版本表不能按名称混查