yumoqing 45cec8987e feat(opp): 数据参考三级整行下钻+明细详情弹窗+附件下载代理
- 汇总主题/分项条目整行点击(cursor:pointer)弹下级弹窗,撤「查看分项」按钮
- 明细每条来源写进说明文字(source_text),删除 source_button_widget 来源按钮
- 新 opp_item_detail.dspy: 爬虫平台条目全量字段+公告全文+附件列表
- 新 opp_attachment_dl.dspy: 服务端附件下载代理,归属校验防SSRF,
  降级链 download_url→/api/attachments/{id}/download→原始url,失败如实报错
- opp_data_capability: tender_attachments/normalize_attachment 容错对接
  爬虫平台附件子系统(/api/tenders/{id}/attachments,另一会话开发中,未就绪时降级提示)
- opp_common: crawler_get_raw 原始字节下载辅助; load_path 注册两个新端点
- README/prompt 同步新交互描述
2026-09-08 23:39:16 +08:00

95 lines
4.9 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.

# pipeline-opportunity — 商机产线能力包
把招标市场情报转化为软件研发商机:**热点软件推荐 → 每日AI/Agent招标 → 研发报告编写 → 人工确认 → 研发审批流程**。
## 平台边界(重要)
- **数据爬取平台**(ebpe.cc:/d/ymq/work/tender_opp,独立部署):采集中国招标网站数据、
持久存储、去重,仅通过内网 HTTP 只读接口对外(`192.168.16.2:9085`,X-API-Token 鉴权)。
- **本模块(产线平台侧)**:商机业务闭环。只消费爬虫数据,不爬取、不存招标原始数据;
报告/审批状态落产线库 `opp_reports` / `opp_approvals` 表,绝不回写爬虫库。
依赖方向:产线平台 ──HTTP──> 数据爬取平台(单向)。
## 产线闭环与门禁
```
opp_hot_software / opp_daily_ai_tenders(爬虫平台数据)
↓ 选定方向
opp_create_report(草稿)→ opp_update_report(补写,数据必须来自工具返回)
↓
opp_submit_report ──> 人工确认任务(门禁,pipeline_human_tasks: opp_report_confirm)
↓ 人工确认通过(confirm 回流)
initiate_approval ──> 研发审批任务(门禁,opp_dev_approval)
↓ 人工审批结论回流
approved / rejected(rejected 可退回 draft 重来)
```
状态机:`draft → confirmed → approval_initiated → approved/rejected`(非法迁移一律拒绝)。
agent 禁止自批自审:确认与审批结论只能由人工任务回流驱动。
## 工具清单(主 agent / 驾驶舱)
| 工具 | 用途 |
|------|------|
| opp_hot_software | 热点软件推荐(招标量+预算+地区排名) |
| opp_daily_ai_tenders | 每日 AI/Agent 招标展示数据 |
| opp_search_tenders | 关键词检索招标信息 |
| opp_tender_detail | 单条详情(含原文/预算/联系人/来源链接) |
| opp_crawler_stats | 爬虫平台采集健康度 |
| opp_create_report / opp_update_report | 报告草稿创建与补写 |
| opp_list_reports / opp_get_report | 报告列表与全文 |
| opp_submit_report | 提交人工确认(门禁) |
| opp_list_approvals | 审批单列表 |
| opp_diagnose | 产线诊断(报告分布/待办/爬虫连通性) |
角色:`agent.opp_analyst`(商机分析师)、`agent.opp_writer`(研发报告撰写工程师)。
slash 命令:`/hot` `/ai` `/reports` `/oppdiag`。
## 数据参考弹窗(三级下钻,2026-09-08 交互定稿)
菜单「📋 数据参考」→ `opp_references_popup.dspy`,三级结构全部**整行点击**(cursor:pointer,
无「查看分项」按钮):
1. **汇总层**(主题排名:招标/国内众包/海外三板块):点主题条目 → 弹出该主题分项列表
(`opp_references_items` / `opp_demand_items` / `opp_overseas_items.dspy`)。
2. **分项层**(明细条目):每条说明文字标注「来源:xxx」(`source_text()` 解析,
来源按钮已废弃删除);点条目 → 弹出具体内容(`opp_item_detail.dspy`:
爬虫平台 `/api/tenders/{id}` 全量字段 + 公告/需求全文 + 原文页/采集来源页按钮 + 附件列表)。
3. **附件层**:详情弹窗列出条目附件(爬虫平台 `/api/tenders/{id}/attachments`,
字段容错归一 `normalize_attachment`),「下载」按钮走服务端代理
`opp_attachment_dl.dspy`——先回查条目附件清单做归属校验(防 SSRF,前端传任意
att_url 不在清单内即拒绝),再按降级链取字节:记录 download_url →
`/api/attachments/{id}/download` → 附件原始 url;代理失败如实报错不静默。
附件端点未就绪(爬虫平台附件子系统部署中)时:分项列表不显示 📎 角标、详情弹窗
显示「附件服务暂不可用」,其余功能不受影响。
## 爬虫平台接入配置
系统级配置禁硬编码,走 appbase `params` 表(兜底默认值内网地址):
| params 键 | 值 |
|-----------|-----|
| `tender_api_base` | `http://192.168.16.2:9085`(默认) |
| `tender_api_token` | 爬虫平台 `state/api.env` 中的 TENDER_API_TOKEN |
## 部署(宿主 = pipeline-app)
1. `git clone` 到 `<APP_ROOT>/pkgs/pipeline-opportunity`
2. `bash build.sh`(建表 + 种子数据 + wwwroot 软链 + pip install)
3. app 入口已接线:`load_pipeline_opportunity()`(try/except 兜底)
4. RBAC:`cd <APP_ROOT> && py3/bin/python pkgs/pipeline-opportunity/scripts/load_path.py`
5. i18n:合并 `i18n/{zh,en}/msg.txt` 到宿主 wwwroot(merge_i18n.py),调 /i18n_getmsgs 刷新
6. 重启应用;浏览器验证驾驶舱 `/pipeline-opportunity/agent`
## 表
- `opp_reports`:研发报告(software/title/content/status/confirm_task_id/confirmed_by)
- `opp_approvals`:研发审批(report_id/status/note/resolved_by)
## 技能
产线技能在 pipeline-core 技能库:`skills_library/pipelines/opportunity_general/`
(common/opp-workflow 总纲 + roles/agent.opp_analyst、agent.opp_writer 角色技能)。