1. 文档目标
本文不是 application/config/tables.php 的机械复制,而是 DGJ2.0 的数据导航手册。它要回答:
- 一个业务现象应该先查哪张主表;
- 主表、明细表、数量过程表、库存流水、支付表怎样关联;
- 知道
sid后怎样算出真实分表; id、iid、srcOrderId、srcOrderEntryId、billNo、srcOrderNo分别表达什么;- 哪些表是业务事实、过程事实、当前结果、配置或日志;
- 表中金额、数量、状态和软删除字段怎样解释;
- 改一张公共表时需要回归哪些上下游。
适用场景:
- 新人理解 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_INFO | t_scm_po_order_info_{sid % 32} | 32 | PoOrderInfoModel::getPoInfoSubTable() |
| 采购发货明细 | SCM_PO_OUT_INFO | t_scm_po_out_info_{sid % 32} | 32 | PoOutInfoModel::getPoOutInfoTable() |
| 采购入库明细 | SCM_PU_INVOICE_INFO | t_scm_pu_invoice_info_{sid % 32} | 32 | SCM_PU_INVOICE_NUM 和调用方拼表 |
| 销售主单 | SCM_SA_ORDER | t_scm_sa_order_{sid % 16} | 16 | SaOrderModel::setSid() |
| 销售明细 | SCM_SA_ORDER_INFO | t_scm_sa_order_info_{sid % 16} | 16 | SaOrderInfoModel::setSid() |
| 销售出库主单 | SCM_SA_INVOICE | t_scm_sa_invoice_0_{sid % 64} | 64 | SaInvoiceModel::setSid() |
| 销售出库明细 | SCM_SA_INVOICE_INFO | t_scm_sa_invoice_info_0_{sid % 64} | 64 | SaInvoiceInfoModel::setSid() |
| 库存流水 | SCM_INVENTORY | t_scm_inventory_0_{sid % 128} | 128 | InventoryModel, InventorySubModel |
| 收付款主单 | SCM_PAYMENT | t_scm_payment_{sid % 32} | 32 | PaymentModel::getPaymentSubTable() |
| 收付款明细 | SCM_PAYMENT_INFO | t_scm_payment_info_{sid % 32} | 32 | PaymentInfoModel::getPaymentInfoSubTable() |
| 采购/销售账户 | SCM_ACCOUNT 系列 | 需核对具体模型拼表 | 常量定义 16 | SCM_ACCOUNT_SUB_NUM |
| 动态成本日表 | BS_COST_PRICE_DAY | 前缀后拼分片 | 16 | BS_COST_PRICE_DAY_NUM |
| 盘点明细 | SCM_INVENTORY_CHECK_INFO | t_scm_inventory_check_info{sid 个位数} | 10 | tables.php 注释和盘点实现 |
| 对账单主表 | T_BS_STATEMENT_BILL | 需按 Statement 模型确认后缀 | 64 | T_BS_STATEMENT_BILL_NUM |
4.1 分片计算示例
假设 sid = 1017:
| 对象 | 计算 | 实际表 |
|---|---|---|
| 采购明细 | 1017 % 32 = 25 | t_scm_po_order_info_25 |
| 销售主明细 | 1017 % 16 = 9 | t_scm_sa_order_9, t_scm_sa_order_info_9 |
| 销售出库 | 1017 % 64 = 57 | t_scm_sa_invoice_0_57, t_scm_sa_invoice_info_0_57 |
| 库存流水 | 1017 % 128 = 121 | t_scm_inventory_0_121 |
| 收付款 | 1017 % 32 = 25 | t_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 分片查询的硬规则
- 不能在不知道
sid时猜分表; - 即使已经落到正确分表,仍要带
sid条件; - 主表和明细表可能使用不同分片规则;
- 部分老代码保留未分片
oldTable,不能默认新老表同时写; - 跨服务站查询不能只查一个分片;
- 数据修复必须先输出计算出的物理表名供复核;
- 生产 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 | 仓库 ID | t_bs_storage.id | 字段名像 location,实际常表示仓库 |
locationAreaId | 货位 ID | t_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_GOODS | t_bs_goods | 服务站商品主档 | id/invId, skuId, 名称、状态、分类品牌 | 商品同步、采购、销售、库存 |
BS_GOODS_EXT | t_bs_goods_ext | 商品扩展配置 | 本地商品 ID、销售/展示扩展 | 商品 Service、APP/E站 |
BS_GOODS_STO | t_bs_goods_sto | 商品仓库配置 | 商品、仓库、库存相关配置 | 库存和可售计算 |
BS_GOODS_SALE_INVENTORY | t_bs_goods_sale_inventory | 商品销售库存 | 商品可销售数量或口径 | 商品列表、销售 |
BS_GOODS_PURPRICE | t_bs_goods_purprice | 商品结算价 | SKU、站点、价格 | 采购价格和报表 |
BS_GOODS_INFO | t_bs_goods_info | 服务站结算价配置 | 商品、服务站、价格 | 采购商品查询 |
BS_GOODS_AREA_PRICE | t_bs_goods_area_price | 区域价格 | 区域和商品关系 | 区域定价 |
BS_COST_PRICE | t_bs_cost_price | 动态成本当前值 | 站点、商品、成本 | 出库成本、利润 |
BS_COST_PRICE_DAY | t_bs_cost_price_day_* | 动态成本日快照 | sid 分片、业务日期 | 历史成本和报表 |
BS_GOODS_CHANGE | t_bs_goods_change | 物料合并映射 | 原编码、新编码 | 商品替换和历史兼容 |
BS_GOODS_PACKAGE | t_bs_goods_package | 套包关系 | 主 SKU、子 SKU、比例 | 套包库存、秒杀 |
BS_GOODS_SALES_PRICE_LIMIT | t_bs_goods_sales_price_limit | 销售价限制 | SKU、上下限、状态 | 商品中心回调、销售校验 |
BS_GOODS_SIMPLE_CODE | t_bs_goods_simple_code | 物料简码 | SKU、简码 | 搜索、报价、机器人 |
7.2 客户、供应商、门店
| 常量 | 物理表 | 角色 | 关键关系 |
|---|---|---|---|
BS_CONTACT | t_bs_contact | 客户/供应商主档 | id = buId,通过 type 等字段区分角色 |
BS_CONTACT_CONFIG | t_bs_contact_config | 客户业务配置 | contact_id 关联客户,含支付、报价和功能开关 |
BS_CONTACT_INFO | t_bs_contact_info | 维修厂信息 | 客户扩展资料 |
BS_CONTACT_EXT | t_bs_contact_ext | 供应商扩展 | contactId 关联供应商 |
BS_CONTACT_ADDR | t_bs_contact_addr | 收货地址 | contactId 关联客户/供应商 |
BS_CONTACT_GROUP | t_bs_contact_group | 客户组 | 分组规则和状态 |
BS_CONTACT_GROUP_MEMBER | t_bs_contact_group_member | 客户组成员 | 组 ID 与客户 ID |
BS_STORE | t_bs_store | 门店主档 | 销售单 storeId |
BS_STORE_EXT | t_bs_store_ext | 门店扩展 | 门店配置 |
BS_CONTACT_STORE_REL | t_bs_contact_store_rel | 客户门店关系 | 客户到门店多对多 |
7.3 仓库与货位
| 常量 | 物理表 | 含义 | 关系 |
|---|---|---|---|
BS_STORAGE | t_bs_storage | 仓库主档 | 订单/库存 locationId 常指向此表 |
BS_STORAGE_LOCATION | t_bs_storage_location | 仓库定位/地址信息 | 仓库配送定位,不等于库存货位 |
BS_AREA | t_bs_storage_area | 仓内货位 | 库存 locationAreaId |
BS_AREA_REL | t_bs_storage_area_rel | 货位映射关系 | 关联仓库与货位,代码联查 area_id |
BS_STORAGE_CONTAINER | t_bs_storage_container | 微仓货柜 | 移动商城微仓容器 |
BS_STORAGE_CONTAINER_AREA | t_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_ORDER | t_scm_po_order | 采购主单 | id, sid, billNo, billStatus, orderType, srcOrderType, srcOrderId, srcOrderNo | 提交采购、外部订单转单、退货 |
SCM_PO_ORDER_EXT | t_scm_po_order_ext | 主单扩展 | 采购 ID、外部来源和兼容字段 | 主单创建或外部同步 |
SCM_PO_ORDER_INFO | 32 分片 | 商品明细 | id, iid, invId, skuId, qty, price, amount, srcOrderEntryId | 创建采购商品行 |
SCM_PO_ORDER_INFO_QTY | t_scm_po_order_info_qty | 数量状态 | po_order_id, sku_id, is_gift 和八类过程数量 | 创建明细时初始化,发货/入库/退货/关闭时搬运 |
SCM_PO_RECEIVE_TIME | t_scm_po_receive_time | 预计到货 | 采购明细和预计时间 | 订单中心同步 |
SCM_PO_ORDER_PAYINFO | t_scm_po_order_payinfo | 在线支付拆分 | iid, billNo, 账户类型、金额、服务费 | 支付中心成功回调 |
SCM_PO_OUT_INFO | 32 分片 | 上游发货/在途明细 | 来源采购行、发货数量、外部出库 ID | 配送/订单中心发货消息 |
SCM_PO_OUT_INFO_EXT | t_scm_po_out_info_ext | 发货扩展 | 运单、外部属性 | 发货同步 |
SCM_PO_CLOSE_INFO | t_scm_po_close_info | 关闭明细 | srcOrderId、关闭数量、原因 | 整单/行关闭 |
SCM_PU_INVOICE | t_scm_pu_invoice | 采购入库主单 | 入库单号、来源采购、状态、仓库 | 签收/入库 |
SCM_PU_INVOICE_INFO | 32 分片 | 入库商品明细 | 来源采购行、仓库、货位、数量、成本 | 采购入库 |
SCM_PO_LOG | t_scm_po_log | 采购操作日志 | 采购单、动作、操作者、时间 | 关键状态操作 |
SCM_PU_LOG | t_scm_pu_log | 入库日志 | 入库单、动作、操作者 | 入库操作 |
SCM_PO_RETURN_CLOSE | t_scm_po_return_close | 采购退货关单 | 退货来源、关单状态 | 外部退货关闭 |
SCM_PO_RETURN_ORDER_LOGISTICS | t_scm_po_return_order_logistics | 采购退货物流 | 退货单、承运商、运单号 | 退货发运 |
SCM_PO_ORDER_ADDRESS | t_scm_po_order_address | 客户地址快照 | 采购单和收货地址 | 下单时快照 |
SCM_PO_CART | t_scm_po_cart | 采购购物车 | 服务站、用户、状态 | 加购 |
SCM_PO_CART_INFO | t_scm_po_cart_info | 购物车商品 | 购物车、SKU、数量、历史记录 | 加购更新 |
SCM_PRE_ORDER | t_pre_order | 新预订单主表 | 来源、支付和状态 | 预订单下单 |
SCM_PRE_ORDER_INFO | t_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_qty | going_out_qty | wait_out_qty | 上游已发货,进入在途 |
sign_qty | sign_qty, in_qty | going_out_qty | 签收并入库 |
going_refund_qty_1 | going_refund_qty | wait_out_qty | 未发货商品申请退货 |
going_refund_qty_2 | going_refund_qty | in_qty | 已入库商品申请退货 |
finish_refund_qty | finish_refund_qty | going_refund_qty | 退货已完成 |
close_qty | close_qty | wait_out_qty | 未发货行关闭 |
cancel_refund_qty_1 | wait_out_qty | going_refund_qty | 取消未发货退货 |
cancel_refund_qty_2 | in_qty | going_refund_qty | 取消已入库退货 |
9. 销售、出库和配送域
9.1 核心表字典
| 常量 | 物理表/规则 | 角色 | 关键字段和关系 |
|---|---|---|---|
SCM_SA_ORDER | 16 分片 | 销售主单 | id, sid, billNo, buId, sourceType, billStatus, payType, srcOrderId/srcOrderNo |
SCM_SA_ORDER_INFO | 16 分片 | 销售商品明细 | iid = 销售主单.id,商品、数量、价格、来源行 |
SCM_SA_ORDER_INFO_EXT | t_scm_sa_order_info_ext | 销售行扩展 | 销售明细 ID、活动/外部属性 |
SCM_SA_ORDER_LOG | t_scm_sa_order_log | 销售操作日志 | 单据、状态动作、操作者 |
SCM_SA_ODER_CLOSE_INFO | t_scm_sa_order_close_info | 销售关闭行 | 原销售行、关闭数量和原因 |
SCM_SA_ORDER_ACTIVITY_REL | t_scm_sa_order_activity_rel | 销售活动关系 | sa_order_id, activity_id, contact_id, sid |
SCM_SA_ORDER_OFFER_REL | t_scm_sa_order_offer_rel | 销售报价关系 | 销售单与报价单 |
SCM_SA_INVOICE | 64 分片 | 销售出库主单 | id, billNo, transType, billStatus, srcOrderId, srcOrderNo, 配送和核销字段 |
SCM_SA_INVOICE_INFO | 64 分片 | 出库商品明细 | iid = 出库主单.id,srcOrderEntryId = 销售明细.id,仓库货位、数量、成本 |
SCM_SA_INVOICE_INFO_EXT | t_scm_sa_invoice_info_ext | 出库行扩展 | 外部渠道和配送扩展 |
SCM_SA_INVOICE_CHECK | t_scm_sa_invoice_check | 验货记录 | 出库单、商品、验货状态 |
SCM_SA_RETURN_LOG | t_scm_abnormal_return_log | 异常退货日志 | 原出库、退货原因、处理状态 |
SCM_THIRD_PARTY_DELIVERY_ORDER | t_scm_third_party_delivery_order | 三方配送单 | 平台、运单、配送状态 |
SCM_SA_INVOICE_DELIVERY_RELATION | t_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_INVENTORY | t_scm_inventory_0_{sid % 128} | 当前月库存流水 | sid, 单据、transType, invId, skuId, 仓库货位、qty |
SCM_INVENTORY_INFO | t_scm_inventory_info | 历史兼容/明细定义 | 实际使用范围需结合调用方确认 |
TH_SCM_INVENTORY | th_scm_inventory | 往月库存归档 | 月份和历史流水 |
SCM_INVENTORY_REAL_TIME | t_scm_inventory_real_time | 当前实时库存结果 | sid, inv_id, sku_id, location_id, location_area_id, area_type, qty |
SCM_INVENTORY_WARNING | t_scm_inventory_warning | 库存预警配置 | 商品、上限、下限 |
SCM_INVENTORY_CHECK | t_scm_inventory_check | 盘点主单 | 盘点状态、人员、时间、站点 |
SCM_INVENTORY_CHECK_INFO | 10 分片 | 盘点商品明细 | 账面数、实盘数、差异、商品货位 |
SCM_PD_CHECK | t_scm_pd_check | 盘点控制 | sid, upper_limit_ratio, status |
SCM_PD_REASON | t_scm_pd_reason | 盘点原因 | 差异原因字典 |
SCM_BALANCE_AMOUNT | t_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_PAYMENT | t_scm_payment_{sid % 32} | 收付款主单 | id, billNo, billType, transType, buId, totalAmount, billStatus |
SCM_PAYMENT_INFO | t_scm_payment_info_{sid % 32} | 收付款业务明细 | iid = 主单.id,来源单 stlId/stlNo、账户、金额 |
SCM_PAYMENT_LOG | t_scm_payment_log | 收付款操作日志 | 付款单和动作 |
SCM_ACCOUNT | t_scm_account 系列 | 当月账户流水 | 业务对象、账户、方向、金额 |
SCM_ACCOUNT_INFO | t_scm_account_info | 账户流水清单 | 来源单、交易类型和金额 |
TH_SCM_ACCOUNT | th_scm_account | 往月账户归档 | 历史账户事实 |
SCM_REPAYMENT_ORDER | t_scm_repayment_order | 授信还款单 | 还款单号、金额、状态、支付关系 |
SCM_WITHDRAW_ORDER | t_scm_withdraw_order | 提现申请 | 提现来源、状态和金额 |
SCM_PO_ORDER_PAYINFO | t_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_ACTIVITY | t_sale_activity | 普通活动主表 |
SALE_ACTIVITY_PLAN | activity_plan | 活动方案 |
SALE_ACTIVITY_TEMPLATE | activity_template | 活动模板 |
SALE_ACTIVITY_JOIN | t_sale_activity_join | 活动订单/参与记录 |
SALE_ACTIVITY_JOIN_DETAIL | t_sale_activity_join_detail | 活动参与明细 |
PO_ORDER_ACTIVITY | po_order_activity | 活动与采购单关系 |
GIFT_ACTIVITY | t_gift_activity | 赠品活动主表 |
GIFT_ACTIVITY_GOODS | t_gift_activity_goods | 赠品活动商品 |
GIFT_ACTIVITY_ORDER_REL | t_gift_activity_order_rel | 赠品活动与订单关系 |
SALE_USAGES | t_sale_usages | 活动使用记录 |
12.2 秒杀
| 常量 | 物理表 | 角色 | 关键字段/关系 |
|---|---|---|---|
FLASH_ACTIVITY | t_flash_activity | 秒杀主表 | 时间、OA、启用、库存口径 |
FLASH_ACTIVITY_GOODS | t_flash_activity_goods | 秒杀商品规则 | 活动 ID、SKU、总量、限购、locked_qty, used_qty |
FLASH_ACTIVITY_STATION_SCOPE | t_flash_activity_station_scope | 服务站范围 | 活动、名单类型、sid |
FLASH_CART | t_flash_cart | 秒杀购物车 | 站点、活动商品、数量、有效状态 |
FLASH_ORDER | t_flash_order | 秒杀订单主表 | 活动、站点、状态、采购单、支付 |
FLASH_ORDER_DETAIL | t_flash_order_detail | 秒杀订单商品 | 秒杀单、活动商品、数量和价格 |
FLASH_ACTIVITY_LOG | t_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_ORDER | t_channel_order | 渠道订单主单 | 平台来源单号、DGJ 销售单、状态 |
CHANNEL_ORDER_INFO | t_channel_order_info | 渠道商品明细 | order_id、商品、数量、发货数量 |
CHANNEL_AFTERSALE | t_channel_aftersale | 渠道售后主单 | 平台售后号、原渠道单、状态 |
CHANNEL_AFTERSALE_INFO | t_channel_aftersale_info | 售后商品明细 | 售后 ID、原订单行、退货数量 |
CHANNEL_ORDER_SIGN_DETAIL | t_channel_order_sign_detail | 签收明细 | 渠道订单行、签收数量 |
SCM_BIG_ORDER | t_scm_big_order | 老大客户订单 | 与新 Channel 域并存 |
SCM_BIG_ORDER_INFO | t_scm_big_order_info | 老大客户明细 | 老链路商品行 |
SCM_BIG_ORDER_INFO_NC | t_scm_big_order_info_NC | 下发 NC 明细 | NC 同步事实 |
SCM_BIG_ORDER_INFO_OPS | t_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_USER | t_bs_move_mall_user | 移动商城客户和服务站绑定 |
BS_STORAGE_CONTAINER | t_bs_storage_container | 微仓货柜 |
BS_STORAGE_CONTAINER_AREA | t_bs_storage_container_area | 货柜货位关系 |
BS_MOVE_STORAGE_PRICE | t_bs_move_storage_price | 微仓商品价格 |
SCM_MOVE_SUPPLY | t_scm_move_supply | 微仓补货主单 |
SCM_MOVE_SUPPLY_INFO | t_scm_move_supply_info | 微仓补货明细 |
SCM_MOVE_RE_ORDER | t_scm_move_re_order | 微仓退货主单 |
SCM_MOVE_RE_ORDER_INFO | t_scm_move_re_order_info | 微仓退货明细 |
SCM_MOVE_SUPPLY_SHIELD | t_scm_move_supply_shield | 补货屏蔽 |
SCM_MOVE_REPLENISH_RECORD | t_scm_move_replenish_record | 推荐补货记录 |
BS_CHAT_GROUP_RELATION | t_bs_chat_group_relation | 微仓与微信群关系 |
14.2 新旧对账单
| 常量 | 物理表 | 角色 |
|---|---|---|
SCM_ACCOUNTS_CHECK | t_scm_accounts_check | 旧客户对账单 |
SCM_ACCOUNTS_CHECK_INFO | t_scm_accounts_check_info | 旧对账明细 |
T_BS_STATEMENT_BILL | t_bs_statement_bill_v2 | V2 对账主单,配置 64 分片 |
T_BS_STATEMENT_BILL_DETAIL | t_bs_statement_bill_detail_v2 | 对账业务明细 |
T_BS_STATEMENT_BILL_DETAIL_ITEM | t_bs_statement_bill_detail_item_v2 | 对账商品项 |
T_BS_STATEMENT_BILL_TASK | t_bs_statement_bill_task_v2 | 生成/发送任务 |
T_BS_STATEMENT_STRATEGY | t_bs_statement_strategy_v2 | 对账策略 |
T_BS_STATEMENT_STRATEGY_RELATION | t_bs_statement_strategy_relation_v2 | 策略客户关系 |
T_BS_STATEMENT_SEND_RECORD | t_bs_statement_send_record_v2 | 发送记录 |
T_BS_NEED_STATEMENT_USER | t_bs_need_statement_user | 待对账客户 |
新旧对账表并存时不能把数据简单 UNION 后求和,必须先确认是否是迁移、双写、按日期切换还是不同业务入口。
15. 报价、机器人与 AI 域
| 常量 | 物理表 | 角色 |
|---|---|---|
SCM_OFFER_ORDER | t_scm_offer_order | 报价主单 |
SCM_OFFER_ORDER_INFO | t_scm_offer_order_info | 报价商品明细 |
SCM_ROBOT_OFFER_ORDER_APPLY | t_scm_robot_offer_order_apply | 机器人报价申请 |
SCM_ROBOT_CONVERSATION | t_scm_robot_conversation | 机器人会话 |
SCM_ROBOT_PRE_CONVERSATION | t_scm_robot_pre_conversation | 老预会话 |
ROBOT_CONVERSATION_PRE | t_robot_conversation_pre | RobotV2 预会话 |
SCM_ROBOT_CONVERSATION_RECORD | t_scm_robot_conversation_record | 会话消息记录 |
SCM_ROBOT_IMAGE_PARSE | t_scm_robot_image_parse | 图片解析记录 |
SCM_ROBOT_SEARCH_LOG | t_scm_robot_search_log | 搜索日志 |
T_SCM_ROBOT_QUOTE_CONFIG | t_scm_robot_quote_config | 报价范围主配置 |
T_SCM_ROBOT_QUOTE_CONFIG_INFO | t_scm_robot_quote_config_info | 报价范围明细 |
SCM_QUOTE_RANGE | t_scm_quote_range | AI 报价范围 |
SCM_QUOTE_RANGE_CONFIG | t_scm_quote_range_config | 报价关联配置 |
SCM_QUOTE_RANGE_CONFIG_INFO | t_scm_quote_range_config_info | 报价配置明细 |
SCM_QUOTE_RANGE_CONTACT | t_scm_quote_range_contact | 报价范围客户 |
T_SCM_ROBOT_QUOTE_REPLAY_CONFIG | t_scm_robot_quote_replay_config | 报价回复配置 |
T_SCM_ROBOT_ORDER_QTY_CONFIG | t_scm_robot_order_qty_config | 机器人下单数量配置 |
会话表、预会话表和消息记录表不是同一生命周期。排查“机器人回复了但没有报价单”时要按“入站消息 -> 会话/预会话 -> 意图/搜索日志 -> 报价申请 -> 报价主明细 -> 销售单”逐层查。
16. 系统、权限和终端域
| 常量 | 物理表 | 角色 |
|---|---|---|
SYS_ADMIN | t_sys_admin | 系统用户 |
SYS_ADMIN_CONFIG | t_sys_admin_config | 员工账号配置 |
ACL_SYS_RESOURCE | t_acl_sys_resource | 新资源定义 |
ACL_SYS_RESOURCE_RULE | t_acl_sys_resource_rule | 资源授权规则 |
SYS_MENU | t_sys_menu | 功能菜单和权限 |
SYS_MENU_DATA | t_sys_menu_data | 数据权限 |
SYS_MENU_CONFIG | t_sys_menu_config | 菜单控制 |
SYS_OPS_MENU_RULE_NEW | t_sys_ops_menu_rule_new | OPS 新菜单规则 |
SYS_OPS_WHITELIST | t_sys_ops_whitelist | 服务站白名单 |
SYS_STATION_CONFIG | t_sys_station_config | 站点配置键值 |
SYS_LOG | t_sys_log | 服务站操作日志 |
SYS_APIS_LOG* | t_sys_apis_log* | 多张接口日志表 |
SYS_INNER_TOKEN | t_sys_inner_token | 内部用户令牌 |
APP_DEVICE | t_app_device | APP 登录设备 |
SYS_PC_AUTHS | t_sys_pc_auths | PC 授权 |
SYS_PC_MACHINES | t_sys_pc_machines | 机器码绑定 |
SYS_PC_LOGIN_CONTROL | t_sys_pc_login_control | PC 登录控制 |
SYS_PDA_OPTION_LOG | t_sys_pda_option_log | PDA 操作日志 |
权限可见性通常是资源、菜单、用户、数据权限、站点版本、OPS 规则和白名单共同计算的结果,不能只改 t_sys_menu。
17. 其他仓储和专项单据索引
| 业务 | 主表 | 明细/辅助表 | 说明 |
|---|---|---|---|
| 其他出入库 | SCM_OI_INVOICE | SCM_OI_INVOICE_INFO, SCM_OI_LOG | 交易类型决定入库或出库 |
| 站内调拨 | SCM_TF_INVOICE | SCM_TF_INVOICE_INFO, SCM_TF_LOG | 同服务站仓库间调拨 |
| 站间调拨 | SCM_STF_INVOICE | SCM_STF_INVOICE_INFO | 两个服务站、在途和双边库存 |
| 调拨申请 | SCM_STF_APPLY | SCM_STF_APPLY_INFO | 申请与实际调拨单分开 |
| 成本调整 | SCM_UPDATE_COST | SCM_UPDATE_COST_INFO | 影响成本和利润 |
| 不良品 | SCM_BADGOODS | 仓位 area_type | 不良品数量和仓位 |
| 拆包出库 | SCM_PACKAGE_ORDER | SCM_PACKAGE_ORDER_INFO | 套包拆分和库存 |
| 退货申请 | SCM_APPLY_RETURN_ORDER | SCM_APPLY_RETURN_ORDER_INFO | 审核申请,不等于已退货入账 |
| 首配 | BS_DELIVERY_PLAN | 模板、模板项、商品 | 方案配置转采购 |
| 轮胎理赔 | TYRE_REGISTRATION | TYRE_CLAIM, TYRE_PROPERTY, BS_IMAGE | 登记、理赔、属性和图片 |
| C端活动 | MKT_CLIENT_ACTIVITY | 商品、关系、图片、申请 | C端营销专区 |
| 优惠券 | MKT_CLIENT_COUPON_TEMPLATES | MKT_CLIENT_COUPON_SEND_LOG | 模板与发放记录 |
| 帮助中心 | HELP_QUESTION | HELP_ANSEWER, HELP_QUESTION_LIB | 问答和题库 |
| 知识库 | KNOWLEDGE | KNOWLEDGE_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. 数据修复前的安全门槛
- 明确环境、库、
sid、单号和真实分表; - 先保存只读查询结果和受影响行数;
- 画出主表、明细、过程表、流水和当前结果的关系;
- 明确哪个表是源事实,不能用结果表反向覆盖源事实;
- 确认是否有 MQ、缓存、DWD、搜索索引和外部系统需要同步;
- 设计幂等条件,重复执行不能重复加减数量或金额;
- 小范围事务执行,检查影响行数;
- 修复后按业务页面、SQL、日志和下游四层验证;
- 保留回滚 SQL,但不要把回滚理解成无条件反向加减;
- 将原因、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. 仍需环境确认
- 核心表完整
SHOW CREATE TABLE,尤其字段类型、默认值和唯一索引; - 各环境是否都已经完成采购、销售、出库、付款和库存分表迁移;
oldTable的真实读写范围及历史数据截止日期;- 账户表的实际分片规则和新旧月表切换方式;
- 库存实时表的唯一键是否覆盖
area_type; - 盘点明细真实表名的分隔符和路由实现;
- V2 对账单 64 分片的真实后缀规则;
- 当前月流水转
th_*历史表的任务、时间点和失败补偿; - DWD 从业务表抽取的增量键、删除同步和延迟 SLA;
- 表结构变更是否有统一在线 DDL、灰度和回滚规范;
- 重复常量与物理表别名是否可以安全收敛;
- 是否存在未写入
tables.php、仅在 Model 中硬编码的生产业务表。
这些环境证据确认后,应把 DDL 摘要、索引和实际路由回填本文;本文不会把静态代码推断伪装成生产数据库事实。
请求-日志-数据变更追踪卡
多入口请求链路
| 场景 | 调用方与入口 | 请求载荷/上下文 | Controller/Consumer | Service/Provider | 汇合点 | 最终业务事实 |
|---|---|---|---|---|---|---|
| 单据写入 | PC/App/Inner/OpenAPI | sid、业务单号、主明细参数 | 领域 Controller | 领域 Service + Model | tables.php 常量映射的主表/明细表 | 一张主单、多条明细和扩展/关系事实 |
| 库存写入 | 采购、销售、退货、调拨、盘点 | 业务单号、SKU、仓位、数量、transType | 各业务入口 | InventorySer | 库存主单、分片明细、实时表 | 过程流水与当前库存共同成立 |
| 资金写入 | 支付/收款页面或支付 MQ | 来源单号、支付单号、金额、账户 | 财务 Controller/Consumer | Payment/Account Service | 支付、账户、业务关系表 | 资金过程与订单状态关联 |
| 异步关系写入 | MQ/外部回调/补偿任务 | 消息键、外部单号、状态 | tasks/* | Provider/领域 Service | 关系表、日志表、业务主表 | 外部结果映射为本地状态 |
日志证据矩阵
| 链路段 | 日志来源 | 可检索锚点 | 成功信号 | 失败信号 | 与下一段关联方式 |
|---|---|---|---|---|---|
| 请求入口 | Web/Inner/OpenAPI 日志 | request_id、URI、sid、业务单号 | 命中目标方法并返回主键 | 路由/鉴权/校验失败 | 主键与表主记录关联 |
| Model 写入 | Service 异常与数据库日志 | Model 类、物理表、主键、SQL 错误 | 影响行数符合预期并 commit | duplicate、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 -> new | PK、sid、billNo、来源单号 |
| 写明细/扩展 | 明细 Model | 与主单同事务为目标 | 主单 PK、商品/金额/数量 | _INFO、_EXT、关系表 | insert/update/delete;明细合计应回到主表 | FK、明细条数、数量金额合计 |
| 写过程事实 | 库存/资金/状态日志 Model | 领域事务或独立异步事务 | 当前累计量、消息业务键 | 流水/日志/分片表 | 累计值 old -> old +/- n,过程记录 insert | 流水净额、消息幂等键 |
| 同步派生层 | MqSer、Cache、Search、Report | commit 后异步 | 已提交 OLTP 事实 | MQ、Redis、ES/Hologres | OLTP 不再改变;派生层逐步追平 | 消费 ACK、缓存值、数据日期 |
子模块级独立追踪
子模块追踪:base-tables 基础资料域表
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 定位读取 | 商品、客户、供应商、仓库和货位请求 | request ID、sid、skuId/invId、contact/storage/location ID | application/config/tables.php -> basedata Controller/Service -> Goods/Contact/Storage Model | BS_GOODS/EXT/STO、BS_CONTACT、BS_STORE、BS_STORAGE/LOCATION | 查询只读,不写业务表;逻辑 ID -> 物理表/关联键 | request ID + sid + 主键/编码 | 查错 sid、逻辑删除或站点扩展会误判不存在;先核主表再核站点表 |
| 维护同步 | 基础资料保存或商品中心事件 | message/request ID、业务主键、version | application/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、SKU | application/controllers/scm/InvPo.php -> InvPoService/PoOrderSer -> Models | SCM_PO_ORDER/EXT/INFO/INFO_QTY、地址和来源关系 | 领域事务 insert/update;status/qty/amount old -> new | request ID + billNo + source order + SKU | 必须同时查主、明细和数量表;只改主状态不能恢复过程事实 |
| 过程表 | 支付、发货、关闭、退货物流 | payOrderNo、PO billNo、SKU、logistics no | application/controllers/tasks/PayCenterNotify.php / 采购 Service -> process Models | SCM_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、SKU | application/Services/SaOrders/SaOrderSer.php -> Sale Models | SCM_SA_ORDER/INFO/INFO_EXT | 销售事务 insert/update,订单状态、订购量、应收 old -> new | request ID + source/sale billNo | 来源单唯一性防重复;主明细金额数量必须闭合 |
| 出库配送 | 销售出库、配送和签收 | sale/invoice/delivery IDs、SKU、qty | application/Services/SaOrders/SaInvoiceSer.php / ThirdDeliverySer.php | SCM_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/shard | application/Services/Storage/InventorySer.php -> InventoryModel/SubModel | SCM_INVENTORY 与 128 分片 SCM_INVENTORY_INFO、历史 TH_SCM_INVENTORY | 外层事务 insert 主单/分片明细,qty=本次 +n/-n | billNo + transType + inventory ID + shard | 分片规则、跨月归档要先确认;主单有明细无按原业务键补断点 |
| 当前量 | 流水同事务增减/库存查询 | 四维键 sid+invId/skuId+storage+location | application/models/bs/InventoryRealTimeModel.php | SCM_INVENTORY_REAL_TIME 当前 qty | 原子 update/insert,qty old -> old+delta;预警表另行派生 | four-dimension key + affected rows | 实时与流水差异不能只改实时表;以基准+净流水重建并保留补偿证据 |
子模块追踪:finance-tables 财务域表
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 支付单 | 付款/收款发起与 PayCenter 回调 | payOrderNo、source bill、amount、payment type | application/controllers/tasks/PayCenterNotify.php -> PaymentModel/PaymentInfoModel | SCM_PAYMENT/INFO 和来源支付关系 | 财务事务 insert/update;status pending -> confirmed/failed,paid old -> old+n | payOrderNo + source bill + message ID | 同支付单只能一次落账;外部成功本地失败按原 payOrderNo 补偿 |
| 账户分录 | 核销、退款、还款和额度调整 | account ID、finance bill、original pay/refund ID | application/service/scm/AccountService.php / 财务 Service | SCM_ACCOUNT/INFO、SCM_REPAYMENT_ORDER | 余额/已核销/已退 old +/- n,分录 insert;事务内保持金额守恒 | finance/original bill + account + before/after | 不单改余额;正反流水、来源关系与外部最终态必须一起验收 |
子模块追踪:activity-tables 活动与秒杀域表
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 活动配置 | 普通/赠品/秒杀 OPS 保存 | activity ID、SKU、sid scope、version | application/Services/Activity/FlashActivitySer.php 及活动 Service | SALE_ACTIVITY、GIFT_ACTIVITY/GOODS、FLASH_ACTIVITY/GOODS/STATION_SCOPE | 配置事务 insert/update,status/config old -> new | activity + SKU/sid + operator | 草稿/审批状态限制写入;范围和商品集合应同事务或可回滚 |
| 交易数量 | 秒杀加购、下单、支付、关闭 | cart/flash/PO/pay IDs、SKU、qty | application/Services/Activity/FlashSaleSer.php | FLASH_CART/ORDER/DETAIL 与采购来源关系 | locked/used/released old +/- n,order status 单向推进 | activity/cart/flash/PO/pay IDs | 按稳定关系幂等;数量守恒优先于单一状态字段 |
子模块追踪:channel-tables 渠道与大客户域表
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 渠道意图 | 外部下单/人工代建 | channel、source order、local channel order、SKU | application/Services/Channel/BaseOrder.php | CHANNEL_ORDER/INFO 和客户/站点绑定 | 渠道事务 insert/update;status、shipped_num old -> new | channel + source/local order | 外部单号必须幂等;不能只看渠道表忽略内部事实单 |
| 售后事实 | 售后申请、审核、退货入库/退款 | source aftersale、original order、internal return/refund IDs | application/Services/Channel/BaseAftersale.php | CHANNEL_AFTERSALE/INFO、签收明细和内部退货/库存/资金 | apply/return/refund qty old -> old+n;状态单向推进 | aftersale/original/internal IDs | 本地与外部部分成功按关系补断点,禁止整链重放 |
子模块追踪:move-tables 移动商城、微仓与对账域表
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 移动/微仓 | E站下单、补货、调拨、移动退货 | source/supply/transfer/return bill、two sids、SKU | application/Services/MoveMall/* -> 销售/调拨/库存 Service | SCM_MOVE_MAIN、移动关系和销售/库存事实 | 领域事务 insert/update,status/qty old -> new | source/internal bills + transType | 跨域关系串联分段补偿;两站库存和在途守恒 |
| 对账单 | 策略任务生成、发送、收款同步 | strategy/task/bill/send IDs、period、source invoices | application/Services/Statement/* | strategy/relation/task、bill/detail/item、send record | task/status/retry/received amount old -> new;文件/发送异步 | task/bill/send + source invoice | 三层快照和来源金额闭合;发送失败不重建账单 |
子模块追踪:system-tables 系统、权限、机器人与专项表
| 环节 | 入口/触发 | 请求/业务键 | 代码链路 | 读取事实 | 写入与字段变化 | 日志证据 | 异常与补偿 |
|---|---|---|---|---|---|---|---|
| 权限系统 | 菜单加载、授权、白名单/迁移 | user/role/resource/menu ID、sid、batch | application/Services/MenuRule/MenuRuleSer.php / System Service | ACL_SYS_RESOURCE/RULE、SYS_MENU*、SYS_OPS_MENU_RULE*、SYS_OPS_WHITELIST | 配置事务关系增删、status/order old -> new | user/resource/menu + operator/batch | 权限缓存与 DB 分层验证;迁移重复批次不重复关系 |
| 机器人专项 | IM/RobotV2 会话、报价和图片回调 | message/request/conversation/offer IDs | application/Services/MoveMall/RobotV2/* / AI Service | SCM_ROBOT_CONVERSATION/PRE/RECORD、报价配置/订单 | 会话 state/context old -> new,record insert;外部 AI 异步 | conversation + request/message ID | 重复消息/回调 0 副作用;不同版本表不能按名称混查 |