| 1 | Table + Profile | Phone | phone | text (PK) | 代码 | E.164 格式,复合 PK 之一 |
| 2 | 不展示 | — | franchiseId | text (PK) | 代码 | 所属品牌(franchise 级多租户隔离) |
| 3 | 不展示 | — | siteId | text (PK) | 代码 | 所属门店(RingCentral providerAccountId) |
| 4 | Table + Profile | Contact | firstName | text | 代码 | 名(与 lastName 拼接显示) |
| 5 | Table + Profile | Contact | lastName | text | 代码 | 姓(与 firstName 拼接显示) |
| 6 | Table + Profile + Summary Bar + Filter | Stage | lifecycleStage | text | ai+代码 | lead / member / churned / unknown |
| 7 | 不展示 | — | lifecycleState | text | ai+代码 | active / frozen / terminal |
| 8 | Table + Profile | Notes | notes | text | 员工 | 备注(Profile 中为可编辑 textarea) |
| 9 | Table + Filter | DNC | doNotContact | boolean | ai+员工 | DNC 标记,全渠道停止触达 |
| 10 | Table + Profile | Card | hasCardOnFile | boolean | 代码 | 客户是否有信用卡信息存档 |
| 11 | Table + Profile | Last Activity | lastActivityAt | timestamp | 代码 | 最后活动时间(任何互动都更新) |
| 12 | Table + Filter + Profile | Follow-up / Action Needed | actionNeeded | boolean | ai | 是否需要跟进(Table 列名 Follow-up,Profile 展示名 Action Needed) |
| 13 | 不展示 | — | actionNeededReason | text | ai | 为什么需要行动(数据存储但前端不展示) |
| 14a | Profile | Suggested Action | suggestedActions[].action | jsonb | ai | AI 建议操作,多条用分号分隔展示 |
| 14b | Profile | Priority | suggestedActions[].priority | jsonb | ai | 取所有建议中最高优先级,单个 badge(High / Medium / Low) |
| 14c | 不展示 | — | suggestedActions[].reason | jsonb | ai | 为什么建议这个操作(数据存储但前端不展示) |
| 14d | 不展示 | — | suggestedActions[].priorityReason | jsonb | ai | 为什么是这个优先级(数据存储但前端不展示) |
| 15 | Table + Filter + Profile + Pipeline Bar | Lead Status | leadStatus | text | ai | 前端展示 9 个:New / Attempted / Connected / Booked / Bad Timing / Not Interested / Unreachable / Lost Contact / Neglected。Showed / Trialed / Converted 后端存储但前端不展示。当 lifecycleStage='lead' 时,Profile 顶部显示 Lead Pipeline 进度条(New → Attempted → Connected → Booked),当前状态高亮 |
| 16 | 不展示 | — | leadStatusReason | text | ai | 为什么是这个状态(数据存储但前端不展示) |
| 17 | Profile | Lead Objections | leadObjections | jsonb | ai | 犹豫中的顾虑标签(amber 标签展示,仅 leadStatus = Connected / Booked 时显示) |
| 18 | Profile | Lead Rejection Reasons | leadRejectionReasons | jsonb | ai | 条件性拒绝的原因标签(red 标签展示,仅 leadStatus = Bad Timing 时显示) |
| 19 | Profile | Purchase Intent | purchaseIntent | text | ai | high / medium / low(仅 Lead) |
| 20 | 不展示 | — | purchaseIntentReason | text | ai | 为什么是这个意向等级(数据存储但前端不展示) |
| 21a | Profile | Goal | goals[].goal | jsonb | ai | 客户目标(仅 Lead) |
| 21b | 不展示 | — | goals[].reason | jsonb | ai | 为什么判断是这个目标(数据存储但前端不展示) |
| 22 | Profile | Customer Summary | customerSummary | text | ai | 综合所有通话和 SMS 的整体画像摘要 |
| 23 | 不展示 | — | lastContactAnalysisAt | timestamp | 代码 | Pipeline 2 最后分析时间(cooldown gate 内部使用) |
| 24 | 不展示 | — | doNotContactUpdatedBy | text | 代码 | DNC 来源:staff / ai / system(TCPA 合规审计) |
| 25 | Table + Filter + Profile | Open Complaint | hasOpenComplaint | boolean | ai+代码 | 当前是否有未解决投诉 |
| 26 | Table + Profile | Acquired | createdAt | timestamp | 代码 | 首次创建时间 = 客户进入系统时间 |
| 27 | 不展示 | — | updatedAt | timestamp | 代码 | 最后更新时间(Drizzle 自动刷新) |