上传招标文件后,输出两份交付物:
python -X utf8 + pdfplumber 提取全文,保存为 .temp/bid_full_text.txt从文本中提取以下数据,完整字段映射参见 references/parsing-guide.md。
必须提取的核心数据(11组):
| 变量名 | 内容 | 示例 |
|---|---|---|
| :--- | :--- | :--- |
PROJECT | 项目基本信息对象 | {name, bidNo, purchaser, budget, deadline, ...} |
EVAL_SCORES | 评标评分项数组 | [{category, item, score, detail, target}] |
STRATEGIES | 每项评分的策略建议 | [{item, tips[]}] |
TECH_REQS | 技术功能要求 | [{module, item, detail, importance}] |
HARDWARE_REQS | 硬件参数要求 | [{name, qty, params}] |
BIZ_REQS | 商务条款 | [{name, value}] |
DARK_MARK_RULES | 暗标格式规范 | [{item, rule, consequence}] |
RISKS | 风险清单 | [{type, desc, level, suggestion}] |
QUALIFICATIONS | 资质材料清单 | [{name, necessity, deadline}] |
PERSONNEL | 人员配置要求 | [{role, requirements, certs, score}] |
SOP_PHASES | 投标SOP阶段 | [{name, period, color, tasks[]}] |
SOP生成规则:
{id, name, detail, responsible, deadline, necessity, priority}用 docx skill 生成 .docx 文件,保存到工作空间根目录,文件名:【{采购人简称}】招标文件解析报告.docx
报告结构(参考parsing-guide.md中的9张表):
assets/workbench-template.html 到工作空间 标签中的项目名称模板文件位置: ~/.config/teleai-super-agent/skills/bid-analysis/assets/workbench-template.html
数据替换方式: 在模板中搜索 / === 项目数据 === / 注释标记,将对应JS常量替换为Step 2解析的实际数据。变量名和数据结构必须保持一致。
【强制】数据替换后JS语法验证:
替换完成后,必须用Node.js检查JS语法,确认无错误后再打开浏览器。语法错误会导致整个脚本块不执行,页面显示为空白(侧边栏有但内容区无数据)。
验证命令(Python提取JS后交给Node检查):
import re, subprocess
with open(html_path,'r',encoding='utf-8') as f:
content = f.read()
m = re.search(r'<script[^>]*>(.*?)</script>', content, re.DOTALL)
js = m.group(1)
with open('.temp/check_js.js','w',encoding='utf-8') as f:
f.write(js)
result = subprocess.run(['node','--check','.temp/check_js.js'], capture_output=True, text=True)
if result.returncode != 0:
print('SYNTAX ERROR:', result.stderr) # 必须修复后才能继续
常见替换陷阱(踩坑记录):
]; 或 } 在替换时未完全删除,导致多余的闭合符号残留[ 或 ](如正则表达式、文档示例),会影响括号统计但Node --check 能准确定位真正的语法错误const XXX = 到对应的闭合 ]; 或 };),不能只替换值部分而保留旧的闭合符号node --check 返回码为0)Start-Process python -ArgumentList "-m","http.server","8899","--directory","工作空间路径"| 页面 | 功能 | 交互 |
|---|---|---|
| :--- | :--- | :--- |
| 项目概览 | 4卡横铺(限价/截止/质保/评标)+ 项目信息 + 评分构成 + 进度总览 | 无 |
| 投标SOP | 5阶段折叠 + 44项复选框 + 到期提醒 + 保存按钮 | 复选框持久化、阶段折叠、保存含时间戳文件名 |
| 评标分析 | 可交互环状图 + 评分策略 + 得分汇总表 | Hover高亮、点击切换右侧分值构成、策略展开折叠 |
| 技术要求 | 技术参数表 + 搜索筛选 + 硬件要求 | 搜索过滤 |
| 商务要求 | 商务条款信息卡 | 无 |
| 暗标规范 | 13条格式规则检查表 | 复选框持久化 |
| 风险分析 | 风险卡片 + 筛选器 | 状态切换(待处理/处理中/已解决) |
| 资质准备 | 资质清单表格 + 筛选器 | 复选框持久化 |
| 人员配置 | 人员资质卡片 | 无 |
| 商务报价 | 4策略卡片 + 报价计算器 + 基准价模拟器 | 计算交互 |
onclick="全局函数()" 而非 addEventListener(避免Playwright兼容问题)bidding_portal_state大模型智能融合平台建设项目_投标辅助工作台_20260430_143025.html[data-theme="dark"] + CSS变量| 问题 | 原因 | 防范措施 |
|---|---|---|
| :--- | :--- | :--- |
| 页面空白,侧边栏有但内容区无数据 | 数据替换时残留多余的 ]; 或 },导致JS语法错误,整个块不执行 | Step 4替换后必须运行 node --check 验证语法;替换旧常量时完整删除旧声明(含闭合符号) |
| 残留代码覆盖导致回退 | 函数替换时未完整删除旧版本,残留代码导致语法错误 | 函数替换使用唯一上下文(前后各多取几行)确保精确匹配 |
querySelector返回null | DOM元素ID与实际不匹配 | 渲染函数中ID必须与HTML模板一致,全局搜索确认 |
| setTimeout延迟注入不可靠 | renderAll()在数据注入前执行,渲染为空状态 | 数据在变量声明处直接赋值,不使用setTimeout |
| 概览页评分构成三卡片分值之和≠100分 | 模板renderOverview()函数中硬编码了上一个项目的分值(如商务25、暗标65),JS常量声明区域替换不会覆盖这些渲染函数内的写死数字 | Step 4替换数据后,必须全局搜索模板中所有硬编码的旧项目分值(如25分、65分、暗标、明标等关键词),改为从EVAL_SCORES按category动态汇总计算;侧边栏项目名(sidebar-subtitle)、概览页副标题(page-desc)等处的旧项目名/编号也需一并替换 |
| 项目概览/评标分析页面点击无反应(侧边栏可见但内容区空白) | renderOverview()和renderEval()函数依赖CAT_KEYS/CAT_SCORES两个全局变量(用于动态汇总各category分值),但这两个变量在模板中从未定义,导致ReferenceError使渲染函数崩溃,content.innerHTML未赋值 | 已在模板中修复:在EVAL_SCORES声明结束后、STRATEGIES声明之前插入CAT_KEYS/CAT_SCORES动态计算代码(遍历EVAL_SCORES按category分组求和)。同时将renderEval()中硬编码的描述文字和renderBreakdown()中硬编码的分值改为从CAT_KEYS/CAT_SCORES动态读取。后续生成工作台时无需额外处理此问题 |
assets/workbench-template.html:完整HTML模板(含所有10个页面、CSS主题、JS交互逻辑),约2800行references/parsing-guide.md:招标文件解析字段映射指南(11组数据结构定义 + 解析要点 + 9张标准产出表)共 5 个版本