# 字段差异逐章审核报告（第一批：1.1.1 ~ 1.1.9）

> 生成时间：2026-02-20
> 数据源：test_etl_feiqiu（开发/测试环境）
> 审核范围：dataflow 报告中"上游存在、下游没有"的字段（ODS→DWD 未映射）

---

## 1.1.1 assistant_accounts_master（助教账号档案）

ODS→DWD 未映射 4 个字段：`system_role_id`, `job_num`, `cx_unit_price`, `pd_unit_price`

### assistant_accounts_master — system_role_id

- 数据类型：bigint（nullable）
- 采样值（distinct）：`10`（仅 1 个值）
- NULL 率：0/295 = 0%（全部非空）
- 业务含义推测：系统角色 ID，关联上游 SaaS 的角色权限体系。当前所有助教均为同一角色（值=10），可能是"助教"角色的固定编码。
- 建议：**需要映射** → `dim_assistant_ex.system_role_id`。虽然当前只有 1 个值，但该字段可用于区分不同角色（如未来新增"高级助教"角色），且 0% NULL 说明上游稳定输出。

### assistant_accounts_master — job_num

- 数据类型：text（nullable）
- 采样值（distinct）：无（全部 NULL）
- NULL 率：295/295 = 100%（全部为空）
- 业务含义推测：备用工号字段，上游 SaaS 预留但当前门店未启用。
- 建议：**需要映射** → `dim_assistant_ex.job_num`。虽然当前全 NULL，但作为档案类维度字段应保持完整性，未来门店可能启用工号管理。映射成本极低。

### assistant_accounts_master — cx_unit_price

- 数据类型：numeric（nullable）
- 采样值（distinct）：`0.00`（仅 1 个值）
- NULL 率：0/295 = 0%（全部非空）
- 业务含义推测：促销时段（超休时段）助教单价。当前全部为 0.00，说明门店未启用促销时段差异化定价。
- 建议：**需要映射** → `dim_assistant_ex.cx_unit_price`。该字段与工资计算直接相关（DWS 层助教业绩/工资计算可能需要），即使当前为 0 也应保留，一旦门店启用促销定价即有数据。

### assistant_accounts_master — pd_unit_price

- 数据类型：numeric（nullable）
- 采样值（distinct）：`0.00`（仅 1 个值）
- NULL 率：0/295 = 0%（全部非空）
- 业务含义推测：普通时段助教单价。当前全部为 0.00，与 cx_unit_price 同理，门店未启用按时段定价。
- 建议：**需要映射** → `dim_assistant_ex.pd_unit_price`。理由同 cx_unit_price，与工资计算直接相关，应保持完整性。


---

## 1.1.3 table_fee_transactions

ODS→DWD 未映射 1 个字段：`siteprofile`

### table_fee_transactions — siteprofile

- 跳过（jsonb 列，按规则跳过）

---

## 1.1.4 assistant_service_records（助教服务流水）

ODS→DWD 未映射 4 个字段：`siteprofile`（跳过）, `site_assistant_id`, `operator_id`, `operator_name`

### assistant_service_records — siteprofile

- 跳过（jsonb 列，按规则跳过）

### assistant_service_records — site_assistant_id

- 数据类型：bigint（nullable）
- 采样值（前 5 个 distinct）：`2793361915547781`, `2793363001774149`, `2793399247179845`, `2793405307342917`, `2793483330310277`
- NULL 率：0/10219 = 0%（全部非空）
- distinct 值数量：63（对比 order_assistant_id 的 5292 个 distinct 值）
- 业务含义推测：**门店助教档案 ID**，指向 `ods.assistant_accounts_master.id`，代表"哪个助教"。与 `order_assistant_id`（订单级助教分配 ID，每次服务生成一个唯一 ID）完全不同。

#### ⚠️ 关键发现：DWD 映射错误已确认

| 验证项 | 结果 |
|--------|------|
| DWD `site_assistant_id` distinct 值数量 | 5276（应为 ~63） |
| DWD `site_assistant_id` 匹配 ODS `order_assistant_id` | **10203/10203 = 100%** |
| DWD `site_assistant_id` 匹配 ODS `site_assistant_id` | **0/10203 = 0%** |

**结论**：DWD `dwd_assistant_service_log.site_assistant_id` 当前实际映射自 ODS `order_assistant_id`，而非 ODS `site_assistant_id`。这是一个映射错误。

- 建议：**需要修复映射**。当前 DWD 的 `site_assistant_id` 列应改为映射自 ODS 的 `site_assistant_id`（助教档案 ID），而非 `order_assistant_id`。此字段是关联 `dim_assistant` 维度表的关键外键，映射错误会导致助教维度 JOIN 失败或产生错误的业绩归属。修复优先级：**高**。

