把「读招标文件 → 沉淀知识库 → 装配投标内容 → 排版 → 编页码索引 → 导出成稿」这条原本靠人肉 Word/Excel 的流水线,做成一个可离线运行的桌面软件。 目标:一份上百页的投标文件从几天压缩到几小时,页码索引与符合性检查不再靠人眼。
主控面板:工作台 / 知识库 / 历史标书 / 草稿标书 四入口,归档与草稿计数实时展示
Step 1 文件解析:五个子模块上传即真实解析;右侧项目核对预览可直接修改提取结果
做标书的人都知道这四件事有多耗人:
- 招标文件读不完:动辄几百页,格式五花八门(
.doc/.wps/.xls、合并单元格、正文没有标题样式只有目录),人工摘录慢且必漏。 - 历史标书用不上:最值钱的资产躺在网盘里,每次都从空白文档重写。
- 页码索引靠手翻:正文改一段,目录页码、评分索引页码全得重编。
- 符合性检查靠人眼:漏响应一条评分项就可能废标。
本项目把这四步全部工具化:解析 → 拆块入知识库 → 装配 → 排版测算页码 → 导出 docx + 检查报告。
| 步骤 | 能力 |
|---|---|
| 1 文件解析 | 项目清单 / 技术规范书 / 物料报价清单 / 评分标准 / 招标文件框架,五个子模块上传即真实解析(Excel 走 SheetJS,Word 走 mammoth);表头模糊匹配兼容各异列名;合并单元格整区覆盖;评分表按标题语境自动分商务/技术双表 |
| 2 内容装配 | 三栏协作:左目录树(右键菜单:知识库匹配候选 / 引用知识库 / 上方插入新小节 / 重命名 / 删除)|中知识库检索|右成品区(技术·商务·价格三分类);拖拽排序、引用内容块、插入分页符,右列编辑不污染知识库 |
| 3 排版定义 | 字体字号 / 行距 / 页边距 / 页眉页脚 / 双页码体系样式控制器 + 技术·商务·价格三标签 WYSIWYG 实时预览 |
| 4 评分索引 | A4 离屏排版引擎真实测算每个内容块的物理起始页码并回填索引表;AI / 启发式章节定位 + 比对报告 + 人工修正 + 豁免按钮 |
| 5 终稿输出 | 合稿 / 分册(技术标·商务标·价格标)导出为真实 .docx;含页码全文的符合性检查报告 |
顶部五步进度条常驻,未完成当前步进入下一步会二次确认拦截。另有「历史标书」(Step 5 归档,可再打开修改)与「草稿标书」(保存草稿继续编辑)两个入口。
- 智能拆解:历史标书(含
.doc/.wps)按标题拆成内容块入库,四步显式向导(选择文件 → 分析文件 → 选择内容 → 完成),不再静默后台跑 - 标题三通道识别:Word 标题样式 / 整段加粗编号段落 / 目录条目——真实文档常三者混用、甚至正文缺样式只有目录
- 拆解粒度收敛:按大节(level ≤ 2)归档,子节标题与正文并入父节,避免碎块
- 双库分类 + 在线编辑:技术/商务分类、拼音序、版本管理;TipTap 3 富文本编辑(加粗/斜体/下划线/删除线、二三级标题、有序无序列表、文字颜色、本地图片内联、撤销重做)
- 内容块落盘:每块可导出为独立
.docx再编辑 - 专业编辑:可调起本机 Word/WPS 原生编辑器,窗口内嵌进本程序(
SetParent子窗内嵌,不是浮窗贴附),支持从目录树直接定位到对应节
| 能力 | 用途 |
|---|---|
| 响应值预填 | 技术规范书参数表的「投标人响应值」缺失时给建议值,浅黄标注待人工复核 |
| 评分章节定位 | 把评分项定位到成品文档章节,生成索引与比对报告 |
| 符合性检查 | 逐条核对评分项是否被响应,输出缺漏清单 |
职责边界:AI 只做语义理解,物理页码一律由前端排版引擎测算,不让模型编页码。 支持任意 OpenAI 兼容服务,Key / BaseURL / 模型都可在界面里改,并可「测试连接」「重新拉取模型列表」。
- 图片原图直载:图片字节落盘 + 自定义协议加载,不走 base64 内联——数百 MB、上千张图的历史标书不失真也不崩
- 本机 Office / WPS COM:
.doc/.wps转.docx、全真预览(Word/Excel 1:1 渲染成 PDF)、原生编辑器内嵌 - 在线表格编辑:Univer sheets 内核,直接在程序里改 Excel(插入/删除行列、合并拆分单元格、复制粘贴整表)
- Node.js ≥ 18(建议 20 LTS)
- Windows。桌面版的格式转换 / 全真预览 / 内嵌编辑需要本机装有 Word 或 WPS
- 纯浏览器模式不依赖 Office,可跑通全部主流程(旧格式转换除外)
npm install| 场景 | 命令 |
|---|---|
| 浏览器开发模式 | npm run dev → http://localhost:5173 |
| 桌面版(连开发服务器,带热更新) | 先 npm run dev;另开终端 $env:VITE_DEV_SERVER_URL='http://localhost:5173'; npm run electron |
| 桌面版(跑构建产物) | npm run build 然后 npm run electron |
| 生产构建 | npm run build → dist/ |
| 打包 Windows 安装包 | npm run dist → release/(NSIS,可选安装目录,自动建桌面快捷方式) |
dist/与release/都已在.gitignore中,不入库。Electron 二进制默认走 npmmirror 国内镜像下载(见package.json的build.electronDownload),国内网络不用额外配代理。
二选一:
- 页面右上角「AI 配置」弹窗填入 API Key(可同时改 BaseURL 与模型;仅存本机 localStorage,推荐);
- 或复制
.env.example为.env,填入VITE_QWEN_API_KEY/VITE_QWEN_BASE_URL。
本仓库不内置任何密钥。 未配置时所有 AI 能力自动降级为 Mock 模式,主流程不受影响。
浏览器端解析不了旧版二进制格式,两条路:
# 方式一:本地转换桥(推荐)——保持这个窗口开着,所有上传入口会自动调用
node scripts/doc-bridge.mjs # 起 127.0.0.1:8787,调用本机 Word COM;用 WPS 就把 COM 名改成 KWPS.Application
# 方式二:批量转换整个资料目录(同名 .docx 生成在原文件旁,不改动原文件)
powershell -ExecutionPolicy Bypass -File scripts\convert-to-docx.ps1 -Root "C:\path\to\招标资料"转换桥的临时文件必须落在纯 ASCII 路径(脚本内固定
C:\bidpro-tmp):非 ASCII 用户名机器的os.tmpdir()会落成 8.3 短路径(形如XXX~1),Word COM 的Documents.Open会直接失败,表现为"转档失败"。
├── electron/ # 桌面端主进程
│ ├── main.cjs # 主进程:窗口/IPC/知识库节落盘/Office COM/内嵌编辑/自定义图片协议
│ ├── preload.cjs # 预加载桥(window.bidpro.*)
│ └── confirmPreload.cjs # 确认弹窗专用预加载
├── scripts/
│ ├── doc-bridge.mjs # 本地 .doc/.wps → .docx 转换桥(127.0.0.1:8787)
│ └── convert-to-docx.ps1 # 批量转换脚本(无 Word 自动尝试 WPS)
├── tools/
│ ├── editorhost.Program.cs # 原生编辑器宿主源码
│ └── editorhost.exe # 编译产物(打包时作为 extraResources 随包分发)
├── docs/database-design.md # 后端持久化设计(尚未实现,路线图中)
└── src/
├── main.jsx / App.jsx # 入口与路由
├── layouts/
│ ├── MainLayout.jsx # 全局壳层(含 AI 配置入口)
│ └── WorkflowLayout.jsx # 工作流壳层(进度条 + 路由级门禁)
├── components/
│ ├── StepProgress.jsx # 顶部常驻五步进度条(点击回退/前进拦截)
│ ├── AISettingsModal.jsx # AI 配置弹窗(Key/BaseURL/模型 + 连接测试)
│ ├── TenderExtractWizard.jsx # 招标件抽节向导(四步显式流程)
│ ├── ExcelEditorModal.jsx # Univer 在线表格编辑
│ ├── WpsEditorModal.jsx # 本机 Word/WPS 原生编辑器内嵌
│ └── NativePreviewButton.jsx # 全真预览(Office COM → PDF 1:1 渲染)
├── pages/
│ ├── Dashboard.jsx # 主控面板(工作台 / 知识库 / 历史标书 / 草稿标书)
│ ├── FillPopup.jsx # 独立填入浮窗
│ ├── workflow/
│ │ ├── Step1Parsing.jsx # 1.1~1.5 多源文件解析(Tabs)
│ │ ├── step1/ # 项目清单/技术规范/物料/评分/框架 五个面板
│ │ ├── Step2Assembly.jsx # 三栏装配:目录树 | 知识库 | 成品合成
│ │ ├── Step3Layout.jsx # 样式控制器 + 三分类实时预览
│ │ ├── Step4Index.jsx # 页码引擎测算 + AI/启发式章节定位 + 豁免
│ │ └── Step5Output.jsx # docx 导出 + 含页码全文符合性检查
│ └── knowledge/
│ └── KnowledgeCenter.jsx # 智能拆解 + 双库管理 + 在线编辑 + 归档向导
├── stores/ # Zustand:工作流状态机 / 标书数据 / 知识库 / AI 配置(persist)
├── services/
│ ├── listParser.js # 项目清单/技术规范/物料/评分 真实解析(Word + Excel)
│ ├── docxParser.js # mammoth 解析 + 标题三通道识别 + 内容块拆分
│ ├── tableExtractor.js # 响应列检测与优先级规则
│ ├── fillMatch.js # 填入字段定义 / 日期样式 / 自动匹配算法
│ ├── docxExporter.js # docx 生成导出
│ ├── pageEngine.js # 页码计算引擎(A4 离屏排版测算)
│ ├── docBridge.js # 前端侧转换桥调用
│ └── aiService.js # AI 对接(预填/章节定位/符合性检查,未配置自动 Mock)
├── mocks/sampleData.js # 演示数据(上传真实文件后即被替换)
├── utils/tree.js # 扁平块 → 树结构(含坏数据兜底)
└── styles/global.css
| 需求条目 | 实现位置 | 状态 |
|---|---|---|
| 五步进度条 + 未完成确认禁止进入下一步 | StepProgress + WorkflowLayout 路由门禁 |
✅ |
| 1.1 项目清单勾选 → 预览卡片 → 锁定当前项目 | step1/ProjectListPane |
✅ 真实解析 Excel/Word |
| 1.2 响应列优先级(复用 / 新增 / AI 预填浅黄标注) | step1/TechSpecPane + tableExtractor + aiService |
✅ 真实解析 + AI 预填 |
| 1.4 商务/技术双表 + 自动生成"索引页码"空列 | step1/ScoringPane |
✅ 真实解析(按标题语境分表) |
| 1.5 目录拆分为内容块 + 树勾选 + 预览修订 | step1/FrameworkPane |
✅ 真实解析(标题三通道) |
| 2 三栏装配:拖拽排序 / 引用此块 / 右列可编辑不污染知识库 / 分页符 | Step2Assembly |
✅ |
| 3 标题映射 / 页眉页脚 / 双页码体系 + WYSIWYG 三标签预览 | Step3Layout |
✅ |
| 4 AI 索引回填 + 比对报告 + 人工修正 + 豁免按钮 | Step4Index + pageEngine |
✅ 页码真实测算 |
| 5 合稿/分册 docx 导出 + 符合性检查报告 | Step5Output + docxExporter |
✅ 导出为真实 docx |
| 知识库智能拆解 + 双容器分类 + 拼音序 + 版本管理 | KnowledgeCenter |
✅ |
| 富文本编辑(加粗/标题/列表/颜色/图片) | TipTap 3 | ✅ |
v0.2 ~ v0.6 各版本做了什么(点击展开)
- Step 1 真实文件解析:五个子模块上传即真实解析。表头模糊匹配兼容各异列名;评分表按"表格前最近标题语境"分离商务/技术;Excel 走 SheetJS,Word 走 mammoth。
- AI 能力对接:Key 在页面右上角配置(localStorage 持久化),三个 AI 能力即时切换真实调用,未配置自动 Mock 降级。职责边界:AI 只做语义理解,物理页码一律由前端排版引擎计算,杜绝模型幻觉。
- TipTap 富文本:编辑预览浮窗升级为 TipTap 3。
- 页码计算引擎:按 A4 页面几何 + Step 3 锁定样式在离屏容器真实排版,处理三级小节强制分页与超高块跨页,输出每个内容块的物理起始页码。
- 项目清单(需求一览表 xlsx):适配"首行大标题(合并单元格)+ 次行表头"排版;字段映射按真实列名校准(分标编号/分标名称/包号/项目名称/采购内容);招标编号自动从分标编号前缀推导批次编号。实测 33 行全部正确识别。
- 物料清单(报价清单 xlsx):适配"前 4 行标题区 + 第 5 行表头"排版;物料名兼容"采购内容"列;备注列中的"单价最高限价:X 万元"自动提取为
priceCeiling。实测 84 行物料全部正确识别。 - 评分标准(招标文件 docx):评分细则分散在"项目/评审要素/评审细则"多列,按行拼接为完整细则;分值从【N分】文字模式提取(取最大值);自动过滤"见评标办法前附表""分值构成""无"等索引引用噪声行;按最近标题语境分离商务/技术双表。实测商务 20 条、技术 107 条。
- 技术规范书响应列:兼容"投标人保证值/应答值/偏离"等多种列名,不再误判为无响应列而重复新增。
.doc/.wps旧格式转换:浏览器端无法解析二进制旧格式,上传时自动拦截并给出指引;随包提供批量转换脚本(调用本机 Word,无 Word 自动尝试 WPS)。实测某技术规范书(.doc)转换后 11 张表格(含主要电气参数表)完整解析。
- 合并单元格整区覆盖:真实 xls 的合并区底层单元格常残留旧值(如分标编号列第 2-11 行残留公司名),改为用左上角值覆盖整个合并区,多包归属全部正确(实测异常行 0)。
- 技术规范书复选框:每张参数表带复选框,"确认技术规范"时仅保留勾选表格。
- 物料基准价/折扣率:报价清单新增 单价/合价/基准价/折扣率 列;项目清单新增 报价方式/预估金额/最高限价折扣率/交货期 字段并在核对卡片展示。
- 评分标准 Word + Excel 双兼容:
parseScoring支持 xlsx/xls;商务/技术归类改为"文件名 > 工作表名 > 标题语境"优先级,商务评分表不再被并入技术标。 - 整本框架完整识别:
htmlToBlocks标题三通道(Word 标题样式 / 整段加粗编号段落 / 目录"第X章"纯段落)+ 标题去重 + 运行栈父子判定,实测生成 122 个内容块,末章"投标文件格式"及其商务/技术偏差表子块全部入树。
- 本地转换桥:
node scripts/doc-bridge.mjs起 127.0.0.1:8787 服务,调用本机 Word COM 把.doc/.wps转.docx返回;所有上传入口自动调用。 - Step 2 重构:去掉中间"匹配候选"列,改为左目录树右键菜单 + 右成品区技术/商务/价格三分类。
- Step 3/5 三分类联动:预览与分册导出均按技术/商务/价格过滤,新增价格标导出。
- 主界面四入口:新增"历史标书"与"草稿标书",工作流顶部加"保存草稿",localStorage 持久化。
- 知识库拆解粒度:收敛到大节(level ≤ 2),子节标题+正文并入父节,不再过碎;
.doc历史标书可拆解。 - 技术规范书右键表格编辑:插入/删除行列、合并/拆分单元格、复制/粘贴整表、整表删除。
- 物料联动:单价 ↔ 折扣率合价自动换算(折扣率 = 单价 / 基准价),"统一折扣率"批量重算。
- 项目核对预览可编辑:固定六字段(招标编号/项目名称/分标编号/分标名称/包号/包名)可直接改。
- 图片原图直载:图片落盘 + 自定义协议加载,替代 base64 内联,大文档不失真不崩溃。
- 知识库内容块落盘:每块存为独立 docx(含标题层级与图片),可再编辑、可被原生编辑器打开。
- 本机 Office/WPS COM:全真预览(1:1 渲染 PDF)、原生编辑器窗口内嵌(
SetParent子窗内嵌 + 关硬件加速)、目录树定位到文档对应节。 - 在线表格编辑:接入 Univer sheets 内核。
- 显式抽节向导:招标件/知识库归档统一为四步向导,带进度与失败原因,不再静默后台。
- 标题拆解健壮性:修复"相邻同名标题(正式标题 + 居中题注行)合并时把
parentId填成自己 → 整节点从树里消失"的问题,并在建树与载入两侧对历史坏数据自愈。
- 导出的 docx 为文本级,图片与复杂表格尚未完整写入
- 页码按内容高度离屏测算,不是真实分页渲染,极端排版下可能与 Word 实际页码有偏差
- 数据存 localStorage(Electron 下另落盘知识库节文件),未接后端;
docs/database-design.md是待实施的设计稿 - 跨页表格 / 合并单元格的复杂表格,mammoth 输出可能错乱(路线图里的 OCR + 表格重建待接入)
- 解析增强:跨页/合并单元格表格接入服务端 OCR 与表格重建算法
- 后端持久化:按
docs/database-design.md建库,Zustand 替换为 API 请求层 - 知识库检索:标题匹配升级为向量相似度召回(DashVector / Milvus)
- 导出增强:图片/表格完整写入 docx;分册导出按块类别过滤
- 分页精度:接入真实分页渲染(服务端 PDF)替代高度测算
- 提 issue 请带上:文件格式(
.docx/.xls/.doc)、出问题的步骤(Step 几 / 哪个面板)、期望结果与实际结果。请勿上传真实招标文件,能复现的最小脱敏样本即可。 - 提交代码请保持现有风格:解析类改动尽量在
src/services/内完成,并说明依据的真实文档排版特征。 - 涉及页码、父子层级、标题识别的改动请格外谨慎——这三处的启发式规则彼此耦合,改一条容易连带影响其他(详见
src/services/docxParser.js与src/utils/tree.js注释)。
本仓库不内置任何 AI 服务密钥,克隆后需自行配置(见「AI 配置」)。