|
|
@@ -258,14 +258,15 @@ def _score_top_decisions(df_tier2: pd.DataFrame, top_n: int = 5) -> pd.DataFrame
|
|
|
|
|
|
|
|
|
def _format_approval_message(df_tier2: pd.DataFrame, df_tier1: pd.DataFrame, df_tier0: pd.DataFrame, request_id: str) -> str:
|
|
|
- """格式化审批消息(瘦身版,目标:单屏可读,≤ 2 KB)。
|
|
|
+ """格式化审批消息(极简版,目标:手机单屏可读,≤ 1 KB)。
|
|
|
|
|
|
设计原则:
|
|
|
- - 删除 Tier 0 逐条列表(由飞书表格兜底)
|
|
|
- - 删除 Tier 1 "自动执行" 段落(TIER1_MAX_CHANGE_PCT=0.00 已禁用该通路)
|
|
|
+ - 三行头部:标题 + 决策统计(一行含所有 action 数量) + 影响金额(一行)
|
|
|
- 用 Top 5 高置信/高消耗决策替代"前 5 个示例"的无排序列表
|
|
|
- - 展示"影响金额"让运营感知决策规模
|
|
|
+ - 回复指引压到一行(核心 3 种 + "直接说您的想法"兜底自由表达)
|
|
|
- 明确告知"30 分钟无回复 = 默认拒绝",无隐式自动通过
|
|
|
+ - 标题用人性化时间,不暴露 request_id(内部 ID 放末尾追溯即可)
|
|
|
+ - 两条消息策略:本文本 + 飞书表格详单链接(由调用方串行发送)
|
|
|
"""
|
|
|
total = len(df_tier2)
|
|
|
|
|
|
@@ -282,15 +283,13 @@ def _format_approval_message(df_tier2: pd.DataFrame, df_tier1: pd.DataFrame, df_
|
|
|
cost_7d = pd.to_numeric(df_tier2.get("cost_7d_avg", 0), errors="coerce").fillna(0).sum() if total > 0 else 0.0
|
|
|
yesterday_cost = pd.to_numeric(df_tier2.get("yesterday_cost", 0), errors="coerce").fillna(0).sum() if "yesterday_cost" in df_tier2.columns else 0.0
|
|
|
|
|
|
+ # 人性化时间标题:04-21 02:33
|
|
|
+ now_label = datetime.now().strftime("%m-%d %H:%M")
|
|
|
+
|
|
|
lines = [
|
|
|
- f"📊 广告调控审批请求 {request_id}",
|
|
|
- "─" * 40,
|
|
|
- f"📌 决策总数: {total} (需全部人工审批,无自动执行)",
|
|
|
- f" ⏸ 暂停 {n_pause} / ⬇ 降价 {n_down} / ⬆ 提价 {n_up} / 🚀 扩量 {n_scale} / 👀 观察 {n_observe}",
|
|
|
- "",
|
|
|
- "💰 影响金额",
|
|
|
- f" 受影响广告 7 日均消耗合计: {cost_7d:,.0f} 元",
|
|
|
- f" 昨日总消耗: {yesterday_cost:,.0f} 元",
|
|
|
+ f"📊 广告调控 · {now_label} · 请您复核",
|
|
|
+ f"📌 决策 {total} 条 · ⏸{n_pause} ⬇{n_down} ⬆{n_up} 🚀{n_scale} 👀{n_observe}(全部需您审批)",
|
|
|
+ f"💰 影响金额:受影响广告 7 日均消耗合计 {cost_7d:,.0f} 元,昨日总消耗 {yesterday_cost:,.0f} 元",
|
|
|
"",
|
|
|
]
|
|
|
|
|
|
@@ -339,20 +338,14 @@ def _format_approval_message(df_tier2: pd.DataFrame, df_tier1: pd.DataFrame, df_
|
|
|
lines.append(f" {idx}. [{ad_id}] {ad_name} | {action_label} | {roi_str} | {reason}")
|
|
|
|
|
|
if total > 5:
|
|
|
- lines.append(f" (完整列表见下方飞书在线表格链接)")
|
|
|
+ lines.append(f" (完整详单见下方表格消息)")
|
|
|
lines.append("")
|
|
|
|
|
|
- # 回复方式(多轮协商)
|
|
|
+ # 回复方式(多轮协商,精简到核心 3 种 + 自由表达)
|
|
|
lines.extend([
|
|
|
- "📝 回复方式(支持多轮协商)",
|
|
|
- " \"通过\" — 全部批准",
|
|
|
- " \"拒绝\" — 全部取消",
|
|
|
- " \"广告 12345 不动\" — 保留这条,其余按建议",
|
|
|
- " \"整体太激进/保守\" — 要求重新评估",
|
|
|
- " \"只批准 pause\" — 按 action 类型过滤",
|
|
|
- f" ⏰ {IM_APPROVAL_TIMEOUT_MINUTES} 分钟无回复 = 默认拒绝",
|
|
|
- "",
|
|
|
- "📎 详单: 飞书在线表格链接(消息 2 单独发送)",
|
|
|
+ "📝 回复:\"通过\" / \"拒绝\" / \"广告 12345 不动\" / \"只批准 降价\",或直接说您的想法",
|
|
|
+ f"⏰ {IM_APPROVAL_TIMEOUT_MINUTES} 分钟无回复 = 默认拒绝",
|
|
|
+ f"(追溯码: {request_id})",
|
|
|
])
|
|
|
|
|
|
return "\n".join(lines)
|
|
|
@@ -577,7 +570,7 @@ async def send_approval_request(
|
|
|
file_result = _feishu.send_file(
|
|
|
to=FEISHU_AD_PROJECT_CHAT_ID,
|
|
|
file=str(xlsx_path),
|
|
|
- file_name=f"审批决策表_{request_id}.xlsx",
|
|
|
+ file_name=f"广告审批_{datetime.now().strftime('%Y%m%d_%H%M')}.xlsx",
|
|
|
)
|
|
|
logger.info("飞书审批 Excel(文件)发送成功(项目群): message_id=%s", file_result.message_id)
|
|
|
except Exception as e:
|
|
|
@@ -599,7 +592,7 @@ async def send_approval_request(
|
|
|
file_result_personal = _feishu.send_file(
|
|
|
to=FEISHU_OPERATOR_OPEN_ID,
|
|
|
file=str(xlsx_path),
|
|
|
- file_name=f"决策表_{request_id}.xlsx",
|
|
|
+ file_name=f"广告审批_{datetime.now().strftime('%Y%m%d_%H%M')}.xlsx",
|
|
|
)
|
|
|
logger.info("飞书决策 Excel(文件)发送成功(个人): message_id=%s", file_result_personal.message_id)
|
|
|
except Exception as e:
|