# Archive Quotation Builder

> 为档案信息化项目建立功能级报价口径、预算分配和金额对账。用于用户明确要求功能报价、分项报价、预算分配或审查档案项目报价清单；不因普通功能清单、方案预算文字或 Excel 美化自动触发。负责金额契约、叶子功能识别、权重分配、尾差回补和范围边界；Excel 导入、公式、样式、渲染与导出由当前 Spreadsheets Skill 主控。

- Skill: `wjjjjjjjjjjj/archive-quotation-builder` (Agent Skill, multi-file: 10 files)
- Install (CLI): `npx skillmds@latest add wjjjjjjjjjjj/archive-quotation-builder`
- Raw SKILL.md: https://api.skillmd.com/api/skills/wjjjjjjjjjjj/archive-quotation-builder/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: wjjjjjjjjjjj (https://skillmd.com/u/wjjjjjjjjjjj)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/wjjjjjjjjjjj/archive-quotation-builder

---


# 档案信息化项目报价清单

把预算转成可审计、可回算、可解释的功能级报价。任何正式报价必须满足：单位和税口径明确，分项合计严格等于系统预算，系统与固定项合计严格等于项目总价，未知预算不得静默写成 0。

## 协同边界

- 独立功能级报价由本 Skill 主控报价逻辑，叠加当前 `Spreadsheets` 完成工作簿读取、定向编辑、公式、数字格式、渲染和导出。
- 完整投标由 `bid-document-builder` 总控商务口径和最终合稿；本 Skill 仅返回已核对的报价工作簿与对账结果。
- 普通售前方案中的投资估算由 `presales-proposal-builder` 主控；只有需要功能级 Excel 分配时才叠加本 Skill。
- 招标模板或暗标要求 > 用户明确要求 > 中性报价默认 > 安铂品牌。不得因为是档案项目就自动套蓝橙。
- 本 Skill 不重建既有工作簿，不覆盖功能原文。需要润色时保留“原功能描述”，另增“优化说明”列并记录修改范围。

## 强制输入

开始前确认或从用户资料中提取：

1. 源功能清单或用户确认的叶子功能列表；
2. 每个系统预算，或总预算及已确认的系统分配；
3. 币种、金额单位、是否含税；
4. 固定项及其金额；
5. 正式报价、内部测算还是投标报价；
6. 招标模板、暗标、报价表字段和公式要求。

正式状态下，币种、单位或税口径未知必须停在内部草稿，不得假定为人民币、万元或含税。客户名称、项目编号、预算和功能范围均不得从历史报价迁移。

## 唯一配置契约

使用 `templates/quotation_config.example.json` 的结构。先把源表识别出的系统标题写入 `source_sections`，再配置 `systems`；两者的 key 和标题必须完全一致。金额均用十进制字符串，不使用二进制浮点数。每个系统必须包含唯一 `section_key`、完整 `section_title`、`budget` 和至少一个叶子功能或固定项。

叶子功能是可以单独描述交付结果和验收边界的最小可报价项。系统标题、功能组标题、说明行、空行和合计行不得参与分配。若无法可靠识别叶子项，先输出待确认清单，不自动给所有行分价。

复杂度权重只影响同一系统内叶子功能的相对分配，不代表市场价格或工作量承诺。默认权重规则见 [complexity_keywords.md](references/complexity_keywords.md)；同一关键词只能属于一个等级，用户显式权重优先。

## 分配与对账

运行：

```powershell
python "<skill-dir>/scripts/allocate_quotation.py" --config "<quotation_config.json>" --output "<allocation_result.json>"
```

脚本使用 `Decimal` 和最大余数法，以 0.01 个配置单位为最小颗粒度：

1. 从系统预算扣除系统固定项；固定项超过系统预算立即失败。
2. 对该系统全部叶子功能按权重一次分配，不先按功能组行数切预算。
3. 先计算未取整份额，再按余数从大到小回补尾差；相同余数按稳定 `item_id` 排序。
4. 断言“固定项 + 叶子项 = 系统预算”。
5. 断言“全部系统预算 + 项目级固定项 = 项目总价”。若配置了 `expected_project_total`，两者必须相等。

配置中的系统未在源表找到、源表系统没有预算、标题与 key 冲突、金额非法、功能 ID 重复或存在未识别行时，必须阻断正式输出。

## 写入 Excel

将 `allocation_result.json` 交给当前 `Spreadsheets` Skill，在原工作簿副本上定向编辑：

- 数量、单价、合价必须是数值单元格；合价优先使用公式，设置金额数字格式，不写“¥ 650 万元”这类文本。
- 系统合计和项目合计使用公式，并增加“配置预算、分项合计、差额”对账区；差额非零不得导出。
- 保留源表字段、顺序、合并单元格和招标模板；不得重复插入已有表头。
- 公式无缓存值、损坏文件恢复或字段缺失时，明确报告缺失统计并要求人工复核，不得声称无损提取。
- 最终工作簿每张可见表至少渲染一次，检查截断、换行、冻结窗格、合并、打印区域、公式错误和金额显示；修改后重新渲染。

`scripts/extract_xlsx_data.py` 只用于损坏文件的数据抢救，不是常规读取路径。恢复结果不能证明公式、样式、合并、批注或图片无损；正式报价必须回到可正常打开的工作簿或经用户确认的重建底稿。

## 交付门禁

交付前同时提供：

- 最终 XLSX；
- `allocation_result.json` 对账结果；
- 总价、各系统预算、固定项、税口径和单位摘要；
- 未报价、待确认、恢复缺失和人工复核项。

只有脚本返回 `valid: true`、工作簿公式复核通过、所有差额为 0 且完成视觉检查，才能称报价完成。不得把内部测算稿描述成正式报价。

