diff --git a/app/services/daily_report_service.py b/app/services/daily_report_service.py index edf427c..2aa9b73 100644 --- a/app/services/daily_report_service.py +++ b/app/services/daily_report_service.py @@ -287,74 +287,71 @@ async def _build_daily_report_data() -> Optional[Dict]: return report -def _build_preview_text(report: Dict) -> str: +def _build_markdown(report: Dict) -> str: + """构建单条企微 markdown 日报""" if report.get("empty"): return ( f"**{report['title']}**\n\n" - f">昨日新增:0 条\n" - f">当前待处理:0 条\n" - f">系统运行平稳" + f">系统运行平稳,昨日无新增工单\n" + f">当前无待处理工单" ) - summary = report["summary"] + s = report["summary"] + lines = [ f"**{report['title']}**", "", - f">昨日新增:{summary['yesterday_total']} 条({report['change_str']})", - f">昨日完成:{summary['completed_count']} 条 | 当前待处理:{summary['backlog_count']} 条", - f">安保:{summary['security_count']} 条 | 保洁:{summary['clean_count']} 条", - f">平均首响:{summary['avg_resp']} | 平均完结:{summary['avg_close']}", - f">误报率:{summary['false_alarm_rate']} | 遗留待处理:{summary['carry_over_count']} 条", + # ── 核心数字 ── + f">昨日新增 {s['yesterday_total']} 条({report['change_str']})", + f">安保 {s['security_count']}|" + f"保洁 {s['clean_count']}|" + f"完成 {s['completed_count']}|" + f"取消 {s['cancelled_count']}|" + f"误报率 {s['false_alarm_rate']}", + f">当前待处理 {s['backlog_count']} 条" + f"(遗留 {s['carry_over_count']})", "", - "**重点风险**", + # ── 效率指标 ── + f"**响应效率**", + f">平均首响 {s['avg_resp']}|" + f"平均完结 {s['avg_close']}", ] - lines.extend(f">{line}" for line in report["risk_lines"]) + + # ── 风险分布 ── + tops = report["tops"] + has_risk = any(v != "暂无数据" for v in tops.values()) + if has_risk: + lines.append("") + lines.append("**风险分布**") + if tops["alarm_types"] != "暂无数据": + lines.append(f">告警类型:{tops['alarm_types']}") + if tops["cleaning_types"] != "暂无数据": + lines.append(f">保洁类型:{tops['cleaning_types']}") + if tops["areas"] != "暂无数据": + lines.append(f">高发区域:{tops['areas']}") + if tops["cameras"] != "暂无数据": + lines.append(f">高发摄像头:{tops['cameras']}") + + # ── 超时跟进 ── if report["top_overdue"]: lines.append("") - lines.append("**需优先跟进**") - lines.extend(f">{idx}. {item}" for idx, item in enumerate(report["top_overdue"], start=1)) + lines.append(f"**超时未处理 {s['carry_over_count']} 条**") + for idx, item in enumerate(report["top_overdue"], 1): + lines.append(f">{idx}. {item}") + return "\n".join(lines) -def _build_report_textcard(report: Dict) -> Dict: - summary = report["summary"] - click_url = settings.wechat.service_base_url or "https://work.weixin.qq.com" - description_lines = [ - f"