### assistant_service_records — operator_id

- 数据类型：bigint（nullable）
- 采样值（distinct）：`2790687322443013`（仅 1 个值）
- NULL 率：0/10219 = 0%（全部非空）
- distinct 值数量：1
- 业务含义推测：操作员 ID，即执行该服务记录录入的收银员/操作人员。当前只有 1 个操作员（与 operator_name 一致）。
- 建议：**需要映射** → `dwd_assistant_service_log_ex.operator_id`。虽然当前只有 1 个操作员，但多门店/多收银员场景下会有多个值。与 operator_name 配对使用，便于追溯操作责任。

### assistant_service_records — operator_name

- 数据类型：text（nullable）
- 采样值（distinct）：`收银员:郑丽珊`（仅 1 个值）
- NULL 率：0/10219 = 0%（全部非空）
- distinct 值数量：1
- 业务含义推测：操作员名称，格式为"角色:姓名"。
- 建议：**需要映射** → `dwd_assistant_service_log_ex.operator_name`。理由同 operator_id，配对映射。

---

## 1.1.5 assistant_cancellation_records（助教废除记录）

ODS→DWD 未映射 2 个字段：`siteprofile`（跳过）, `assistanton`

### assistant_cancellation_records — siteprofile

- 跳过（jsonb 列，按规则跳过）

### assistant_cancellation_records — assistanton

- 数据类型：integer（nullable）
- 采样值（前 10 个 distinct）：`1, 2, 4, 5, 6, 7, 8, 9, 10, 11`
- 值域范围：min=1, max=99, avg=16.93
- NULL 率：0/100 = 0%（全部非空）
- distinct 值数量：22
- 分布（top 5）：`15→15次, 6→12次, 4→8次, 9→8次, 11→6次`
- 业务含义推测：**助教编号**（整数编号），代表该助教在门店内的编号。与 `assistantname`（助教昵称）一一对应，例如 assistanton=1 对应"小燕"，assistanton=2 对应"佳怡"。

#### ⚠️ 注意：DWD 现有 `assistant_no` 列实际映射自 `assistantname`（昵称），而非 `assistanton`（编号）

- 建议：**需要映射** → `dwd_assistant_trash_event.assistant_on`（保留原始字段名语义）。该字段是助教的整数编号，可用于与其他系统的助教编号关联。当前 DWD 主表的 `assistant_no` 实际存储的是昵称（映射自 `assistantname`）。

---

## 1.1.6 store_goods_sales_records（门店商品销售流水）

ODS→DWD 未映射 1 个字段：`discount_price`

### store_goods_sales_records — discount_price

- 数据类型：numeric（nullable）
- 采样值（前 10 个 distinct）：`0.00, 1.00, 2.00, 3.00, 3.50, 4.00, 5.00, 6.00, 7.00, 8.00`
- NULL 率：0/17563 = 0%（全部非空）
- distinct 值数量：48
- 分布（top 5）：`5.00→5008次, 8.00→3284次, 6.00→1365次, 2.00→1291次, 10.00→1174次`
- 与 `ledger_unit_price` 的关系：16287/17563 相同（92.7%），1276 条不同
- 业务含义推测：**折后单价**，即商品经过折扣后的实际销售单价。与 `ledger_unit_price`（台账单价/原价）在大多数情况下相同，但有 7.3% 的记录存在差异（即发生了折扣）。

#### ⚠️ DWD 列名冲突

| 验证项 | 结果 |
|--------|------|
| DWD `discount_price` 匹配 ODS `discount_money` | **17563/17563 = 100%** |
| DWD `discount_price` 匹配 ODS `discount_price` | 111/17563 = 0.6%（巧合） |

**结论**：DWD `dwd_store_goods_sale.discount_price` 当前实际映射自 ODS `discount_money`（折扣金额），而非 ODS `discount_price`（折后单价）。列名存在语义误导。需要进行修正，DWD字段名称应与ODS相符

---

## 1.1.7 payment_transactions

ODS→DWD 未映射 1 个字段：`siteprofile`

### payment_transactions — siteprofile

- 跳过（jsonb 列，按规则跳过）

---

## 1.1.8 refund_transactions

ODS→DWD 未映射 1 个字段：`siteprofile`

### refund_transactions — siteprofile

- 跳过（jsonb 列，按规则跳过）

---

## 1.1.9 platform_coupon_redemption_records

ODS→DWD 未映射 1 个字段：`siteprofile`

### platform_coupon_redemption_records — siteprofile

- 跳过（jsonb 列，按规则跳过）

---

