feat: 出站补全渲染——首封e164+标注/主题行/推送派生/canon双保险/面板尾注
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -301,3 +301,71 @@ def name_to_region(name: str | None) -> str | None:
|
||||
if key in NAME_TO_REGION:
|
||||
return NAME_TO_REGION[key]
|
||||
return _NAME_LOOKUP.get(key.casefold())
|
||||
|
||||
|
||||
# ---- Task 6 出站渲染(spec §5):首封补全号的展示派生(纯函数,邮件/推送共用) ----
|
||||
|
||||
# 标注文案(spec §5 钉死):有 e164 未确认 → 未经确认;无 e164 → 缺区号。
|
||||
NOTE_UNCONFIRMED = "(区号按 IP 推测,未经客户确认)"
|
||||
NOTE_MISSING_CC = "(缺国家区号)"
|
||||
|
||||
|
||||
def cc_state_for(cc_map: dict | None, channel: str, value: str) -> dict | None:
|
||||
"""渠道 → _cc 状态解析(canon 组归并感知,出站渲染入口)。
|
||||
|
||||
优先本渠道状态;本渠道无态但 canon 与 whatsapp 组一致时共享组状态
|
||||
(同号 phone/whatsapp 确认一次,渲染也同标——否则同封邮件一行 e164
|
||||
一行裸号自相矛盾)。canon 不匹配(换号后残留/防御性垃圾)一律 None,
|
||||
调用方回退裸号原文——旧补全永不跟随新号。
|
||||
"""
|
||||
digits = _digits(value)
|
||||
if not digits:
|
||||
return None
|
||||
for state in ((cc_map or {}).get(channel), (cc_map or {}).get("whatsapp")):
|
||||
if isinstance(state, dict) and str(state.get("canon") or "") == digits:
|
||||
return state
|
||||
return None
|
||||
|
||||
|
||||
def outbound_number(value: str, state: dict | None) -> str:
|
||||
"""邮件正文联系方式行的展示值(spec §5 首封矩阵):
|
||||
|
||||
- 有 e164 且 confirmed → 纯 e164(prefix_normalized/ip_confirm/
|
||||
customer_stated,码是客户自己写的/确认过的,零标注);
|
||||
- 有 e164 未 confirmed → e164 +(区号按 IP 推测,未经客户确认)
|
||||
(ip_proposed/naive/fallback 统一口径,spec §4 标注语义);
|
||||
- 无 e164(no_ip / 迁移分支可产出的 fallback-无-e164)→ 裸号原文 +
|
||||
(缺国家区号)——拿不出补全号不硬造;
|
||||
- 无状态(显式 +/00 号码等)→ 原样。
|
||||
"""
|
||||
raw = str(value or "")
|
||||
e164 = str((state or {}).get("e164") or "")
|
||||
if not e164:
|
||||
return raw + NOTE_MISSING_CC if state is not None else raw
|
||||
if state.get("confirmed"):
|
||||
return e164
|
||||
return e164 + NOTE_UNCONFIRMED
|
||||
|
||||
|
||||
def outbound_e164(value: str, state: dict | None) -> str:
|
||||
"""主题行/推送 contact 用:有 e164 给纯 e164(无标注——主题拥挤、
|
||||
对方契约要"带国际区号且有效"的干净号),其余原样。"""
|
||||
e164 = str((state or {}).get("e164") or "")
|
||||
return e164 or str(value or "")
|
||||
|
||||
|
||||
def completion_note(value: str, state: dict | None) -> str | None:
|
||||
"""推送画像派生键「号码补全说明」的单渠道条目;无需披露返回 None。
|
||||
|
||||
confirmed 的补全零披露;未确认 → "原文→补全号+标注";缺区号 →
|
||||
"原文+(缺国家区号)"。出站时由 _cc 计算,不落正常键(零 LLM 泄漏面)。
|
||||
"""
|
||||
raw = str(value or "")
|
||||
if state is None:
|
||||
return None
|
||||
e164 = str(state.get("e164") or "")
|
||||
if not e164:
|
||||
return raw + NOTE_MISSING_CC
|
||||
if state.get("confirmed"):
|
||||
return None
|
||||
return f"{raw}→{e164}{NOTE_UNCONFIRMED}"
|
||||
|
||||
Reference in New Issue
Block a user