初始提交:飞球 ETL 系统全量代码

This commit is contained in:
Neo
2026-02-13 08:05:34 +08:00
commit 3c51f5485d
441 changed files with 117631 additions and 0 deletions

View File

@@ -0,0 +1,801 @@
# 会员储值卡GetTenantMemberCardList
> 自动生成于 2026-02-13 | 数据来源:本地 JSON 样本
## 基本信息
| 属性 | 值 |
|------|-----|
| 接口路径 | `MemberProfile/GetTenantMemberCardList` |
| 完整 URL | `https://pc.ficoo.vip/apiprod/admin/v1/MemberProfile/GetTenantMemberCardList` |
| 请求方法 | `POST` |
| Content-Type | `application/json` |
| 鉴权方式 | Bearer Token`Authorization` 头) |
| ODS 对应表 | `member_stored_value_cards` |
| 分页方式 | `page` + `limit`(最大 100 |
| 时间范围 | 不需要 |
## 请求参数
| 参数名 | 类型 | 示例值 | 说明 |
|--------|------|--------|------|
| `siteId` | int | `2790685415443269` | 门店 ID |
| `cardPhysicsType` | int | `0` | 卡物理类型0=全部) |
| `status` | int | `0` | 状态0=全部) |
| `page` | int | `1` | 页码(从 1 开始) |
| `limit` | int | `100` | 每页条数(最大 100 |
## 响应字段(共 68 个)
| # | 字段名 | 类型 | 示例值 |
|---|--------|------|--------|
| 1 | `site_name` | string | '朗朗桌球' |
| 2 | `member_name` | string | '胡先生' |
| 3 | `member_mobile` | string | '18620043391' |
| 4 | `member_card_type_name` | string | '活动抵用券' |
| 5 | `table_service_discount` | float | 10.0 |
| 6 | `assistant_service_discount` | float | 10.0 |
| 7 | `coupon_discount` | float | 10.0 |
| 8 | `goods_service_discount` | float | 10.0 |
| 9 | `is_allow_give` | int | 0 |
| 10 | `able_cross_site` | int | 1 |
| 11 | `cardSettleDeduct` | float | 0.0 |
| 12 | `tenantAvatar` | string | '' |
| 13 | `tenantName` | string | '' |
| 14 | `member_card_grade_code_name` | string | '活动抵用券' |
| 15 | `table_discount_sub_switch` | int | 2 |
| 16 | `tableAreaId` | array | [] |
| 17 | `goods_discount_sub_switch` | int | 2 |
| 18 | `goodsCategoryId` | array | [] |
| 19 | `assistant_discount_sub_switch` | int | 2 |
| 20 | `pdAssisnatLevel` | array | [] |
| 21 | `assistant_reward_discount_sub_switch` | int | 2 |
| 22 | `cxAssisnatLevel` | array | [] |
| 23 | `goods_discount_range_type` | int | 1 |
| 24 | `use_scene` | string | '' |
| 25 | `balance` | float | 0.0 |
| 26 | `table_deduct_radio` | float | 100.0 |
| 27 | `table_service_deduct_radio` | float | 100.0 |
| 28 | `goods_deduct_radio` | float | 100.0 |
| 29 | `goods_service_deduct_radio` | float | 100.0 |
| 30 | `assistant_deduct_radio` | float | 100.0 |
| 31 | `assistant_service_deduct_radio` | float | 100.0 |
| 32 | `assistant_reward_deduct_radio` | float | 100.0 |
| 33 | `coupon_deduct_radio` | float | 100.0 |
| 34 | `tableCardDeduct` | float | 0.0 |
| 35 | `tableServiceCardDeduct` | float | 0.0 |
| 36 | `goodsCarDeduct` | float | 0.0 |
| 37 | `goodsServiceCardDeduct` | float | 0.0 |
| 38 | `assistantCardDeduct` | float | 0.0 |
| 39 | `assistantServiceCardDeduct` | float | 0.0 |
| 40 | `assistantRewardCardDeduct` | float | 0.0 |
| 41 | `couponCardDeduct` | float | 0.0 |
| 42 | `deliveryFeeDeduct` | float | 0.0 |
| 43 | `is_allow_order_deduct` | int | 0 |
| 44 | `id` | int | 2955206162843781 |
| 45 | `assistant_discount` | float | 10.0 |
| 46 | `assistant_reward_discount` | float | 10.0 |
| 47 | `bind_password` | string | '' |
| 48 | `card_no` | string | '' |
| 49 | `card_physics_type` | int | 1 |
| 50 | `card_type_id` | int | 2793266846533445 |
| 51 | `create_time` | string | '2025-11-08 01:31:12' |
| 52 | `denomination` | float | 0.0 |
| 53 | `disable_end_time` | string | '0001-01-01 00:00:00' |
| 54 | `disable_start_time` | string | '0001-01-01 00:00:00' |
| 55 | `effect_site_id` | int | 0 |
| 56 | `end_time` | string | '2225-01-01 00:00:00' |
| 57 | `goods_discount` | float | 10.0 |
| 58 | `is_delete` | int | 0 |
| 59 | `last_consume_time` | string | '2025-11-09 07:48:23' |
| 60 | `member_card_grade_code` | int | 2790683528022856 |
| 61 | `register_site_id` | int | 2790685415443269 |
| 62 | `sort` | int | 1 |
| 63 | `start_time` | string | '2025-11-08 01:31:12' |
| 64 | `status` | int | 1 |
| 65 | `system_member_id` | int | 2955204540009605 |
| 66 | `table_discount` | float | 10.0 |
| 67 | `tenant_id` | int | 2790683160709957 |
| 68 | `tenant_member_id` | int | 2955204541320325 |
## 新增字段(相对本地 JSON 样本)
以下字段在最新 API 响应中出现,但本地 JSON 样本中不存在:
| 字段名 | 类型 |
|--------|------|
| `able_share_member_discount` | int |
| `electricityCardDeduct` | float |
| `electricity_deduct_radio` | float |
| `electricity_discount` | float |
| `member_grade` | int |
| `principal_balance` | float |
| `rechargeFreezeBalance` | float |
## 详细字段分析
> 以下内容迁移自旧版 `member_stored_value_cards-Analysis.md`,包含字段的业务含义、枚举值、跨表关联等详细说明。
一、文件整体类型与结构
1. 内容类型
从结构看,这个文件其实是 “会员卡列表 / 储值类卡片列表”,并不只包含“储值卡”,而是一个“卡片视图”:
一条记录 = 一张会员卡(已经开通的具体卡)。
记录中同时包含:
卡本身的定义属性(卡种、适用范围、折扣规则等)。
当前账户余额。
持卡会员的基本信息快照(姓名、手机号)。
有效期、最近消费时间等状态信息。
根据字段值,这一页数据中主要有五类卡:
储值卡
活动抵用券
台费卡
酒水卡
月卡
因此,这个 JSON 更准确地理解为:门店下所有储值/次卡/券类会员卡的列表视图。
二、卡片记录字段逐项说明
以下按逻辑分组:卡种信息 / 折扣规则 / 金额与余额 / 时间与有效期 / 会员信息 / 门店与适用范围 / 状态与开关类字段 / 预留扩展字段。
1. 卡种 / 类别相关字段
1.1 卡种主键与类别名称
card_type_id
类型int
含义:卡种 ID定义“这是哪一种卡”
枚举(按数据分布):
2793249295533893
2793266846533445
2791990152417157
2794699703437125
2793306611533637
这些 ID 对应不同的卡种配置,具体含义在系统内部的“卡种配置表”中。
member_card_grade_code
类型int
含义:卡等级/卡类代码,和下面两个名称字段一一对应。
枚举:
2790683528022853 → 储值卡
2790683528022856 → 活动抵用券
2790683528022855 → 台费卡
2790683528022858 → 酒水卡
2790683528022857 → 月卡
member_card_grade_code_name
类型string
含义:卡等级/卡类名称。
枚举值(与上面 code 一一对应):
"储值卡"
"活动抵用券"
"台费卡"
"酒水卡"
"月卡"
member_card_type_name
类型string
含义:卡类型名称,实际与 member_card_grade_code_name 一致。
枚举值同上。
说明:更偏展示用的冗余字段。
结论虽然文件名叫“储值卡列表”但从字段看是“会员卡列表”包含五类卡card_type_id / member_card_grade_code / member_card_grade_code_name / member_card_type_name 共同定义“这张卡属于哪一类”。
card_physics_type
类型int
含义:物理卡类型。
当前数据:全部为 1。
推测枚举:
1实体卡或标准卡
其他值(未出现)可能代表虚拟卡、第三方卡等。
card_no
类型string
当前数据:全部为 ""(空)。
含义(推测):实体卡物理卡号/条码号。当前这批卡看起来全部为“无物理卡号”(可能是全部虚拟卡或卡号隐藏不导出)。
bind_password
类型string
当前数据:全部 ""。
含义:卡绑定密码,用于消费或查询验证(目前未启用)。
use_scene
类型string
当前数据:全部 ""。
含义:卡使用场景说明(比如“仅店内使用”“仅团建”等),本门店尚未使用此字段。
2. 会员信息与关联字段
这些字段把卡和会员档案关联起来。
member_name
类型string 或 null
含义:持卡会员姓名快照。
特点:存在 null20 张卡没有绑定会员名字)。
member_mobile
类型string 或 null
含义:持卡会员手机号快照。
特点:与 member_name 对应,多数有值,少量为 null。
system_member_id
类型int
含义:系统级会员 ID跨门店统一主键
枚举特征:
0约 20 条,为“未绑定具体会员”或“散客卡”。
非 0与“会员档案.json”中的 system_member_id 对应。
tenant_member_id
类型int
含义:当前商户(品牌/租户)中会员的主键 ID。
枚举特征:
0同样是未绑定会员的卡。
非 0与“会员档案.json”中的 id 对应。
关系:
这两个字段共同完成“卡 → 会员”的双钥匙关联:
system_member_id全局会员
tenant_member_id本租户内会员档案主键。
3. 门店与适用范围字段
site_name
类型string
当前值:全部为 "朗朗桌球"。
含义:卡归属门店名称(视图中的展示字段)。
tenantName
类型string
当前值:全部为 ""。
含义:租户/品牌名称(当前导出为空)。
tenantAvatar
类型string
当前值:全部为 ""。
含义:品牌头像 URL未配置
tenant_id
类型int
含义:租户/品牌 ID与其他 JSON 中 tenant_id 一致。
register_site_id
类型int
当前值:全部 2790685415443269。
含义:卡首次办理的门店 ID。
对应门店的 site_id本数据中所有卡都是在同一家门店开卡。
effect_site_id
类型int
当前值:全部 0。
含义(推测):卡片限定生效门店 ID。
为 0 时,配合 able_cross_site=1可解释为“所有门店可用”。
able_cross_site
类型int枚举。
当前值:全部 1。
含义:是否允许跨店使用。
1可以跨门店使用
0仅限开卡门店。
结合 effect_site_id=0 可以解读为:当前卡种都配置为“全门店通用”。
4. 金额与余额类字段
balance
类型float
含义:当前卡内余额(主要针对储值卡、部分券卡)。
特征:
有 59 个不同的值,大部分是 0.0,其它有 985、500、若干小数等。
对于“活动抵用券”“月卡”等,有可能余额意义不同(只是当前视图统一用 balance 作为额度字段)。
denomination
类型float
当前值:全部 0.0。
含义(推测):面额/初始储值额度。
本页数据未填充此字段;可能在分类型卡(如次卡/券)中才有意义,或者另有配置表。
5. 各类折扣与抵扣规则字段
这一块字段非常多,但结构有明显统一性:
按“消费场景 × 折扣类型”来区分。
三大消费场景:
台费table_*
商品goods_*
助教assistant_* / assistant_reward_* / assistant_service_*
再叠加:
discount折扣打几折
service_discount服务类折扣
discount_sub_switch折扣是否叠加/替代
deduct_radio这类消费是否允许扣卡 & 扣卡比例(百分比)
CardDeduct扣卡金额
ServiceCardDeduct、RewardCardDeduct扣卡金额的不同“资金子账户”储值金 / 服务金 / 奖励金)
5.1 折扣百分比类(打几折)
table_discount / goods_discount / assistant_discount / assistant_reward_discount / table_service_discount / goods_service_discount / assistant_service_discount
类型float
当前值:全部 10.0(所有字段)。
含义:
采用“几折”的记法10=不打折9=九折8=八折。
现状:当前这批卡,在所有场景/子场景(台费、商品、助教、奖励金)上的折扣统一都是 10.0,表示没有折扣设置。
5.2 折扣叠加开关
table_discount_sub_switch / goods_discount_sub_switch / assistant_discount_sub_switch / assistant_reward_discount_sub_switch
类型int枚举。
当前值:全部 2。
含义(推测):“折扣是否叠加/替换其他折扣”的开关。
可能枚举:
1叠加其他折扣
2不叠加仅用卡折扣
具体枚举值需看后台配置,但从命名能看出是折扣叠加策略字段。
5.3 抵扣比例类(%
table_deduct_radio / goods_deduct_radio / assistant_deduct_radio / table_service_deduct_radio / goods_service_deduct_radio / assistant_service_deduct_radio / coupon_deduct_radio
类型float
当前值:全部 100.0。
含义:允许从该卡余额中抵扣的比例(百分比)。
100.0 表示允许 100% 用卡余额支付该类消费;
如果是 0通常表示不允许该类消费抵扣。
当前:卡配置为“理论上所有消费场景都可以全额用卡支付”,只是在折扣、金额层面没有特别设定。
5.4 实际扣卡金额设置(配置层)
cardSettleDeduct
类型float
当前值0.0。
含义:结算时从卡中扣除的金额上限/规则配置(视图级;实际扣款在交易流水里体现)。
tableCardDeduct / goodsCarDeduct / assistantCardDeduct
类型float
当前值:全部 0.0。
含义:针对台费/商品/助教三类消费的扣卡金额配置(类似“每小时从卡里扣 xx 元”或“每次抵扣 xx 元”的规则)。
当前:所有为 0说明在卡定义层面并没有指定固定扣卡金额而是按照一般储值逻辑消费。
tableServiceCardDeduct / goodsServiceCardDeduct / assistantServiceCardDeduct
类型float
当前值:全部 0.0。
含义:如果系统中区分“储值金、服务金、奖励金”等子账户,这三个字段对应“服务金”子账户的扣款配置。
当前未启用。
assistantRewardCardDeduct
类型float
当前值0.0。
含义:助教奖励金方向扣款的配置。
当前未启用。
assistantRewardCardDeduct拼写略有不同
实际字段名是 assistantRewardCardDeduct同上意义当前为 0。
couponCardDeduct
类型float
当前值0.0。
含义:与卡绑定的“券额度扣除配置”。
deliveryFeeDeduct
类型float
当前值0.0。
含义:配送费可否/多少从卡中抵扣,目前无业务发生。
综合来看本门店的卡片在“规则配置层”预留了大量细粒度控制字段但目前实际使用只体现在“balance”和“可用范围”折扣和具体扣卡规则基本都未启用全部保持默认值 10 折、100%比例、0 扣款),真正扣款逻辑在交易流水中体现。
6. 时间与有效期相关字段
create_time
类型string格式 YYYY-MM-DD HH:MM:SS
含义:卡片创建时间(开卡时间)。
start_time
类型string
含义:卡片生效开始时间(有效期起始)。
end_time
类型string
含义:卡片有效期结束时间。
start_time / end_time 组合就是卡的有效期。不同卡种有效期配置不同,如储值卡长效、月卡固定一个月等。
disable_start_time / disable_end_time
类型string
当前值:全部 "0001-01-01 00:00:00"。
含义:停用时间段(比如临时冻结卡的起止时间)。
当前未启用,所有卡都是“未进入停用窗口”。
last_consume_time
类型string
含义:最近一次消费时间。
特点:
对未消费过的卡,值为 "1970-01-01 00:00:00"(典型“未初始化时间”的占位值)。
对已消费卡,则记录最后一次交易时间。
7. 卡状态与逻辑标志
status
类型int枚举。
取值:
1196 条;
44 条。
含义(推测):
1正常可用
4过期/停用/作废(具体哪一种需要结合系统配置和有效期判断)。
从结构看,这是卡当前状态的核心字段。
is_delete
类型int枚举。
当前值0。
含义:逻辑删除标志。
0未删除
1逻辑删除软删除
is_allow_give
类型int枚举。
当前值0。
含义:是否允许转赠/转让给其他会员。
0不允许
1允许转赠。
is_allow_order_deduct
类型int枚举。
当前值0。
含义:是否允许在“订单层面统一扣款”。
0不允许仅按项目扣卡
1允许整单抵扣。
8. 适用范围扩展字段(列表)
tableAreaId
类型list
当前值:全部 []。
含义:限定可使用的台区 ID 列表。
为空表示“不限制台区”。
goodsCategoryId
类型list
当前值:全部 []。
含义:可用的商品分类 ID 列表。
为空表示对所有商品分类有效。
pdAssisnatLevel
类型list
当前值:全部 []。
含义:允许使用的“陪打/助教等级”列表。
为空表示不限制助教等级。
cxAssisnatLevel
类型list
当前值:全部 []。
含义:可能是“促销活动中的助教等级限制”(命名中 cx 多为“促销”缩写)。
当前未设置任何限制。
9. 其他字段
cardSettleDeduct
已在扣卡规则部分说明,当前为 0。
tableAreaId / goodsCategoryId / pdAssisnatLevel / cxAssisnatLevel
已上文说明:均为扩展限定维度,当前全部为空列表。
sort
类型int
含义:在前端展示或某些列表中的排序权重。
具体取值分布不重要,主要反映展示优先级。
三、与其他 JSON 的结构性关联(从字段角度)
只从字段关系来讲,不做任何金额/盈利分析:
与《会员档案.json》
tenant_member_id ↔ 会员档案中的 id
system_member_id ↔ 会员档案中的 system_member_id
卡片列表是“余额视图”,会员档案是“会员主体信息维表”。
与储值/卡交易流水(如果有单独的“储值卡交易明细” JSON
应通过某个卡 ID本文件中未见显式“card_id”推测是 tenant_member_id + card_type_id 组合或还有一个隐藏键)。
本文件记录的是“当前余额”和规则;交易流水才是每次充值/消费的明细。
与台费流水 / 助教流水 / 门店销售记录:
折扣/抵扣规则维度:
台费相关table_discount、table_deduct_radio 等;
商品相关goods_discount、goods_deduct_radio 等;
助教相关assistant_discount、assistant_deduct_radio 等。
在真正的消费记录里会根据这些规则确定“从卡中扣多少”、“实际应收多少”对应字段往往是“coupon_deduct_money”、“member_discount_amount”等。
与门店档案 / 台桌列表:
通过 register_site_id & site_name 与门店档案关联;
扩展字段 tableAreaId 理论上可以和台桌区域表关联(当前为 [],即不限制)。
与“门店销售汇总/对账视图”:
这个文件本质上是“卡余额视图”,余额字段会被用于对账和资产统计,但对应明细还是要依赖卡交易流水。
四、结构层面的几个重要线索(不涉及大数据和盈利分析)
从字段结构可以看出:
这是一个高度通用的“会员卡规则+余额视图”
同一张卡可以同时配置“台费折扣/商品折扣/助教折扣”,“储值金/服务金/奖励金”等多个子账户的使用规则。
当前门店只启用了“普通储值余额 + 全默认折扣”的简单模式,但字段结构明显支持更复杂的业务。
卡与会员,是多对一关系
一个会员可以有多张卡(不同 card_type_id / member_card_grade_code
每条记录都持有 system_member_id 和 tenant_member_id即随时能从卡追溯到会员。
卡的有效期体系是严密的
有效期start_time + end_time
停用窗口disable_start_time + disable_end_time当前未启用
状态位status、is_delete
最近使用last_consume_time
这套结构足以支持:正常→停用→恢复→过期等多阶段。
适用范围具有多维度控制能力
门店维度able_cross_site、effect_site_id、register_site_id
台区维度tableAreaId
商品分类维度goodsCategoryId
助教等级维度pdAssisnatLevel、cxAssisnatLevel
当前门店这些维度都未限制,但字段设计说明系统支持非常细的策略,例如“某卡只在特定台区/特定商品/特定等级助教时可用”。
折扣与抵扣机制被拆得非常细
折扣discount 系列、抵扣比例deduct_radio 系列、抵扣金额CardDeduct 系列),再叠加“服务金”“奖励金”这种资金子账户。
结构上完全可以做到:“这张卡台费九折、但最多只允许 50% 金额由卡支付,剩余必须现金;助教可全额抵扣但不打折”等非常复杂的组合。
当前导出数据处于“规则未开启、余额为主”的轻量使用阶段
折扣全部是 10.0
抵扣比例全部 100.0
各类 CardDeduct 字段全部为 0
disable_* 时间全部为 0001-01-01
很多扩展维度字段为空列表。
说明:门店暂时只使用了“储值余额 + 卡类型 + 有效期 + 会员关联”几块核心功能。