{% extends "base.html" %} {% block title %}日报 - AI Agent 项目追踪{% endblock %} {% block content %}

升级迭代日报

每天 09:00 自动更新 · 最新报告: {{ reports[0].date if reports else "无" }}
报告生成中, 通常 1-2 分钟, 完成后页面自动刷新…
{% if not reports %}
暂无报告, 点击立即运行生成第一份日报
{% endif %} {% if reports and reports[0].meta %} {% set m = reports[0].meta %} {% set projs = m.get("projects", {}) %}
{{ projs|length }}
监控项目
{{ projs.values()|selectattr('status','equalto','ok')|list|length }}
✓ 正常
{{ projs.values()|selectattr('status','equalto','partial')|list|length }}
⚠ 部分
{{ m.get("sources_failed", [])|length }}
✗ 失败数据源
{% endif %} {% for r in reports %}
{{ r.date }} 生成于 {{ r.created_at[:19] }}
{% set prev = reports[loop.index] if not loop.last else none %} {% if prev and r.meta and prev.meta %} {% set cur_failed = r.meta.get("sources_failed", []) %} {% set prev_failed = prev.meta.get("sources_failed", []) %} {% set fixed = prev_failed|reject('in', cur_failed)|list %} {% set broke = cur_failed|reject('in', prev_failed)|list %} {% if fixed %}✅ 恢复: {{ fixed|join(", ") }}{% endif %} {% if broke %}⚠ 新增失败: {{ broke|join(", ") }}{% endif %} {% if not fixed and not broke %}与昨日相同{% endif %} {% endif %}
{% if r.meta %}
{% for name, info in r.meta.get("projects", {}).items() %} {% set st = info.get('status', 'unknown') %} {% set is_starred = name in starred %} {{ name }}{% if is_starred %} ★{% endif %} {% if st=='ok' %} ✓{% elif st=='partial' %} ⚠{% else %} ✗{% endif %} {% endfor %} {% for s in r.meta.get("sources_failed", []) %} {{ s }} ✗ {% endfor %}
{% endif %}
查看报告内容
{% endfor %} {% endblock %} {% block scripts %} {% endblock %}