# 助教账号主数据（SearchAssistantInfo） → assistant_accounts_master 字段映射

> 生成时间：2026-02-14

## 端点信息

| 属性 | 值 |
|------|-----|
| 接口路径 | `PersonnelManagement/SearchAssistantInfo` |
| 请求方法 | POST |
| ODS 对应表 | `ods.assistant_accounts_master` |
| JSON 数据路径 | `data.assistantInfos` |

## 字段映射

| JSON 字段 | ODS 列名 | 类型转换 | 说明 |
|-----------|----------|----------|------|
| id | id | int→BIGINT（`parse_int`） | 助教账号主键 ID，在“助教流水.json”中对应 site_assistant_id |
| tenant_id | tenant_id | int→BIGINT（`parse_int`） | 品牌/租户 ID，对应“非球科技”系统中该商户的唯一标识 |
| site_id | site_id | int→BIGINT（`parse_int`） | 门店 ID，对应本次数据的这家球房（朗朗桌球） |
| assistant_no | assistant_no | string→TEXT（原样） | 助教工号 / 编号，便于业务侧识别 |
| nickname | nickname | string→TEXT（原样） | 助教在前台展示的昵称，如“佳怡”“周周”“球球”等 |
| real_name | real_name | string→TEXT（原样） | 助教真实姓名，如“何海婷”“梁婷婷”等 |
| mobile | mobile | string→TEXT（原样） | 助教手机号，用于登录绑定、通知、钉钉同步等 |
| team_id | team_id | int→BIGINT（`parse_int`） | 助教所属团队 ID |
| team_name | team_name | string→TEXT（原样） | 团队名称，展示用，和 team_id 一一对应 |
| user_id | user_id | int→BIGINT（`parse_int`） | 系统级“用户账号 ID”，通常对应登录账号 |
| level | level | string→TEXT（原样） | 10 × 24 |
| assistant_status | assistant_status | int→INT（`parse_int`） | 1 × 48 |
| work_status | work_status | int→INT（`parse_int`） | 当 leave_status = 0 时，work_status = 1 |
| leave_status | leave_status | int→INT（`parse_int`） | 0 × 21 |
| entry_time | entry_time | string→TIMESTAMP（`parse_timestamp`） | 入职时间 |
| resign_time | resign_time | string→TIMESTAMP（`parse_timestamp`） | 离职日期 |
| start_time | start_time | string→TIMESTAMP（`parse_timestamp`） | 当前配置生效的开始日期 |
| end_time | end_time | string→TIMESTAMP（`parse_timestamp`） | 当前配置生效的结束日期（例如一个周期性的排班/合同周期） |
| create_time | create_time | string→TIMESTAMP（`parse_timestamp`） | 账号创建时间 |
| update_time | update_time | string→TIMESTAMP（`parse_timestamp`） | 账号最近一次被修改的时间（例如修改等级、昵称等） |
| order_trade_no | order_trade_no | string→TEXT（原样） | 该助教最近一次关联的订单号，用于快速跳转或回溯最近服务行为 |
| staff_id | staff_id | int→BIGINT（`parse_int`） | 预留给“人事系统员工 ID”的字段，目前未接入或未启用 |
| staff_profile_id | staff_profile_id | int→BIGINT（`parse_int`） | 人事档案 ID，与第三方 HR 系统或内部员工档案集成使用，当前未启用 |
| system_role_id | system_role_id | int→BIGINT（`parse_int`） | 标识类 ID 字段，用于关联/定位相关实体 |
| avatar | avatar | string→TEXT（原样） | 助教头像地址 |
| birth_date | birth_date | string→TIMESTAMP（`parse_timestamp`） | 助教出生日期 |
| gender | gender | int→INT（`parse_int`） | 0 × 40 |
| height | height | float→NUMERIC(18,2)（`parse_decimal`） | 身高（单位：厘米） |
| weight | weight | float→NUMERIC(18,2)（`parse_decimal`） | 体重（单位：公斤） |
| job_num | job_num | string→TEXT（原样） | 备用工号字段，目前未在该门店启用 |
| show_status | show_status | int→INT（`parse_int`） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| show_sort | show_sort | int→INT（`parse_int`） | 前台展示排序权重，值越小/越大对应不同的排序策略（当前看起来与 assistant_no 有一定对应关系） |
| sum_grade | sum_grade | float→NUMERIC(18,2)（`parse_decimal`） | 评分总和，用于计算平均分（assistant_grade = sum_grade / get_grade_times），当前为 0 |
| assistant_grade | assistant_grade | float→NUMERIC(18,2)（`parse_decimal`） | 助教综合评分（员工维度的平均分 snapshot），当前尚未启用评分 |
| get_grade_times | get_grade_times | int→INT（`parse_int`） | 累计被评分次数 |
| introduce | introduce | string→TEXT（原样） | 个人简介文案，预留给助教自我介绍使用 |
| video_introduction_url | video_introduction_url | string→TEXT（原样） | 助教个人视频介绍地址 |
| group_id | group_id | int→BIGINT（`parse_int`） | 上层“分组 ID”预留字段（例如集团/事业部），本门店未使用 |
| group_name | group_name | string→TEXT（原样） | group_id 对应的名称，目前为空 |
| shop_name | shop_name | string→TEXT（原样） | 门店名称，冗余字段，用于展示 |
| charge_way | charge_way | int→INT（`parse_int`） | 2 代表当前门店为“计时收费”，其他值（1、3 等）可能对应按局、按课时等，当前未出现 |
| entry_type | entry_type | int→INT（`parse_int`） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| allow_cx | allow_cx | int→INT（`parse_int`） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| is_guaranteed | is_guaranteed | int→INT（`parse_int`） | 布尔/开关字段，用于表示权限、可用性或状态开关 |
| salary_grant_enabled | salary_grant_enabled | int→INT（`parse_int`） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| light_status | light_status | int→INT（`parse_int`） | 灯光控制状态，如 1=启用控制、2=不启用 或相反 |
| online_status | online_status | int→INT（`parse_int`） | 在线状态 |
| is_delete | is_delete | int→INT（`parse_int`） | 逻辑删除标记（0=否，1=是） |
| cx_unit_price | cx_unit_price | float→NUMERIC(18,2)（`parse_decimal`） | 促销时段的单价，本门店未在账号表层面设置 |
| pd_unit_price | pd_unit_price | float→NUMERIC(18,2)（`parse_decimal`） | 某种标准单价（例如“普通时段单价”），这里未在账号上配置（实际单价在助教商品或套餐配置中） |
| last_table_id | last_table_id | int→BIGINT（`parse_int`） | 该助教最近一次服务的球台 ID |
| last_table_name | last_table_name | string→TEXT（原样） | 最近服务球台名称（展示用） |
| person_org_id | person_org_id | int→BIGINT（`parse_int`） | 人事组织 ID，通常表示“某某门店-助教部-某小组”等层级组织 |
| serial_number | serial_number | int→BIGINT（`parse_int`） | 系统内部生成的序列号或排序标识，用于全局排序或迁移 |
| is_team_leader | is_team_leader | int→INT（`parse_int`） | 布尔/开关字段，用于表示权限、可用性或状态开关 |
| criticism_status | criticism_status | int→INT（`parse_int`） | 1 × 49 |
| last_update_name | last_update_name | string→TEXT（原样） | 最近修改该账号配置的管理员名称 |
| ding_talk_synced | ding_talk_synced | int→INT（`parse_int`） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| site_light_cfg_id | site_light_cfg_id | int→BIGINT（`parse_int`） | 门店灯控配置 ID，本门店未在助教账号维度启用 |
| light_equipment_id | light_equipment_id | string→TEXT（原样） | 灯控设备 ID，如果开启“助教开台自动控制灯”，会通过该字段关联到灯控硬件 |
| entry_sign_status | entry_sign_status | int→INT（`parse_int`） | 来自 JSON 导出的原始字段，用于保留业务取值 |
| resign_sign_status | resign_sign_status | int→INT（`parse_int`） | 离职协议签署状态，类似上面 |

