Files
sbnews/业务进度管理.md
T
2026-06-10 13:10:20 +08:00

445 lines
29 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 业务进度管理
> 本文档用于跟踪 Sport Era 项目所有功能模块的开发状态、待办事项与避坑记录。每完成一个功能或发现一个坑,及时在对应章节追加。
## 目录
- [一、已完成事项](#一已完成事项)
- [二、进行中事项](#二进行中事项)
- [三、待办事项](#三待办事项)
- [四、避坑记录](#四避坑记录)
---
## 一、已完成事项
### 25. 社区帖子 RAG 生成模型切换到 Qwen3.7
- 状态:已完成 - 时间:2026-06-10
完成内容:
- 排查 `/api/community/aiAnalysis` 仍返回 `DeepSeek 返回异常: Insufficient Balance` 的原因,确认图片识别已走 DashScope Qwen,但帖子 RAG 最终 JSON 生成仍复用默认 DeepSeek 配置。
- 已将 `KbRagService::analyzePost()` 的最终生成阶段改为 DashScope OpenAI 兼容接口,模型固定为 `qwen3.7-plus`,使用 `server/.env``DASHSCOPE_API_KEY`
- `DeepSeekClient` 作为 OpenAI 兼容 HTTP 客户端保留,但现在会按调用方传入的 `provider_label` 返回错误提示;帖子分析失败时将显示 `DashScope(Qwen)`,不再误导为 DeepSeek。
- `AiService::saveResult()` 已改为记录下游返回的真实模型名,帖子 AI 日志会写入 `qwen3.7-plus`
涉及模块:
- `server/app/common/service/ai/KbRagService.php`
- `server/app/common/service/ai/DeepSeekClient.php`
- `server/app/common/service/ai/AiService.php`
### 24. 社区帖子 AI 分析改为统一分析页并显示分析计时
- 状态:已完成 - 时间:2026-06-10
完成内容:
- 社区列表页与首页社区流中的六合彩帖子 `AI分析` 入口已改为直接跳转统一分析页 `/pages/ai_analysis/ai_analysis?type=post&id=...`,不再先进帖子详情页再等待页内分析。
- 帖子详情页中的 `AI分析` 按钮也已切换为直接跳统一分析页;旧的 `show_ai=1` 链路改为兼容重定向,避免历史入口失效。
- 统一分析页已新增 `post` 类型支持,接入 `/api/community/aiAnalysis`,并展示帖子卡片、综合结论、下期预测、可信线索、风险提示、相似历史和知识库证据。
- AI 分析加载阶段新增“分析用时 `0m1s`”计时显示;赛事分段分析的后续阶段 loading 也会继续显示累计分析时长,避免长耗时场景下用户无感等待。
涉及模块:
- `uniapp/src/pages/ai_analysis/ai_analysis.vue`
- `uniapp/src/packages_community/pages/post_detail.vue`
- `uniapp/src/packages_community/pages/index.vue`
- `uniapp/src/pages/empty/empty.vue`
### 23. 六合图片分析升级到 Qwen3.7 并移除代码内密钥
- 状态:已完成 - 时间:2026-06-10
完成内容:
- `AiService::analyzeLotteryPostImages()` 已将 DashScope 视觉模型从旧版 `qwen-vl-max-latest` 切换为新版统一多模态模型 `qwen3.7-plus`,继续沿用 OpenAI 兼容接口 `https://dashscope.aliyuncs.com/compatible-mode`
- 移除了 `AiService` 中硬编码的 DashScope API Key,改为统一从 `server/.env``DASHSCOPE_API_KEY` 读取,避免密钥继续直接写入代码文件。
- 同步补充 `server/.example.env` 的 DashScope Key 占位配置,便于后续环境初始化和部署时对齐。
涉及模块:
- `server/app/common/service/ai/AiService.php`
- `server/.env`
- `server/.example.env`
### 22. 六合图片分析 404 链路修复
- 状态:已完成 - 时间:2026-06-09
完成内容:
- 排查 `/api/community/translatePost``旧澳六合/新澳六合` 图片分析分支返回 `HTTP 404` 的问题,确认不是帖子不存在,而是 Qwen 视觉模型请求地址被拼成了 `.../v1/v1/chat/completions`
- 已将 `AiService` 中 DashScope 兼容接口基地址收敛为 `https://dashscope.aliyuncs.com/compatible-mode`,并在 `DeepSeekClient` 中补充聊天接口地址规范化,兼容 `base_url` 传入根地址、`/v1` 地址或完整 `/chat/completions` 地址,避免后续再次重复拼接。
- 同步把多模型错误提示统一改为带 provider 名称返回,后续如果 DashScope/Qwen 鉴权或模型权限异常,接口会更容易直接看出来自哪个下游。
涉及模块:
- `server/app/common/service/ai/AiService.php`
- `server/app/common/service/ai/DeepSeekClient.php`
### 21. 六合图片分析切换到 DashScope Qwen 视觉模型
- 状态:已完成 - 时间:2026-06-09
完成内容:
- `AiService::analyzeLotteryPostImages()` 已按当前需求固定改为调用阿里云 DashScope OpenAI 兼容接口,不再读取后台 `lottery_image_analysis_*``deepseek_vision_model` 配置。
- 当前六合彩图片分析分支硬编码使用 `Qwen` 视觉模型 `qwen-vl-max-latest`,兼容接口基地址统一为 `https://dashscope.aliyuncs.com/compatible-mode`,由客户端自动补齐聊天接口路径,并使用指定的 DashScope API Key。
- 错误提示中的 provider 标识已改为 `DashScope(Qwen)`,方便后续定位图片分析失败是否来自 Qwen 视觉链路。
- 同步收紧图片分析提示词,新增“先过滤噪音再逐项分析”的规则,只保留当期号码、图表结论、推荐组合等有效信息,忽略水印、口号、装饰边框、重复标题和低置信度杂讯。
涉及模块:
- `server/app/common/service/ai/AiService.php`
### 20. 六合帖子 `translatePost` 收紧为纯图片分析
- 状态:已完成 - 时间:2026-06-09
完成内容:
- `/api/community/translatePost``新澳六合 / 旧澳六合` 已改为只走当前帖子图片分析,不再接受旧版六合彩分析缓存直接命中。
- 新增 `lottery_analysis_source=image_only``lottery_analysis_images_hash` 标记,只有明确由当前帖子图片生成的分析结果才会复用;旧缓存或图片已变更时会重新按图片分析。
- 移除了六合彩图片分析失败时写入“虚拟历史分析文案”的兜底逻辑,当前图片无法识别时接口会直接返回失败,避免返回看似真实、实则并非基于当前图片的内容。
- 同步收紧图片分析提示词,明确禁止引用往期内容、历史期数、知识库信息或模型记忆;社区列表侧也只展示 `image_only` 来源的六合彩分析结果。
涉及模块:
- `server/app/api/controller/CommunityController.php`
- `server/app/api/lists/community/CommunityPostLists.php`
- `server/app/common/service/ai/AiService.php`
### 19. 社区帖子分支链路收紧为“普通/特朗普/六合”三类
- 状态:已完成 - 时间:2026-06-09
完成内容:
- 重新梳理社区帖子链路后,已将普通帖子、特朗普帖子、`新澳六合/旧澳六合` 帖子的入口分支彻底拆开:普通帖子不再显示或触发 AI 分析;特朗普帖子只保留本地 `MTranServer` 翻译链路;六合帖子才显示 AI 入口。
- `post-card``/pages/empty/empty`、社区分包列表页、帖子详情页已统一按 `旧澳六合/新澳六合` 标签控制 `AI` 按钮和 `show_ai=1` 跳转,避免普通帖误入 `/api/community/aiAnalysis`
- 后端 `CommunityController::aiAnalysis()` 已改为只接受六合帖,并在进入知识库分析前先确保 `lottery_analysis_content` 已由视觉模型完成图片识别;`translatePost()` 的彩票图片分析分支也同步从泛 `彩票` 收紧为 `a6/xa6`
- `KbRagService::analyzePost()``AiService::analyzePost()` 已补强:当前帖子本身只要识别为 `a6/xa6` 就稳定输出 `next_prediction`,并跳过缺少预测字段的旧缓存,避免仍回落到历史错误结果。
涉及模块:
- `uniapp/src/pages/empty/empty.vue`
- `uniapp/src/packages_community/pages/index.vue`
- `uniapp/src/packages_community/components/post-card.vue`
- `uniapp/src/packages_community/pages/post_detail.vue`
- `server/app/api/controller/CommunityController.php`
- `server/app/api/lists/community/CommunityPostLists.php`
- `server/app/common/service/ai/AiService.php`
- `server/app/common/service/ai/KbRagService.php`
### 18. 世界杯资讯与特朗普帖子翻译切换 GPT-4o
- 状态:已完成 - 时间:2026-06-09
完成内容:
- 世界杯资讯翻译链路已改为按文章分类识别:当资讯属于“世界杯”分类时,`ArticleLogic::translate()``autoTranslateArticle()` 会优先走 `GPT-4o` 翻译,不影响其他资讯仍沿用原有翻译模型。
- 特朗普帖子翻译链路已改为按帖子标签识别:社区列表自动预热、帖子详情自动补翻译、`/api/community/translatePost` 手动翻译这 3 条路径,命中“特朗普”标签时统一走 `GPT-4o`
- 在 AI 配置层新增 `openai_api_key / openai_base_url / openai_translation_model` 约定,并补充幂等 SQL `docs/sql/insert_ai_translation_gpt4o_config.sql`;后台知识库配置列表已放开 `openai_%` 配置项,便于直接维护 `GPT-4o` 翻译参数。
- 同步把 OpenAI 兼容翻译调用的错误文案改成按 provider 显示,避免 `GPT-4o` 未配置时仍提示成 `DeepSeek API Key未配置`
涉及模块:
- `server/app/common/service/ai/DeepSeekClient.php`
- `server/app/common/service/ai/AiService.php`
- `server/app/api/logic/ArticleLogic.php`
- `server/app/api/controller/CommunityController.php`
- `server/app/api/lists/community/CommunityPostLists.php`
- `server/app/adminapi/lists/ai/KbConfigLists.php`
- `docs/sql/insert_ai_translation_gpt4o_config.sql`
### 17. 定时任务企业微信告警接入
- 状态:已完成 - 时间:2026-06-08
完成内容:
- 为 crawler 本地配置增加 `alert.dispatch_enabled / alert.wecom_webhook / alert.cooldown_seconds`,企业微信告警改走固定群机器人 Webhook,本地维护,不做后台配置页。
- 新增统一告警表 `la_crontab_alert`,并在 Python `Database` 与 PHP `CrontabAlertService` 中同时补上建表与读写逻辑,支持告警创建、30 分钟冷却、成功恢复后自动关闭。
- `main.py` 已增加 `TASK_ALERT_POLICY` 与标准化运行摘要;已启用的 `crawler` 任务按“采集型 saved_required / 维护型 saved_if_candidates / error_report 跳过自告警”规则统一落库告警。
- `ErrorCollector` 已扩展为记录单次运行的 `404 / 5xx / 网络异常` 统计;`error_report` 任务已改为读取 `la_crontab_alert` 并尝试分发企业微信消息。
-`crawler` 的 PHP 定时任务(如 `sms_verify``worldcup_article_translate`)已通过 `Crontab.php` 接入同一张告警表,仅在执行异常时产生 `command_exception` 告警。
- 已新增幂等 SQL `server/public/dongqiudi-crawler/update_crontab_error_report.sql`,并已把测试服现有 `error_report` 任务频率从 `*/5 * * * *` 调整为 `*/1 * * * *`
涉及模块:
- `server/public/dongqiudi-crawler/config/settings.yaml`
- `server/public/dongqiudi-crawler/main.py`
- `server/public/dongqiudi-crawler/src/core/error_collector.py`
- `server/public/dongqiudi-crawler/src/core/alert_manager.py`
- `server/public/dongqiudi-crawler/src/storage/database.py`
- `server/public/dongqiudi-crawler/src/scheduler/task_runner.py`
- `server/app/common/command/Crontab.php`
- `server/app/common/service/crontab/CrontabAlertService.php`
- `server/public/dongqiudi-crawler/update_crontab_error_report.sql`
### 16. 资讯无正文默认稿子并禁止发布
- 状态:已完成 - 时间:2026-06-07
完成内容:
- 为爬虫侧新增 `article_publish_helper.py`,统一判断资讯正文是否达到可发布标准;没有拉到正文、只有 RSS 摘要或占位文本的文章,采集入库时默认写成稿子状态(`is_show=0`)。
- `article_fetcher.py` 已调整为优先处理稿子状态或正文明显不足的资讯;抓到真实正文后会自动写回 `content`,同时将文章切回发布状态并重置 `content_retry`
- `nba_news.py``cba_news.py``crypto_news.py``lottery_news.py``hkjc_lottery_news.py``taiwan_lottery_news.py``fifa_worldcup_news.py` 已统一接入该规则,避免后续新采文章在正文未完成时直接暴露到前台。
- 后台 `ArticleLogic` / `ArticleController` 已增加发布拦截:手动新增、编辑或切换状态时,如果正文未达到发布标准,会直接返回“暂不能发布,请先保存为稿子”。
- 已在测试服先行回退当前可见的 NBA / CBA 占位稿:示例 `1903906``1915226` 的公开详情现已返回空数据,不再继续对前台暴露无正文资讯。
涉及模块:
- `server/public/dongqiudi-crawler/article_publish_helper.py`
- `server/public/dongqiudi-crawler/article_fetcher.py`
- `server/public/dongqiudi-crawler/nba_news.py`
- `server/public/dongqiudi-crawler/cba_news.py`
- `server/public/dongqiudi-crawler/crypto_news.py`
- `server/public/dongqiudi-crawler/lottery_news.py`
- `server/public/dongqiudi-crawler/hkjc_lottery_news.py`
- `server/public/dongqiudi-crawler/taiwan_lottery_news.py`
- `server/public/dongqiudi-crawler/fifa_worldcup_news.py`
- `server/app/common/model/article/Article.php`
- `server/app/adminapi/logic/article/ArticleLogic.php`
- `server/app/adminapi/controller/article/ArticleController.php`
### 15. NBA / CBA 资讯正文抓取补回退链路
- 状态:已完成 - 时间:2026-06-07
完成内容:
- 继续排查发现,NBA / CBA 资讯列表入库后,详情正文并不是完全没跑,而是由 `article_content_fetch` 每轮按分类各抓 `3` 条慢慢补;因此刚采集完的一大批文章会先以 RSS 摘要占位,随后逐轮补正文。
- 测试服执行日志确认 `article_content_fetch` 一直在跑,但部分 Google News 解码后的真实地址(如 `m.sohu.com``sports.sina.cn``sports.cctv.com`)在 `scrapling Fetcher` 路径下会返回 `HTTP 403`,导致正文抓取失败并累计 `content_retry`
- 已为 `server/public/dongqiudi-crawler/article_fetcher.py` 增加 `requests + BeautifulSoup` 回退抓取链路:当 `scrapling` 返回 `403` 或抛异常时,改用普通请求抓页面并复用同一套正文抽取规则,降低这类站点的正文缺失率。
- 同步补充 `server/public/dongqiudi-crawler/requirements.txt``beautifulsoup4` 依赖声明,避免后续环境重装时漏掉回退解析库。
涉及模块:
- `server/public/dongqiudi-crawler/article_fetcher.py`
- `server/public/dongqiudi-crawler/requirements.txt`
### 14. NBA / CBA 资讯定时任务补注册与恢复拉取
- 状态:已完成 - 时间:2026-06-07
完成内容:
- 排查发现 `server/public/dongqiudi-crawler/main.py``nba_news.py``cba_news.py` 代码入口都已存在,`article_content_fetch` 也已覆盖 `cid=17/18` 的正文补全,但测试服 `la_dev_crontab` 中缺少 `nba_news``cba_news` 两个定时任务,所以后台从未自动触发 NBA / CBA 资讯采集。
- 已补充幂等 SQL `insert_crontab_nba_news.sql``insert_crontab_cba_news.sql`,分别注册 `crawler nba_news``crawler cba_news`
- 已在测试服后台实际创建两条任务,当前执行规则分别为 `10 * * * *`NBA)和 `20 * * * *`CBA),状态均为“运行”。
- 已手动验证一次:NBA 任务成功抓取 100 条,新增 99 条;CBA 任务成功抓取 169 条,新增 152 条。
- 已继续验证正文抓取链路:`article_content_fetch` 在 2026-06-07 00:50 自动处理了新入库的 NBA / CBA 文章,成功补全 4 篇正文;另有 2 篇源站返回 HTTP 403,已按现有 `content_retry` 机制记录重试。
涉及模块:
- `server/public/dongqiudi-crawler/main.py`
- `server/public/dongqiudi-crawler/nba_news.py`
- `server/public/dongqiudi-crawler/cba_news.py`
- `server/public/dongqiudi-crawler/article_fetcher.py`
- `server/public/dongqiudi-crawler/insert_crontab_nba_news.sql`
- `server/public/dongqiudi-crawler/insert_crontab_cba_news.sql`
### 13. 赛事 AI 分段分析接入知识库召回
- 状态:已完成 - 时间:2026-06-06
完成内容:
- 排查发现 `/api/ai/matchPredictSection` 原链路只会组装 `match_info / head_to_head / home_recent / away_recent` 后直接调用 `DeepSeekClient::chatJson()`,并不会进入知识库检索层。
- 现已为赛事分析补充 `KbRagService::analyzeMatch()``analyzeMatchSection()`,先根据主队、客队、联赛名到知识库中召回相关资讯/帖子,再把召回证据与结构化交手记录、近期战绩、赔率一起交给 LLM。
- `AiService::predictMatch()``predictMatchSection()` 已切换到赛事专用 RAG 链路,返回结果增加 `evidence_list / similar_history / from_kb / retrieval_meta` 等知识库增强字段。
- 为避免旧的赛事分段缓存继续短路新链路,当前逻辑只接受带知识库字段痕迹的新缓存;老缓存会自动跳过并重新走 RAG 生成。
- 当前赛事 RAG 仍未把 `match_event / match_history / match_recent` 建成独立知识库 domain,交手记录和近期战绩继续直接从业务表读取;知识库侧主要召回相关资讯与帖子。
涉及模块:
- `server/app/common/service/ai/AiService.php`
- `server/app/common/service/ai/KbRagService.php`
- `server/app/common/service/ai/KbService.php`
- `server/app/api/controller/AiController.php`
### 12. 全站 AI 知识库与 RAG 分析底座
- 状态:已完成 - 时间:2026-06-06
完成内容:
- 新增 AI 知识库底座表设计与 SQL:`la_ai_kb_document``la_ai_kb_chunk``la_ai_kb_sync_job``la_ai_kb_query_log`,并补充知识库菜单与 Embedding / KB 配置初始化 SQL。
- 后端新增 `KbService / KbSyncService / EmbeddingClient / KbRagService`,支持资讯、帖子、彩票历史内容统一建档、切片、Embedding、全文候选、向量重排、规则混排和查询日志记录。
- 新增控制台命令 `php think kb:rebuild``php think kb:consume`,支持全量回填与增量消费;文章新增/编辑/上下架、帖子发布/删除/翻译缓存更新已接入同步任务队列,彩票历史通过消费命令补录扫描。
- 现有 `AiService` 已接入知识库增强分析:资讯分析、彩票总分析、彩票分模块分析统一增加 `from_kb / evidence_list / similar_history / retrieval_meta`;新增帖子专属接口 `GET /api/community/aiAnalysis?post_id={id}`
- 管理后台新增知识库配置、知识文档、同步任务、查询日志页面与对应 API,且扩展了 AI 分析记录 / AI 日志类型展示。
- 新增 `qa/backend/test_kb_article_analysis.py``qa/backend/test_kb_post_analysis.py` 作为知识库增强接口的最小冒烟脚本。
涉及模块:
- `server/app/common/model/ai/*`
- `server/app/common/service/ai/*`
- `server/app/common/command/KbRebuild.php`
- `server/app/common/command/KbConsume.php`
- `server/app/api/controller/CommunityController.php`
- `server/app/common/service/ai/AiService.php`
- `server/app/adminapi/controller/ai/*`
- `admin/src/views/ai/*`
- `docs/sql/create_ai_kb_tables.sql`
- `docs/sql/insert_ai_kb_config.sql`
- `docs/sql/insert_menu_ai_kb.sql`
- `qa/backend/test_kb_article_analysis.py`
- `qa/backend/test_kb_post_analysis.py`
### 11. 彩票资讯远程图片代理中转
- 状态:已完成 - 时间:2026-06-03
完成内容:
- 为前台资讯接口补充 `ArticleImageProxyService`,对白名单内的香港赛马会与台湾彩券远程图片生成站内代理地址。
- 新增公开接口 `/api/article/imageProxy`,由服务器代拉 `res.hkjc.com``cdn.taiwanlottery.com.tw` 等远程图片并回传,规避国内客户端无法直连的问题。
- `ArticleLogic::detail()``ArticleLists::lists()` 已统一接入代理改写,老文章无需重采即可让详情正文图片和列表封面图走服务器中转。
- 代理按 `ext.source` 白名单控制,仅对 `hkjc_racingnews``taiwan_lottery` 两类彩票资讯生效,降低 SSRF 风险。
涉及模块:
- `server/app/common/service/article/ArticleImageProxyService.php`
- `server/app/api/controller/ArticleController.php`
- `server/app/api/logic/ArticleLogic.php`
- `server/app/api/lists/article/ArticleLists.php`
### 1. 项目基础文档与协作协议
- 状态:已完成 - 时间:2026-05-07
完成内容:
- 创建根目录 `AGENTS.md`,记录项目技术栈、子模块分工、数据库基准与协作规范。
- 创建 `server/AGENTS.md``admin/AGENTS.md``uniapp/AGENTS.md``pc/AGENTS.md``qa/AGENTS.md`
- 创建 `业务进度管理.md``设计稿映射.md`,作为后续进度与设计稿映射维护入口。
涉及模块:
- `AGENTS.md`
- `server/AGENTS.md`
- `admin/AGENTS.md`
- `uniapp/AGENTS.md`
- `pc/AGENTS.md`
- `qa/AGENTS.md`
- `业务进度管理.md`
- `设计稿映射.md`
### 2. 新闻爬虫文章入库去重
- 状态:已完成 - 时间:2026-05-09
完成内容:
- 在懂球帝爬虫公共入库方法 `upsert_articles` 中增加同分类标题去重,阻止不同 `article_id` 的同标题文章重复写入。
- 新闻和视频采集任务按已知频道传入对应文章分类 `cid`,减少新增 `cid=0` 数据。
- 对已存在 `article_id` 且旧分类为 `cid=0` 的数据,后续带正确分类再次入库时可迁移到正确分类。
涉及模块:
- `server/public/dongqiudi-crawler/src/storage/database.py`
- `server/public/dongqiudi-crawler/src/scheduler/task_runner.py`
### 3. Truth Social 定时任务入口整理
- 状态:已完成 - 时间:2026-05-09
完成内容:
- 后台定时任务 `truth_social` 改为执行 `public/dongqiudi-crawler/main.py truth_social`
- 移除旧的 `server/public/truth-social` 独立采集目录,避免继续维护两套特朗普消息采集代码。
涉及模块:
- `server/app/adminapi/logic/crontab/CrontabLogic.php`
- `server/public/dongqiudi-crawler/truth_social.py`
### 4. 49宝典彩票社区爬虫接入
- 状态:已完成 - 时间:2026-05-11
完成内容:
- 新增 `lottery_community` 爬虫入口,拉取 49宝典首页 Astro props 数据并解析开奖与图库资料。
- 自动创建或复用社区标签 `彩票`,自动创建或复用发布用户 `lottery_publisher`
-`origin_id` 对彩票社区帖子做幂等新增/更新,并同步帖子图片和标签关联。
- 接入 ThinkPHP `crawler` 命令白名单和 Python 主入口命令映射。
- 提供幂等 SQL 注册定时任务 `crawler lottery_community`
- 修复 49宝典响应中文解码和图库图片域名规则,`prod/` 图片资源改用可直接访问的 `tk2cdn-ali.tprswe.com`
涉及模块:
- `server/public/dongqiudi-crawler/lottery_community.py`
### 10. 彩票 AI 趋势分析坏缓存容错
- 状态:已完成 - 时间:2026-06-03
完成内容:
- 排查 `/api/lottery/aiTrend?code=XOMLHC` 时发现,当前问题不是彩种不存在,也不是当前 DeepSeek key 鉴权失败,而是命中了 `la_ai_analysis` 中一条 `type=4` 的成功缓存,但该缓存 `result` 实际是 JSON 字符串 `\"\"``json_decode(..., true)` 后得到的是字符串而不是数组。
- `server/app/common/service/ai/AiService.php``analyzeLotteryModule()` 已补充防守:彩票 AI 模块缓存只有在解码后为非空数组时才视为有效;若模型返回的 `parsed` 不是数组或为空,也不再写入“成功缓存”,而是按格式异常处理。
- 这样可以避免旧的坏缓存继续让 `LotteryController::aiTrend()``aiHotCold()``aiStats()``aiColorZodiac()` 走到 `$this->data(string)` 并触发类型错误。
涉及模块:
- `server/app/common/service/ai/AiService.php`
### 9. 世界杯资讯翻译预热限制为列表前 50 条
- 状态:已完成 - 时间:2026-06-03
完成内容:
- 调整 `server/app/common/command/WorldcupArticleTranslate.php`,世界杯英文资讯翻译预热不再全量扫描全部文章。
- 预热范围改为按前台资讯列表同口径排序:`published_at desc, id desc`,仅处理用户当前最先看到的前 50 条世界杯资讯。
- 这样可以在 AI key 恢复后优先补齐前台首屏和专题页最靠前文章的翻译缓存,避免一次性处理历史文章拖慢恢复。
涉及模块:
- `server/app/common/command/WorldcupArticleTranslate.php`
### 9. 世界杯比赛详情接口默认直播链接
- 状态:已完成 - 时间:2026-06-03
完成内容:
- `server/app/api/controller/MatchController.php` 在前台 `/api/match/detail` 接口中为世界杯比赛补充默认直播链接。
- 当赛事 `league_name=世界杯``competition_id=61` 且数据库 `live_url` 为空时,接口响应中的 `live_url` 默认返回 `https://sports.cctv.com/?spm=C28340.P9mj1V5B06xk.E2XVQsMhlk44.7`
- 默认值仅在接口响应层兜底,不写回数据库;后台已维护的 `live_url` 仍优先返回,用户端继续只消费接口返回字段。
涉及模块:
- `server/app/api/controller/MatchController.php`
- `admin/src/views/match/lists/index.vue`
- `uniapp/src/pages/match_detail/match_detail.vue`
- `server/public/dongqiudi-crawler/main.py`
- `server/app/common/command/CrawlerCommand.php`
- `server/public/dongqiudi-crawler/insert_crontab_lottery_community.sql`
### 5. 项目级文档归档到根目录
- 状态:已完成 - 时间:2026-05-14
完成内容:
- 将项目级文档 `01-产品方案文档.md``02-实现流程文档.md``爬虫任务脚本文档.md``docs/` 目录移动到项目根目录统一维护。
- 在根目录 `AGENTS.md` 中补充项目级文档存放规则,明确协作类与业务类总文档默认放根目录。
- 同步修正文档引用路径,避免后续继续引用旧的 `docs/` 路径。
涉及模块:
- `AGENTS.md`
- `业务进度管理.md`
- `01-产品方案文档.md`
- `02-实现流程文档.md`
- `爬虫任务脚本文档.md`
### 6. FIFA 世界杯资讯定时采集接入
- 状态:已完成 - 时间:2026-05-15
完成内容:
- 新增 FIFA 世界杯资讯爬虫入口 `fifa_worldcup_news`,通过 FIFA CXM API 拉取世界杯页面新闻区块数据。
- 增加世界杯文章分类幂等创建/复用逻辑,默认分类名为 `世界杯`,并自动启用显示。
- 新增定时任务注册 SQL `insert_crontab_fifa_worldcup_news.sql`,采用 `crawler fifa_worldcup_news` 动作并按 10 分钟执行。
- 将后端定时任务调度链路扩展到 `fifa_worldcup_news`,沿用现有 crawler 异步执行模式。
- 已验证 FIFA API 可返回 20 条世界杯资讯;本地完整写库验证因 crawler 当前数据库配置指向 `127.0.0.1` 而 MySQL 拒绝连接,需在服务器/可用数据库环境执行。
涉及模块:
- `server/public/dongqiudi-crawler/fifa_worldcup_news.py`
- `server/public/dongqiudi-crawler/main.py`
- `server/public/dongqiudi-crawler/insert_crontab_fifa_worldcup_news.sql`
- `server/app/common/command/CrawlerCommand.php`
- `server/app/adminapi/logic/crontab/CrontabLogic.php`
### 7. 懂球帝世界杯专属采集与用户端世界杯中心
- 状态:已完成 - 时间:2026-05-15
完成内容:
- 新增 `dqd_worldcup` 专属采集任务,固定抓取懂球帝 2026 世界杯 `standing / schedule / person_ranking(goals|assists)`
- 世界杯赛程写入 `la_match`,统一使用 `league_name=世界杯``competition_id=61``sport_type=1`,并保留 `round_name``stage`
- 新增世界杯缓存表 `la_worldcup_standing``la_worldcup_person_ranking`,保留小组积分榜和球员榜结构。
- 新增幂等 SQL `insert_crontab_dqd_worldcup.sql`,自动创建并启用足球二级分类"世界杯",同时注册 `crawler dqd_worldcup` 定时任务。
- `MatchController` 新增 `worldCupStandings``worldCupRankings``worldCupSchedule` 3 个前台接口,供用户端世界杯中心使用。
- 用户端 `pages/match/match` 在"足球 > 世界杯"分类下新增"赛程对阵图"顶部入口卡,并新增 `packages_match/pages/worldcup` 世界杯专属页,提供"对阵图 / 积分榜 / 射手榜 / 助攻榜 / 赛程" 5 个 tab。
- 已在测试库执行 SQL 并手动跑通一次采集,当前写入结果为:`la_match` 104 场、`la_worldcup_standing` 48 条、`la_worldcup_person_ranking``goals/assists` 暂为空。
- 已验证测试服 `/api/match/leagues``/api/match/lists?league_name=世界杯` 可返回世界杯分类与赛程;`worldCupStandings / worldCupRankings / worldCupSchedule` 仍需等待后端自动同步到测试服后再做最终联调。
涉及模块:
- `server/public/dongqiudi-crawler/dqd_worldcup.py`
- `server/public/dongqiudi-crawler/main.py`
- `server/public/dongqiudi-crawler/insert_crontab_dqd_worldcup.sql`
- `server/app/common/command/CrawlerCommand.php`
- `server/app/common/model/match/WorldCupStanding.php`
- `server/app/common/model/match/WorldCupPersonRanking.php`
- `server/app/api/controller/MatchController.php`
- `uniapp/src/api/match.ts`
- `uniapp/src/pages/match/match.vue`
### 8. 49宝典新澳六合/旧奥六合爬取 API 格式适配修复
- 状态:已完成 - 时间:2026-06-01
完成内容:
- 发现新澳六合(xa6)和旧奥六合(a6)的 draw 类型帖子自 2026-05-29 起停止更新,根源为第三方 API 变更响应格式。
- 字段变更:开奖号码数组从 `openCode` 迁移到 `currentResult`,期号从 `issue` 迁移到 `currentCompleteIssue`/`currentIssue`
- 字段编码:五行由中文(金木水火土)变为字母编码(j/m/s/h/t),单双由中文(单双)变为字母编码(o/e),大小由中文(大小)变为字母编码(b/s),颜色新增 R/G/B 编码。
- 时间格式:开奖时间从时间戳变为 `"Y-m-d H:i:s"` 字符串格式。
- 修复 `lottery_community.py``build_draw_post` 函数,添加 `WUXING_MAP``ODD_EVEN_MAP``SIZE_MAP` 等映射表,增强 `color_text` 函数支持 R/G/B 编码,增强 `format_time` 函数支持字符串时间格式。
- 修复后的代码在 2026-05-31 18:10 的执行中成功同步:xa6 新增 92 条(含 1 条 draw + 91 条 gallery),a6 更新 101 条。
- 数据库验证:xa6 和 a6 的 draw 类型均已同步到最新 2026151 期,gallery 类型同步到最新数据。
- 注意:2026149-2026150 期因 API 格式变更期间不可回溯(API 只返回当前期),已无法补回。
涉及模块:
- `server/public/dongqiudi-crawler/lottery_community.py`