# 会员储值卡（GetTenantMemberCardList） → member_stored_value_cards 字段映射

> 生成时间：2026-02-14

## 端点信息

| 属性 | 值 |
|------|-----|
| 接口路径 | `MemberProfile/GetTenantMemberCardList` |
| 请求方法 | POST |
| ODS 对应表 | `ods.member_stored_value_cards` |
| JSON 数据路径 | `data.tenantMemberCards` |

## 字段映射

| JSON 字段 | ODS 列名 | 类型转换 | 说明 |
|-----------|----------|----------|------|
| tenant_id | tenant_id | int→BIGINT（`parse_int`） | 租户/品牌 ID，与其他 JSON 中 tenant_id 一致 |
| tenant_member_id | tenant_member_id | int→BIGINT（`parse_int`） | 当前商户（品牌/租户）中会员的主键 ID |
| system_member_id | system_member_id | int→BIGINT（`parse_int`） | 系统级会员 ID（跨门店统一主键） |
| register_site_id | register_site_id | int→BIGINT（`parse_int`） | 卡首次办理的门店 ID |
| site_name | site_name | string→TEXT（原样） | 卡归属门店名称（视图中的展示字段） |
| id | id | int→BIGINT（`parse_int`） | 本表主键 ID，用于唯一标识一条记录 |
| member_card_grade_code | member_card_grade_code | int→BIGINT（`parse_int`） | 卡等级/卡类代码，和下面两个名称字段一一对应 |
| member_card_grade_code_name | member_card_grade_code_name | string→TEXT（原样） | 卡等级/卡类名称 |
| member_card_type_name | member_card_type_name | string→TEXT（原样） | 卡类型名称，实际与 member_card_grade_code_name 一致 |
| member_name | member_name | string→TEXT（原样） | 持卡会员姓名快照 |
| member_mobile | member_mobile | string→TEXT（原样） | 持卡会员手机号快照 |
| card_type_id | card_type_id | int→BIGINT（`parse_int`） | 卡种 ID（定义“这是哪一种卡”） |
| card_no | card_no | string→TEXT（原样） | 实体卡物理卡号／条码号 |
| card_physics_type | card_physics_type | string→TEXT（原样） | 物理卡类型 |
| balance | balance | float→NUMERIC(18,2)（`parse_decimal`） | 当前卡内余额（主要针对储值卡、部分券卡） |
| denomination | denomination | float→NUMERIC(18,2)（`parse_decimal`） | 采用“几折”的记法：10=不打折，9=九折，8=八折 |
| table_discount | table_discount | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 数量/时长字段，用于统计与计量 |
| goods_discount | goods_discount | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 数量/时长字段，用于统计与计量 |
| assistant_discount | assistant_discount | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 数量/时长字段，用于统计与计量 |
| assistant_reward_discount | assistant_reward_discount | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 数量/时长字段，用于统计与计量 |
| table_service_discount | table_service_discount | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 数量/时长字段，用于统计与计量 |
| assistant_service_discount | assistant_service_discount | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 数量/时长字段，用于统计与计量 |
| coupon_discount | coupon_discount | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 数量/时长字段，用于统计与计量 |
| goods_service_discount | goods_service_discount | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 数量/时长字段，用于统计与计量 |
| assistant_discount_sub_switch | assistant_discount_sub_switch | int→INT（`parse_int`） | 数量/时长字段，用于统计与计量 |
| table_discount_sub_switch | table_discount_sub_switch | int→INT（`parse_int`） | 数量/时长字段，用于统计与计量 |
| goods_discount_sub_switch | goods_discount_sub_switch | int→INT（`parse_int`） | 数量/时长字段，用于统计与计量 |
| assistant_reward_discount_sub_switch | assistant_reward_discount_sub_switch | int→INT（`parse_int`） | 数量/时长字段，用于统计与计量 |
| table_service_deduct_radio | table_service_deduct_radio | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 金额字段，用于计费/结算/分摊等金额计算 |
| assistant_service_deduct_radio | assistant_service_deduct_radio | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 金额字段，用于计费/结算/分摊等金额计算 |
| goods_service_deduct_radio | goods_service_deduct_radio | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 金额字段，用于计费/结算/分摊等金额计算 |
| assistant_deduct_radio | assistant_deduct_radio | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 金额字段，用于计费/结算/分摊等金额计算 |
| table_deduct_radio | table_deduct_radio | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 金额字段，用于计费/结算/分摊等金额计算 |
| goods_deduct_radio | goods_deduct_radio | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 金额字段，用于计费/结算/分摊等金额计算 |
| coupon_deduct_radio | coupon_deduct_radio | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 金额字段，用于计费/结算/分摊等金额计算 |
| assistant_reward_deduct_radio | assistant_reward_deduct_radio | float→NUMERIC(10,4)（`parse_decimal(scale=4)`） | 金额字段，用于计费/结算/分摊等金额计算 |
| tableCardDeduct | tableCardDeduct | float→NUMERIC(18,2)（`parse_decimal`） | 针对台费/商品/助教三类消费的扣卡金额配置（类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则） |
| tableServiceCardDeduct | tableServiceCardDeduct | float→NUMERIC(18,2)（`parse_decimal`） | 如果系统中区分“储值金、服务金、奖励金”等子账户，这三个字段对应“服务金”子账户的扣款配置 |
| goodsCarDeduct | goodsCarDeduct | float→NUMERIC(18,2)（`parse_decimal`） | 针对台费/商品/助教三类消费的扣卡金额配置（类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则） |
| goodsServiceCardDeduct | goodsServiceCardDeduct | float→NUMERIC(18,2)（`parse_decimal`） | 如果系统中区分“储值金、服务金、奖励金”等子账户，这三个字段对应“服务金”子账户的扣款配置 |
| assistantCardDeduct | assistantCardDeduct | float→NUMERIC(18,2)（`parse_decimal`） | 针对台费/商品/助教三类消费的扣卡金额配置（类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则） |
| assistantServiceCardDeduct | assistantServiceCardDeduct | float→NUMERIC(18,2)（`parse_decimal`） | 如果系统中区分“储值金、服务金、奖励金”等子账户，这三个字段对应“服务金”子账户的扣款配置 |
| assistantRewardCardDeduct | assistantRewardCardDeduct | float→NUMERIC(18,2)（`parse_decimal`） | 助教奖励金方向扣款的配置 |
| cardSettleDeduct | cardSettleDeduct | float→NUMERIC(18,2)（`parse_decimal`） | 结算时从卡中扣除的金额上限/规则配置（视图级 |
| couponCardDeduct | couponCardDeduct | float→NUMERIC(18,2)（`parse_decimal`） | 与卡绑定的“券额度扣除配置” |
| deliveryFeeDeduct | deliveryFeeDeduct | float→NUMERIC(18,2)（`parse_decimal`） | 配送费可否/多少从卡中抵扣，目前无业务发生 |
| use_scene | use_scene | int→INT（`parse_int`） | 卡使用场景说明（比如“仅店内使用”“仅团建”等），本门店尚未使用此字段 |
| able_cross_site | able_cross_site | int→INT（`parse_int`） | 是否允许跨店使用 |
| is_allow_give | is_allow_give | int→INT（`parse_int`） | 是否允许转赠/转让给其他会员 |
| is_allow_order_deduct | is_allow_order_deduct | int→INT（`parse_int`） | 是否允许在“订单层面统一扣款” |
| is_delete | is_delete | int→INT（`parse_int`） | 逻辑删除标志 |
| bind_password | bind_password | string→TEXT（原样） | 卡绑定密码，用于消费或查询验证（目前未启用） |
| goods_discount_range_type | goods_discount_range_type | int→INT（`parse_int`） | 数量/时长字段，用于统计与计量 |
| goodsCategoryId | goodsCategoryId | int→BIGINT（`parse_int`） | 可用的商品分类 ID 列表 |
| tableAreaId | tableAreaId | int→BIGINT（`parse_int`） | 限定可使用的台区 ID 列表 |
| effect_site_id | effect_site_id | int→BIGINT（`parse_int`） | 卡片限定生效门店 ID |
| start_time | start_time | string→TIMESTAMP（`parse_timestamp`） | 卡片生效开始时间（有效期起始） |
| end_time | end_time | string→TIMESTAMP（`parse_timestamp`） | 卡片有效期结束时间 |
| disable_start_time | disable_start_time | string→TIMESTAMP（`parse_timestamp`） | 停用时间段（比如临时冻结卡的起止时间） |
| disable_end_time | disable_end_time | string→TIMESTAMP（`parse_timestamp`） | 停用时间段（比如临时冻结卡的起止时间） |
| last_consume_time | last_consume_time | string→TIMESTAMP（`parse_timestamp`） | 最近一次消费时间 |
| create_time | create_time | string→TIMESTAMP（`parse_timestamp`） | 卡片创建时间（开卡时间） |
| status | status | int→INT（`parse_int`） | 状态枚举，用于标识记录当前业务状态 |
| sort | sort | int→INT（`parse_int`） | 在前端展示或某些列表中的排序权重 |
| tenantAvatar | tenantAvatar | string→TEXT（原样） | 品牌头像 URL（未配置） |
| tenantName | tenantName | string→TEXT（原样） | 租户/品牌名称（当前导出为空） |
| pdAssisnatLevel | pdAssisnatLevel | string→TEXT（原样） | 允许使用的“陪打/助教等级”列表 |
| cxAssisnatLevel | cxAssisnatLevel | string→TEXT（原样） | 可能是“促销活动中的助教等级限制”（命名中 cx 多为“促销”缩写） |
| able_share_member_discount | able_share_member_discount | bool→BOOLEAN | 是否共享会员折扣（新增字段） |
| electricity_deduct_radio | electricity_deduct_radio | float→NUMERIC(18,4)（`parse_decimal(scale=4)`） | 电费抵扣比例（百分比，100.0=全额可抵扣）（新增字段） |
| electricity_discount | electricity_discount | float→NUMERIC(18,4)（`parse_decimal(scale=4)`） | 电费折扣（10.0=不打折，采用"几折"记法）（新增字段） |
| electricitycarddeduct | electricitycarddeduct | bool→BOOLEAN | 电费是否可从卡中抵扣（新增字段） |
| member_grade | member_grade | int→BIGINT（`parse_int`） | 会员等级 ID（新增字段） |
| principal_balance | principal_balance | float→NUMERIC(18,2)（`parse_decimal`） | 本金余额（储值卡中本金部分的余额）（新增字段） |
| rechargefreezebalance | rechargefreezebalance | float→NUMERIC(18,2)（`parse_decimal`） | 充值冻结余额（新增字段） |

## ETL 补充字段

| ODS 列名 | 生成逻辑 |
|-----------|----------|
| content_hash | 对业务字段（排除 ETL 元数据列）计算 SHA-256，用于变更检测与去重 |
| source_file | 固定值：`member_stored_value_cards.json`，标识原始导出文件 |
| source_endpoint | API 端点路径，如 `MemberProfile/GetTenantMemberCardList` |
| 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` 类型存储
