From 8cd3ed3d4a7d341f8afe28faac213eb9bef0b08f Mon Sep 17 00:00:00 2001 From: selfrelease Date: Mon, 31 Aug 2026 14:46:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=B9=E8=BF=9B=E4=BB=8A=E6=97=A5?= =?UTF-8?q?=E8=A6=81=E7=82=B9=E6=91=98=E8=A6=81,=E8=A6=81=E6=B1=82?= =?UTF-8?q?=E5=8C=85=E5=90=AB=E5=85=B7=E4=BD=93=E6=95=B0=E5=AD=97=E5=92=8C?= =?UTF-8?q?=E4=BA=8B=E9=A1=B9=E4=B8=BB=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 规则摘要: 将进行中案卡按场景归类,不再只看 red/orange - AI prompt: 要求引用具体案卡标题和数字,禁止空泛表述 - 兜底文案: 无案卡时不再提及已移除的健康度 Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- api.py | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/api.py b/api.py index 4791da5..a292d04 100644 --- a/api.py +++ b/api.py @@ -2410,6 +2410,10 @@ def dashboard_today(authorization: str | None = Header(default=None)): conn.close() +# 场景中文映射(用于摘要) +SCENE_LABELS_MAP = {"legal": "法务", "decision": "决策", "life": "生活", "emotion": "情绪"} + + @app.get("/dashboard/summary") def dashboard_summary(authorization: str | None = Header(default=None)): """老板台执行摘要:AI 用一句话总结当前状态和建议行动。 @@ -2443,20 +2447,31 @@ def dashboard_summary(authorization: str | None = Header(default=None)): red_count = sum(1 for m in open_matters if m["risk_level"] == "red") orange_count = sum(1 for m in open_matters if m["risk_level"] == "orange") + open_count = len(open_matters) # 规则摘要(兜底) parts = [] if red_count > 0: - parts.append(f"有 {red_count} 项高风险事项需立即处理") + parts.append(f"{red_count} 项高风险需立即处理") if orange_count > 0: - parts.append(f"{orange_count} 项中风险事项需关注") + parts.append(f"{orange_count} 项中风险需关注") if pending_count > 0: - parts.append(f"{pending_count} 个事项待你确认") + parts.append(f"{pending_count} 个待确认") if reply_count > 0: parts.append(f"{reply_count} 条专家回复待查看") + # 有进行中的案卡但无风险标记 + ongoing = open_count - red_count - orange_count + if ongoing > 0 and not parts: + # 按场景归类 + scene_counts: dict[str, int] = {} + for m in open_matters: + sc = SCENE_LABELS_MAP.get(m["scene"], m["scene"]) + scene_counts[sc] = scene_counts.get(sc, 0) + 1 + scene_desc = "、".join(f"{k}{v}项" for k, v in scene_counts.items()) + parts.append(f"{ongoing} 项{scene_desc}进行中") if not parts: - rule_summary = "当前无待办事项,经营状况良好。可主动发起咨询或查看经营健康度。" - rule_action = "浏览智囊或查看事项看板" + rule_summary = "当前无待办事项,经营状况良好。" + rule_action = "可主动发起咨询或浏览智囊" else: rule_summary = "、".join(parts) + "。" if red_count > 0: @@ -2465,6 +2480,10 @@ def dashboard_summary(authorization: str | None = Header(default=None)): rule_action = "建议先确认待办事项" elif reply_count > 0: rule_action = "建议查看专家回复" + elif ongoing > 0: + # 取最近的案卡标题作为建议 + latest = open_matters[0]["title"] if open_matters else "" + rule_action = f"继续跟进「{latest[:15]}」" if latest else "建议跟进进行中的事项" else: rule_action = "建议关注中风险事项" @@ -2472,13 +2491,16 @@ def dashboard_summary(authorization: str | None = Header(default=None)): try: if kimi and open_matters: matter_desc = "\n".join( - f"- {m['title']}(风险:{m['risk_level']},场景:{m['scene']},状态:{m['status']})" + f"- {m['title']}(场景:{SCENE_LABELS_MAP.get(m['scene'], m['scene'])},状态:{m['status']})" for m in open_matters[:5] ) prompt = ( - f"你是中小企业老板的AI助手。请根据以下数据,用一句话(不超过50字)总结当前经营状态," - f"并给出一个最优先的行动建议(不超过20字)。\n\n" - f"待办事项:\n{matter_desc}\n" + f"你是中小企业老板的AI助手。请根据以下待办事项数据,生成今日要点摘要。\n" + f"要求:\n" + f"1. summary:一句话总结,必须包含具体数字和事项主题,不超过60字\n" + f"2. action:最优先的行动建议,必须引用具体事项标题,不超过25字\n" + f"3. 不要用'经营状态稳定'等空泛表述,要基于实际数据\n\n" + f"待办事项(共{open_count}项):\n{matter_desc}\n" f"待确认:{pending_count}个,专家回复:{reply_count}条\n\n" f"返回 JSON 格式:{{\"summary\": \"...\", \"action\": \"...\"}}" )