445 lines
29 KiB
Markdown
445 lines
29 KiB
Markdown
# 业务进度管理
|
||
|
||
> 本文档用于跟踪 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`
|