## ETL 补充字段

| ODS 列名 | 生成逻辑 |
|-----------|----------|
| content_hash | 对业务字段（排除 ETL 元数据列）计算 SHA-256，用于变更检测与去重 |
| source_file | 固定值：`assistant_accounts_master.json`，标识原始导出文件 |
| source_endpoint | API 端点路径，如 `PersonnelManagement/SearchAssistantInfo` |
| fetched_at | ETL 入库时间戳（`TIMESTAMPTZ DEFAULT now()`） |
| payload | 完整原始 JSON 记录快照（`JSONB NOT NULL`），用于回溯与二次解析 |

## 类型转换规则

- **时间戳**：通过 `TypeParser.parse_timestamp()` 转换，支持 ISO 字符串和 Unix 毫秒时间戳，自动处理时区
- **金额**：通过 `TypeParser.parse_decimal(value, scale=2)` 转换，`ROUND_HALF_UP` 四舍五入
- **整数**：通过 `TypeParser.parse_int()` 转换，`None` 保持为 `NULL`
- **字符串**：原样保留，`None` / 空字符串均存为 `NULL` 或空文本
- **布尔值**：API 返回 `true/false`，ODS 存为 `BOOLEAN` 或 `INT`（0/1）
- **JSONB**：`siteProfile`、`payload` 等复合对象直接以 `JSONB` 类型存储
