--- title: 会员中心 - 邀请记录 type: design module: member page_type: list created: 2026-09-05 updated: 2026-09-05 sources: [design/c-end/c-end-tables, design/c-end/pages/cend-member/invite, design/rules/member-business-rules, design/schema/member-tables, design/design-conventions] priority: P1 confidence: medium --- # 邀请记录 — 页面详细设计 > **待确认清单**(原型先行页,2026-09-05 spec 补写批次,未确认前不臆造): > - `[待确认-1]` **双轨口径并存**:C 端新表方案 `member_invite_record`(三态 待完成/已成功/已失效 + 奖励列,[[design/c-end/c-end-tables]] §十一,P1 2026-08-25)vs server-cdz 实接口 V5 **派生口径**(无独立邀请表,由 `member_member.invited_user_id/invitation_expiration_date` 派生,仅 有效/已过期 二态,无首单联查)。本页 real 分支消费派生口径:有效→待完成、已过期→已失效;**「已成功」与奖励积分无服务端口径 → real 展示 '-'/0(演示口径)**。新表落地后建议切表读(补首单/奖励)。 > - `[待确认-2]` member-api 未登记本页契约(88 页批次后补页):real 口径以 server-cdz `MemberController` + `api/member.ts` 注释为准;汇总/导出无端口径(real 统计卡仅"总数"真实,其余置 0;导出为演示 toast)。 > - `[待确认-3]` 邀请码生成规则与有效期:C 端「邀请有礼」文案"邀请码 30 天内有效"、示例 `WD20260001`;mock 示例 `INV-8K2F`;真实生成/过期规则以 C 端 invite 页 + `member_member.invitation_expiration_date` 定稿([[design/schema/member-tables]] §2.1)。 > - `[待确认-4]` 奖励默认值:R-member-03 邀请 200 积分、限 10 人/月(change_type=5,member_member.invited_user_id 溯源)为 B 端口径;C 端已确认"双方各 200 积分"(2026-08-25);行内提示文案"每成功 1 人默认 200 分"以积分规则页配置为准。 ## 1. 页面定位与用户目标 - 一句话描述:本页用于查看会员邀请拉新记录(邀请人/被邀请人/邀请码/状态/奖励积分/首单时间),顶部统计卡做规模概览,是运营评估「邀请有礼」裂变效果与奖励对账的查询页(**只读**,无写操作)。 - 用户目标/任务: - 运营商/运营(主角色):看邀请规模与状态分布(总数/已成功/待完成/已失效),评估裂变 ROI;核对邀请奖励积分发放(R-member-03 对账)。 - 值班员:查某邀请人手机号的邀请明细,处理奖励争议(需联动 [[pages/member/points]] 流水溯源)。 - 入口路径:`/member/invite-record`(PC) - 所属模块:[[modules/member-prd]](88 页口径 P1,关联 C 端签到·邀请体系 member_invite_record) - 页面类型:list - 优先级:P1 - 设计来源(调研依据): - 行为基准 = 原型 `prototype/src/views/member/InviteRecord.vue`(real/mock 双轨,见 §8)与 `api/member.ts`(fetchInviteRecords、InvitationQuery、toInvitationDTO)。 - 写入源 = C 端「邀请有礼」页([[design/c-end/pages/cend-member/invite]],`/pages/member/invite`):邀请码分享/海报、奖励规则、邀请记录(快电三状态 Tab 实证)。 - 表结构 = `member_invite_record`([[design/c-end/c-end-tables]] §十一,UK(invited_member_id))+ `member_member` 邀请字段族([[design/schema/member-tables]] §2.1:invitation_code/invited_user_id/invitation_expiration_date)。 - 规则 = R-member-03 邀请奖励([[design/rules/member-business-rules]])。 ## 2. 布局与交互线框(ASCII) ### PC 端 ``` +------------------------------------------------------------------+ | [顶部统计卡区 - 4 指标(可点击过滤)] | | +---------+ +---------+ +---------+ +---------+ | | |邀请总数 | |已成功 | |待完成 | |已失效 | | | | 128 | | 56 | | 45 | | 27 | ← real: 仅总数真实,其余 0([待确认-1/2]) | +---------+ +---------+ +---------+ +---------+ | +------------------------------------------------------------------+ | [筛选区] | | 邀请人手机号[____] 邀请状态[下拉▼ 待完成/已成功/已失效] | | [查询] [重置] | +------------------------------------------------------------------+ | [工具栏] 成功邀请已发奖励积分合计 11,200 分(每成功 1 人默认 200 分,change_type=5) | [导出] | +------------------------------------------------------------------+ | [表格区] | | 记录ID | 邀请人 | 被邀请人 | 邀请码 | 状态 | 奖励积分 | 被邀人首单时间 | 邀请时间 | | 10001 | 138****5678 | 139****1234 | INV-8K2F | 已成功 | 200 | 08-03 12:00 | 07-28 09:00 | | 10002 | 138****5678 | 137****9012 | INV-3M9Q | 待完成 | - | - | 08-05 15:30 | +------------------------------------------------------------------+ | [分页] | +------------------------------------------------------------------+ ``` > real 分支差异:状态下拉仅 待完成/已失效(已成功无服务端口径,选项剔除);点击"已成功"统计卡 → 提示不可过滤;会员列脱敏手机号。 ## 3. 功能点清单 | 编号 | 功能点 | 触发位置 | 权限码 | 行为描述 | 来源 | |------|--------|---------|--------|---------|------| | FP-01 | 邀请记录分页 | 页面加载/筛选 | member:view | real:GET /api/member/invitations 服务端分页 + status 筛选;mock:本地过滤 + 装饰分页 | 原型 InviteRecord.vue | | FP-02 | 状态统计卡过滤 | 顶部 4 卡 | member:view | 点击卡片带状态筛选(real 透传 status 1/2 服务端过滤;已成功 real 拦截提示) | 原型(mock 实时聚合) | | FP-03 | 手机号筛选 | 筛选区 | member:view | 邀请人手机号(子串);**real 无服务端筛选键 → 仅 mock 生效**([待确认-2]) | 原型 | | FP-04 | 奖励积分展示 | 表格行 | member:view | 仅 已成功 显示 rewardPoints(其余 '-');real 恒 0 → 展示 '-'([待确认-1]) | 原型 | | FP-05 | 导出 | 工具栏 | member:export | 异步导出当前筛选 ≤10000 条;**演示 toast(real 无导出接口,[待确认-2])** | 原型(通用列表能力) | | FP-06 | 奖励合计提示 | 工具栏文案 | member:view | 成功邀请奖励积分合计(mock 聚合;real 置 0 演示口径) | 原型(R-member-03) | ## 4. 字段定义 | 字段 | key | 类型 | 必填 | 校验规则 | 枚举/默认 | 单位 | 来源 | 说明 | |------|-----|------|------|---------|-----------|------|------|------| | 记录 ID | inviteId | bigint | 是 | - | - | - | c-end-tables §十一 / real 派生 | mock 自增;**real = 被邀请会员 memberId(行=被邀请人)** | | 邀请人手机号 | inviterMobile | string | 是 | 11 位手机号 | - | - | 同上 | 展示脱敏;real 由 invited_user_id 反查(解析失败 '-') | | 被邀请人手机号 | invitedMobile | string | 否 | 11 位手机号 | - | - | 同上 | 未注册完成可空(real 展示 '-'; mock invitedMobile 或 '-');行主标识见上 | | 邀请码 | invitationCode | string | 是 | ≤30 | mock `INV-xxxx` / C 端示例 `WD20260001` | - | member_member.invitation_code | 被邀请人填写/分享的邀请码,格式规则 [待确认-3] | | 状态 | status | enum | 是 | 三态 | 1=待完成/2=已成功/3=已失效(原型中文,色码:待完成橙/已成功绿/已失效灰) | - | c-end-tables §十一 | **real 仅 二态**:有效(1)→待完成、已过期(2)→已失效;已成功无服务端口径([待确认-1]) | | 奖励积分 | rewardPoints | int | 否 | ≥0 | 默认 200(R-member-03/C 端双方各 200) | 积分 | c-end-tables §十一 | 仅已成功发放并写 member_points_transaction change_type=5;real 恒 0 → '-'([待确认-4]) | | 被邀人首单时间 | firstOrderTime | datetime | 否 | - | - | - | c-end-tables §十一 | 待完成→已成功 的触发时间;**real 无首单联查 → '-'([待确认-1])** | | 邀请时间 | createTime | datetime | 是 | - | - | - | 同上 / real 派生 | mock=记录建立时间;**real=被邀请人注册时间(registerTime)** | | 过期时间 | expireTime | datetime | 否 | - | 邀请码 30 天内有效 | - | member_member.invitation_expiration_date | real 派生行字段(页面未直接展示,用于状态判定) | > 状态枚举色码登记于 `prototype/src/constants/status.ts`(INVITE_STATUS/INVITE_STATUS_TAG_TYPE);int 映射:待完成→1、已失效→2(real,MemberVOs inviteStatus 1=有效/2=已过期)。金额/积分单位:积分(无金额字段)。 ## 5. 业务逻辑规则卡 > R-member-03 为 [[design/rules/member-business-rules]] 权威规则;R-inv-* 为页面派生局部规则,待接真/规则评审时并入 rules 文档登记。 | 编号 | 规则名 | 触发条件 | 业务逻辑 | 边界/异常 | 来源 | |------|--------|---------|---------|----------|------| | R-member-03 | 邀请奖励发放 | 被邀请人完成首单 | 邀请人得 200 积分(默认,限 10 人/月,change_type=5 INVITE,member_member.invited_user_id 溯源),写 member_points_transaction + 更新余额 | 超额拦截:409 MEMBER_4092"本月邀请奖励已达上限 10";C 端 2026-08-25 确认双方各 200 积分 | [[design/rules/member-business-rules]] R-member-03;[[design/c-end/pages/cend-member/invite]] | | R-inv-01 | 邀请唯一关系 | 邀请关系建立 | 被邀请人仅归属 1 个邀请人:member_invite_record `UK(invited_member_id)`(新表方案);V5 由 member_member.invited_user_id 单值承载(派生口径天然唯一) | 重复邀请 → 409 MEMBER_4092(对齐 R-member-03 冲突码族) | c-end-tables §十一 | | R-inv-02 | 邀请状态机 | 状态渲染/流转 | 待完成 → 已成功(被邀人完成首单,记 first_order_time)/ 已失效(邀请码过期 invitation_expiration_date);real 派生二态:未过期=有效→待完成、已过期→已失效 | 有效/过期判定边界:过期时刻精确到秒,任务或惰性判定开发期定稿;已成功态 real 无法表达([待确认-1]) | c-end-tables §十一;[[design/c-end/pages/cend-member/invite]] | | R-inv-03 | 奖励对账只读 | 页面展示 | 页面为只读查询:奖励发放真实凭据在 member_points_transaction(change_type=5),本页展示不承担发放/补发 | 账实不符(member_invite_record 已成功但无流水)→ 走积分对账任务(对齐 R-member-01 对账语义),列表标黄提示开发期定稿 | R-member-01/03 | ## 6. 操作流程与状态机 ### 6.0 邀请记录状态机(新表方案三态;real 派生二态子集) ```mermaid stateDiagram-v2 [*] --> 待完成: 被邀请人注册并填邀请码 待完成 --> 已成功: 被邀请人完成首单(发 200 积分) 待完成 --> 已失效: 邀请码过期(30 天) 已成功 --> [*] 已失效 --> [*] ``` > real(V5)派生:`invited_user_id` 非空会员 = 一条记录,按 `invitation_expiration_date` 判定 有效(→待完成)/已过期(→已失效),**无 已成功 分支**。 ### 6.1 用户故事 - US-1(运营商,PC):作为运营商,我想按月查看邀请总数与已成功分布,以便评估拉新活动效果。验收:顶部统计卡点击"待完成"列表即时带状态过滤;real 分支"已成功"卡点击给出不可过滤提示。 - US-2(值班员):作为值班员,我想按邀请人手机号查其全部邀请明细,以便核实奖励争议。验收:输入手机号回车命中该邀请人记录(mock 子串匹配;real 无手机号筛选键 → 提示按状态/分页浏览,[待确认-2])。 ### 6.2 测试场景(五要素:目标/前置/角色/步骤/预期) - TS-1(正常):邀请人 138****5678 的已成功记录 → 奖励积分列显示 200,首单时间非空;点击统计卡"已失效" → 列表仅剩灰"已失效"行。 - TS-2(边界):空邀请库 → 空态"暂无邀请记录,会员在 C 端邀请后展示于此"。 - TS-3(异常):real 分支点击"已成功"统计卡 → warning 提示"real 模式 V5 派生无「已成功」首单口径…无法按已成功过滤",不触发筛选。 ## 7. 权限控制 | 操作 | 权限码 | 角色([[permission-matrix]]) | 无权限表现 | |------|--------|------------------------------|-----------| | 查看列表/统计 | member:view | 值班员/运营商/站长 | 隐藏菜单 | | 导出 | member:export | 运营商 | 按钮隐藏 | > 本页只读,无写权限码;奖励发放/调整走 [[pages/member/points]](member:points:adjust,人工补偿 R-member-03 兜底)。 ## 8. 接口契约 > **契约未登记 [[design/api/member-api]](本页为 88 页批次后补页)**;real 口径以 server-cdz `module/member/controller/MemberController`(@RequestMapping("/api/member"))+ `api/member.ts` 为准。下表标注「已实现」= server-cdz M7+ 读切片已落地;「待后置」= 未实现。 | 接口 | 方法 | 路径 | 请求关键参数 | 响应关键字段 | 备注 | |------|------|------|-------------|-------------|------| | 邀请记录分页 | GET | /api/member/invitations | page,size,status(1=有效/2=已过期),startDate,endDate | Page | **已实现**(MemberVOs.InvitationPageReq/InvitationDTO;V5 派生:行=被邀请会员、邀请时间=注册时间、状态按过期时间派生) | | 状态映射(原型中文→int) | - | - | 原型中文 → int | status: 1/2 | 待完成→1(有效)、已失效→2(已过期);已成功/奖励/首单 real 无口径(前端映射补 '-'/0,[待确认-1]) | | 邀请汇总统计 | GET | -(未实现,不臆造路径) | - | - | **待后置**:real 统计卡除"总数"外置 0 演示口径(api/member.ts stat 注释);排期后可增汇总接口并回填 [[design/api/member-api]] | | 导出 | POST | -(未实现,不臆造路径) | 同列表筛选 | taskId | **待后置**:原型导出为演示 toast(异步 ≤10000 条,通用列表能力口径) | | 会员手机号筛选键 | - | - | - | - | **待后置**:real 无邀请人手机号筛选参数(InvitationPageReq 无 mobile),mock 仅本地过滤 | ## 9. 异常与边界场景 - 加载态:骨架屏 300ms(统计卡 + 表格骨架)。 - 空态:"暂无邀请记录,会员在 C 端邀请后展示于此"。 - 错误态:错误码 + "邀请记录加载失败,请检查后重试" + 重试按钮(对齐 [[design-conventions]] §九)。 - 无权限态:"您无邀请记录查看权限,请联系管理员开通"(403)。 - 脱敏:邀请人/被邀请人手机号默认脱敏(138\*\*\*\*5678);real 行解析失败列展示 '-'。 - real 差异提示:已成功过滤不可用(warning);状态下拉剔除"已成功";奖励/首单列恒 '-';统计卡分类 0。 - 边界值:单页 10/20/50/100;导出 ≤10000 条;奖励合计仅计已成功行(mock);时间按邀请时间/注册时间倒序(服务端排序开发期定稿)。 - 移动端:无(Web 端页面)。 ## 10. 关联页面与数据流 - [[design/c-end/pages/cend-member/invite]] — C 端「邀请有礼」写入源(`/pages/member/invite`):邀请码/海报分享、三态记录、奖励规则 - [[design/pages/member/points]] — 邀请奖励流水(change_type=5 INVITE)查看/对账/人工补偿(R-member-03) - [[design/pages/member/member-list]] — 会员 360 入口:按 memberId/mobile 反查邀请双方会员详情 - [[design/pages/member/points-rule]] — 邀请奖励点数/上限(limitCount 10/月)配置源,行内"默认 200 分"口径([待确认-4]) - [[design/c-end/c-end-tables]] §十一 — member_invite_record 表结构权威(三态/UK/奖励/首单) - [[design/rules/member-business-rules]] R-member-03 — 奖励规则权威 - 数据流:C 端 invite 页写 member_invite_record(+成功时写 member_points_transaction change_type=5)→ 本页读(real 当前读 V5 member_member 派生视图,[待确认-1] 双轨说明);无写操作。实体见 [[design/er/er-member]]。