Phase 2.3 chat 上下文捕获链路从未真正激活到完整工作: - 14 处 ai-float-button 补 sourcePage,chat.ts 三分支同步设 pageFilters.contextId - 后端 page_context 4 层 BUG 修(列名错位 + RLS site_id 未重设) - xcx_chat filters.pop 破坏 body.page_context 引用 — dict() 浅拷贝隔离 - chat 流式 markdown 实时解析(表格/标题/列表/加粗 + KPI 富卡) - reference_card KPI 富卡接入 SSE 路径,db 真写入 - 维客线索 source 显示规则:AI 来源用机器人 icon 替代长文字 数据库: - public.member_retention_clue 加 emoji + runtime_mode + sandbox_instance_id - biz.ai_run_logs 加 assistant_id + 复合索引 - chk_ai_cache_type CHECK 约束 8 类应用名 - cache_type / app_type 命名统一(app6_note / app7_customer / app8_consolidation) - 历史 emoji 抽取脚本 44/44 成功 后端 silent failure 修: - cleanup_service WHERE app_type → cache_type(90 天清理 + 20K 上限重新生效) - _build_ai_insight 字段错位修复(app4 → app7 + 字段对齐 prompt schema) - task_manager talkingPoints 改 app5_tactics + tactics 字段 - task_manager aiSuggestion 改取 one_line_summary - cache_service.CACHE_EXPIRY_DAYS 加 app2a_finance_area - WS /ws/ai-cache 加 token + JWT + site_id 校验(P0 信息泄露漏洞) - internal_ai token 改 hmac.compare_digest 工具/文档: - main.py 加 RotatingFileHandler logs/backend.log + uvicorn /health 过滤 - 新建 utils/clue_category.py(VI 6 类配色 + emoji fallback + source 显示规则) - 新建 utils/markdown.ts(轻量 md 转 rich-text 解析 + streaming 容错) - audit + 数据库变更说明 + backlog §七 #14 收口 + #15-#38 残余子任务 - backlog 追加 §十一 App1 参数/MCP/沙箱审计 + §十二 百炼/SQL MCP 主任务线 实地 MCP 走查:14 入口数据层 + 5 代表入口 sourcePage 注入 + customer-detail 全模块 + chat md 渲染 + reference_card 富卡 都已验证。9 项预先 BUG/UX 登记 §七 #29-#38 后续修复。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""维客线索分类映射工具(W1-AI-CLOSURE 组 5)。
|
|
|
|
集中管理维客线索的"中文分类 → 视觉/显示属性"映射,供 customer_service 和
|
|
task_manager 共用,避免重复定义。
|
|
|
|
来源权威:
|
|
- 6 类 categoryColor: docs/miniprogram-dev/design-system/VI-DESIGN-SYSTEM.md §2.1
|
|
- source 三态: docs/ai/system-prompts/app8_consolidation.md §五
|
|
- 用户拍板(2026-05-06): AI 来源统一显示为 "AI"(前端拼 "By:AI")
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from types import MappingProxyType
|
|
|
|
|
|
# 6 类客户线索分类 → tag_color(英文别名,前端 clue-card 接收)
|
|
# VI-DESIGN-SYSTEM §2.1 权威映射(玩法偏好=orange,与 demo 早期 purple 不一致以本规范为准)
|
|
CATEGORY_TAG_COLOR: MappingProxyType[str, str] = MappingProxyType({
|
|
"客户基础": "primary",
|
|
"消费习惯": "success",
|
|
"玩法偏好": "orange",
|
|
"促销偏好": "gold",
|
|
"促销接受": "gold", # App8 prompt 里的别名
|
|
"社交关系": "purple",
|
|
"重要反馈": "error",
|
|
})
|
|
|
|
|
|
# 6 类客户线索分类 → 默认 emoji(用于手工录入/AI 输出 emoji 为空时的兜底)
|
|
CATEGORY_EMOJI_FALLBACK: MappingProxyType[str, str] = MappingProxyType({
|
|
"客户基础": "👤",
|
|
"消费习惯": "💰",
|
|
"玩法偏好": "🎮",
|
|
"促销偏好": "🎁",
|
|
"促销接受": "🎁",
|
|
"社交关系": "👥",
|
|
"重要反馈": "⚠️",
|
|
})
|
|
|
|
|
|
# 数据库 source 字段 → 显示用名称(用户拍板:AI 类全显示 "AI",手工 fallback "系统")
|
|
# 实际 source 优先级:recorded_by_name > SOURCE_DISPLAY_NAME[source]
|
|
SOURCE_DISPLAY_NAME: MappingProxyType[str, str] = MappingProxyType({
|
|
"manual": "系统",
|
|
"ai_consumption": "AI",
|
|
"ai_note": "AI",
|
|
})
|
|
|
|
|
|
def format_category_tag(category: str) -> str:
|
|
"""把 category 中文字面量格式化为 clue-card tag(强制 2+2 两行)。
|
|
|
|
db 存的是 4 字字面量(如 "消费习惯"),demo 标杆 wxml `white-space: pre-line`
|
|
依赖 `\n` 强制 2+2 布局("消费\n习惯")。如果不强制,4 字在 72rpx 容器内可能被
|
|
css 自动换成 3+1 / 1+3 而非 2+2,视觉错位。
|
|
|
|
输入空 / 长度 != 4 / 含 \n 的字符串原样返回。
|
|
"""
|
|
if not category or "\n" in category:
|
|
return category or ""
|
|
if len(category) == 4:
|
|
return f"{category[:2]}\n{category[2:]}"
|
|
return category
|