# Doa Quotation

> 从需求描述生成经典报价 Excel 或敏捷任务拆分 Excel，并优先复用当前工作区中的客户/项目模板。 完整工作流： (1) 用户提供需求、客户名称、项目名称或参考模板 (2) 使用 vscode_askQuestions 让用户选择“经典报价”或“敏捷方式” (3) 根据客户名称、项目类型、历史模板和现有 Python/Excel 文件确定输出结构与风格 (4) 生成或更新 Excel / Python 生成脚本，并校验工时、费用、税率、Sprint 拆分和样式一致性 USE FOR: 做报价、工时报价、项目报价、经典报价单、敏捷任务拆分、Sprint 拆分、敏捷排期、报价 Excel、 工时报价 Excel、报价模板复用、按客户生成报价、按项目生成报价、生成报价脚本。 DO NOT USE FOR: 接口文档（使用 doa-apidoc）、PPT（使用 doa-ppt）、会议纪要（使用 doa-metting）。

- Skill: `gabrielmoreira/doa-quotation` (Agent Skill)
- Install (CLI): `npx skillmds@latest add gabrielmoreira/doa-quotation`
- Raw SKILL.md: https://api.skillmd.com/api/skills/gabrielmoreira/doa-quotation/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: gabrielmoreira (https://skillmd.com/u/gabrielmoreira)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/gabrielmoreira/doa-quotation

---


# 报价与敏捷任务拆分生成

## 工作流概览

```text
用户提供需求/客户/项目信息
→ 确认输出模式（经典报价 / 敏捷方式）
→ 搜索并比对当前工作区模板
→ 结构化整理报价项或 Sprint/任务项
→ 生成 Excel 或 Python 生成脚本
→ 校验工时/金额/税率/样式
→ 输出最终文件路径与说明
```

## 何时使用

- 用户说“帮我做报价”“生成报价单”“整理工时报价”
- 用户说“按敏捷方式拆任务”“做 Sprint 拆分”“生成敏捷排期 Excel”
- 用户提供客户名称、项目名称，希望参考已有模板生成新的 Excel
- 用户提供 Python/openpyxl 脚本或历史 Excel，要求按同类风格生成新版本

## Step 0: 必须先确认输出模式

当用户只说“做报价”或“做任务拆分”，**必须先使用 `vscode_askQuestions` 确认**：

- 经典报价
  - 适合固定范围、按模块/工时/费用输出传统报价单
- 敏捷方式
  - 适合按 Sprint、任务、人天、验收标准输出敏捷任务拆分表

推荐问题：

```text
问题：本次希望采用哪种输出方式？
选项：
  - 经典报价 ← recommended
  - 敏捷方式（Sprint / 任务拆分）
```

如果用户已经明确说了“经典报价”或“敏捷方式”，可以跳过这一步。

## Step 0.5: 必须确认期望总工时范围

在进入模板选择和任务拆分前，**必须再使用 `vscode_askQuestions` 确认期望的总工时范围**，单位为人天。

推荐问题：

```text
问题：本次期望的总工时范围是？
选项：
	- 10人天以下
	- 10-30人天
	- 30-50人天
	- 50-70人天 ← recommended
	- 70-100人天
```

使用规则：

1. 这个范围是生成报价和任务拆分时的重要约束，不应跳过
2. 若用户已明确给出目标工时或目标预算可推导工时范围，可直接采用并在最终说明中写明
3. 若用户选择的工时范围与参考模板差距很大，应优先调整任务粒度、Sprint 数量或模块范围，而不是机械照搬模板
4. 经典报价与敏捷方式都应记录该范围，作为总人天校验依据

## Step 1: 收集最小必要信息

至少确认以下信息；如用户未提供，继续追问缺失项：

1. 客户名称
2. 项目名称
3. 需求描述或范围说明
4. 输出模式
5. 期望总工时范围
6. 人天单价（必填，单位：元/人天，例如 2200、3000、3500）
7. 是否有参考模板

> **人天单价必须由用户提供**，不使用任何默认值。如果用户未主动给出，使用 `vscode_askQuestions` 追问。

建议补充信息：

1. 报价主体
	- 默认：用户公司名称（需用户提供）
2. 税率
	- 默认沿用模板；无模板时单独确认
3. 交付周期
4. 角色与单价口径
	- 例如 PM/BA 与 PG/PT 是否同价，SA、QA 是否有独立单价
5. 是否需要同时输出 Python 生成脚本

## Step 2: 先找模板，再决定结构

优先在当前工作区搜索并复用现有模板，而不是从零随意生成。

### 模板搜索优先级

1. 同客户、同项目族的 Excel 或 Python 生成脚本
2. 同类型文档模板
	- 报价单、敏捷任务拆分、Sprint 计划、工时校验
3. 用户本次显式提供的附件或脚本
4. 如果仍然没有，再基于通用结构新建

### 客户名称自动匹配规则

在搜索模板前，优先根据客户名称锁定候选目录，再在目录内按输出模式挑选模板。

#### 当前工作区已知映射

> 以下为示例映射，实际使用时根据工作区中的客户目录自动发现。

1. 客户名称包含：`示例客户`、`ExampleCorp`
	- 优先目录：`ExampleCorp/`
	- 经典报价优先模板：
	  - `ExampleCorp/示例项目.工时报价.xlsx`
	- 敏捷拆分优先模板：
	  - `ExampleCorp/示例项目_敏捷任务拆分.xlsx`
	- Python 参考脚本：
	  - `ExampleCorp/示例项目_敏捷任务拆分.py`

#### 匹配流程

1. 先读取用户输入中的客户名称
2. 如果客户名称命中已知映射，先限定到对应目录搜索
3. 在对应目录中按输出模式筛选：
	- 经典报价：优先 `报价`、`工时报价`、`quotation`
	- 敏捷方式：优先 `敏捷任务拆分`、`Sprint`、`工时校验`
4. 如果同目录存在多个候选模板：
	- 优先用户显式提到的项目名
	- 其次优先最新日期版本
	- 再其次优先已有配套 Python 脚本的模板族
5. 如果客户名称未命中任何已知映射，再退回通用搜索策略

#### 使用原则

- 命中客户目录时，不要跨目录随意混用其他客户模板
- 同一客户目录下，经典报价和敏捷模板可以共用配色、公司抬头、税率口径，但仍应分别遵守各自模板结构
- 如果用户上传了新的客户模板，应优先以用户上传模板覆盖目录默认模板

### 搜索建议

- 先搜索客户名、项目名、关键词：报价、拆分、Sprint、工时、POC
- 同时查找：`.xlsx`、`.py`、`.html`、`.md`
- 如果已有 Python 脚本可生成 Excel，优先继承其表结构、颜色、字体、列宽、汇总方式

### 复用原则

- 保持原有模板的视觉风格和结构层级
- 保持客户名称、项目名称、币种、税率口径一致
- 不随意更换已成熟模板中的字段命名方式
- 如果模板存在明显数据错误，可以修正，但需在最终说明中指出

## Step 3A: 经典报价模式

适用于固定范围报价、模块报价、工时报价单。

### 经典报价默认模板

经典报价统一使用以下模板结构生成。该模板已内嵌在骨架脚本中。

> **脚本路径**：`references/classic-quotation-template.py`
> **品牌素材**：`brand-assets/company_logo.png`（请替换为您的公司 Logo）

### 模板画像

- 面向客户的正式 `Service Quotation / 服务报价单`
- 工作簿 **2 个工作表**：`项目报价` + `开发工作量`
- 左上角（A1:D6）嵌入公司 Logo（缩小显示 150×35px，原图 445×104px）
- 中英文双语字段，适合对外发送
- 统一人天单价（由用户提供），PM/BA 与 PG/PT 默认同价
- 无折扣行，只有"未税小计" + "含税合计"
- 税率默认 6%，金额格式 `¥#,##0.00`
- 字体：Sheet 1 项目报价用微软雅黑，Sheet 2 开发工作量用 DengXian（等线），浅蓝表头底色（`#D9EAF7`）

#### 推荐文件命名

- 输出目录：`output/{客户名称}.{项目名称}/`（每次新任务创建独立子文件夹）
- `{客户名称}.{项目名称}.工时报价 {YYYYMMDD}.xlsx`
- 若同项目存在多个工时版本，可追加 `_V2`、`_45MD` 等后缀

#### `项目报价` 页布局（A1:N26，共 26 行）

```
┌────────────────────────────────────────────────────────────┐
│ [Logo 445×104]  │ Service Quotation  │ {您的公司名称}    │
│  A1:D6          │ 服务报价单 E1:K6   │ L1:N6 (右对齐)     │
├─────────────────┴────────────────────┴────────────────────┤
│ To：                       │ From:                         │
│ Contact/联系人  Company    │ Contact  Email  Phone         │
│ Address  Email  Phone      │ Quo date  Due Date            │
├────────────────────────────────────────────────────────────┤
│ 项目服务价格 section header                                │
│ PM/BA: =E小计 * {单价} │  PG/PT: =F小计 * {单价}        │
│ 未税小计 =L15+L16     │  含税合计 =L17*1.06            │
├────────────────────────────────────────────────────────────┤
│ CR/Enhancement 费用（同结构，QTY留空）                     │
├────────────────────────────────────────────────────────────┤
│ Notes/备注：（备注1~7条，wrap_text）                       │
└────────────────────────────────────────────────────────────┘
```

**关键公式**：
- `H15` = `=开发工作量!E{小计行}` （PM/BA 人天引用）
- `H16` = `=开发工作量!F{小计行}` （PG/PT 人天引用）
- `L15` = `=H15*J15`，`M15` = `=ROUND(H15*J15+H15*J15*N15,2)`
- `L17` = `=L15+L16` （未税小计），`L18` = `=L17*1.06` （含税合计）

#### `开发工作量` 页布局

| 列 | 内容 |
|---|---|
| B | ID（按场景分组，同场景多行时垂直合并） |
| C | 用户场景（同场景多行时垂直合并） |
| D | 任务名称 |
| E | PM/BA/SA |
| F | PG/PT |
| G | 费用小计（同场景多行时垂直合并，公式按场景组汇总 `=SUM(E{组起}:F{组止})*单价`） |
| H | 备注 |

- **场景分组合并**：相同 `scenario` 的相邻行，B 列（ID）、C 列（用户场景）和 G 列（费用小计）垂直合并
- 小计行：`=SUM(E{start}:E{end})`
- 合计行：`=SUM(G{start}:G{end})`，标注"不含税价"

#### 默认口径与样式

| 参数 | 默认值 | 说明 |
|------|--------|------|
| 统一单价 | 用户提供（无默认值） | PM/BA 与 PG/PT 默认同价 |
| 税率 | 6% | 增值税 |
| 账期 | Net30天 | 报价日期 +30 |
| 字体 | 微软雅黑 / DengXian | Sheet1 微软雅黑，Sheet2 DengXian（等线） |
| 表头底色 | `#D9EAF7` | 浅蓝 |
| 金额格式 | `¥#,##0.00` | 两位小数 |
| Logo | `company_logo.png` | 显示 150×35px（原图 445×104） |

人天单价必须由用户提供，不使用任何硬编码默认值。税率和客户专属口径同样以用户输入为准。

#### Logo 自动注入

Logo 内嵌在 `brand-assets/company_logo.png`，脚本自动查找并缩小显示（150×35px）嵌入 A2 位置。
如未找到 Logo 文件，A1:D6 区域留空，不影响其他内容生成。

#### 经典报价完成标准

- 明细金额可回溯到人天和单价
- 项目报价页金额通过公式引用开发工作量页的小计
- Logo 正确嵌入左上角
- 文件名、抬头、公司名、客户名全部正确

### 经典报价内容整理规则

- 把需求拆成可报价模块，不要直接复制原始需求长文
- 优先使用"场景 + 任务名称 + PM/BA 人天 + PG/PT 人天"的结构
- 如果用户给的是结果导向需求，先推导实施模块
- 费用公式统一用 `=SUM(E:F)*单价`，不按角色差异定价
- 涉及税率时，明确"不含税 / 含税"口径
- 生成后检查总人天是否落在用户选择的工时范围内；若超出，应收缩范围、拆阶段或说明超出原因

## Step 3B: 敏捷方式模式

适用于 Sprint 排期、任务拆分、用户故事追溯、工时校验。

### 敏捷方式标准模板规则

如果用户提供了类似 `C-level_Conversations_Assistant_POC_敏捷任务拆分.xlsx` 的模板，或当前工作区存在同类模板，则优先按该模板族生成。

#### 模板画像

该类模板的核心特征是：

- 以 `Sprint总览` 作为首页，而不是单纯的任务表
- 至少包含 7 个工作表，形成“总览 + 明细 + 校验 + 图表 + 风险 + 追溯 + 仪式”的完整闭环
- 同时体现报价口径与敏捷执行口径
- 既能给管理层看总览，也能给项目团队看任务拆分细节

#### 推荐文件命名

- 输出目录：`output/{客户名称}.{项目名称}/`（每次新任务创建独立子文件夹）
- `{项目名称}_敏捷任务拆分.xlsx`
- `{客户名称}.{项目名称}_敏捷任务拆分.xlsx`
- 如果属于某个 POC 或阶段项目，可保留 `POC`、`Phase1`、`SprintPlan` 等关键词

#### 推荐工作表结构

1. `Sprint总览`
	- 项目概览 + 6 个左右 Sprint 的目标、周期、里程碑、验收标准
2. `任务明细拆分`
	- 核心任务表，按任务 ID、Sprint、分类、角色、人天、依赖、验收标准拆分
3. `工时校验`
	- 按 Sprint 汇总 PM/BA、PG/PT、费用、累计费用，并映射回报价项
4. `燃尽图`
	- 计划剩余人天、Sprint 交付人天、累计交付、完成比例、理想线
5. `风险追踪`
	- 风险描述、影响 Sprint、影响程度、发生概率、应对措施、责任人、状态
6. `用户故事追溯`
	- 用户故事与任务、Sprint、人天、费用的映射关系
7. `Scrum仪式`
	- Sprint Planning、Daily Standup、Sprint Review、Retrospective、Backlog Refinement、DoD

#### `Sprint总览` 推荐字段

- 项目名称
- 开发商 / 报价主体
- 客户
- 迭代周期
- 总周期
- 方法论
- 报价总额（不含税）
- 报价总额（含税）
- 税率
- PM/BA 人天
- PG/PT 人天
- 总人天

Sprint 总览表推荐列：

1. Sprint
2. 名称
3. 周期
4. Sprint目标
5. PM/BA 人天
6. PG/PT 人天
7. 费用小计（不含税）
8. 交付里程碑
9. 验收标准

#### `任务明细拆分` 推荐列

1. 任务ID
2. Sprint
3. 报价ID
4. 分类
5. 子项
6. 任务名称
7. 任务描述
8. 负责角色
9. PM/BA 人天
10. PG/PT 人天
11. 费用（不含税）
12. 优先级
13. 前置依赖
14. 用户故事ID
15. 验收标准
16. 状态

#### `工时校验` 推荐列

1. Sprint
2. PM/BA 人天
3. PG/PT 人天
4. 人天合计
5. 费用（不含税）
6. 累计费用
7. 对应报价ID
8. 校验说明

并建议追加一个“报价工作量 → Sprint 映射对照”区块，用于把报价模块映射回 Sprint。

#### `燃尽图` 推荐列

1. 时间节点
2. 计划剩余人天
3. Sprint交付人天
4. 累计交付人天
5. 完成比例
6. PM/BA 累计
7. PG/PT 累计
8. 累计费用（不含税）
9. 理想线

#### `风险追踪` 推荐列

1. 风险ID
2. 风险描述
3. 影响Sprint
4. 影响程度
5. 发生概率
6. 应对措施
7. 责任人
8. 状态
9. 更新日期

#### `用户故事追溯` 推荐列

1. 用户故事ID
2. 用户故事描述
3. 关联任务ID
4. 关联Sprint
5. PM/BA 人天
6. PG/PT 人天
7. 费用（不含税）

#### `Scrum仪式` 推荐列

1. 仪式名称
2. 频率
3. 时长
4. 参与人
5. 目的
6. 输出物

并建议在该页追加 `Definition of Done` 清单。

#### 样式与视觉规则

- 主题色以商务蓝系为主，深蓝表头、中蓝汇总、浅蓝副标题
- 默认字体沿用微软雅黑
- 主表头白字深底，正文使用浅灰斑马纹
- 每个 Sprint 可使用单独的浅色底区分行块
- 优先级推荐：`P0` 红色、`P1` 橙色、`P2` 黄色
- 金额统一 `¥#,##0`
- 建议启用冻结窗格与筛选

#### 敏捷方式完成标准

- Sprint 总览、任务明细、工时校验三者数据一致
- 总人天、总费用与报价口径对齐
- 每个 Sprint 都有目标、里程碑、验收标准
- 每个核心任务都有责任角色、依赖和验收标准
- 风险、追溯、Scrum 仪式页至少保留基础结构，不能只交一个任务表

### 推荐输出结构

1. Sprint 总览
	- Sprint 名称、周期、目标、交付里程碑、验收标准
2. 任务明细拆分
	- 任务 ID、Sprint、分类、子项、任务名称、描述、角色、人天、优先级、依赖、状态
3. 工时校验
	- 按 Sprint 汇总 PM/BA、PG/PT、费用、累计费用
4. 可选工作表
	- 燃尽图、风险追踪、用户故事追溯、Scrum 仪式

### 敏捷拆分规则

- 先按阶段分 Sprint，再在 Sprint 内分任务
- 每个 Sprint 应包含目标、里程碑、验收标准
- 每个任务都尽量具备：依赖、责任角色、验收标准、状态
- 拆分结果必须能回溯到原始需求或报价项
- 任务粒度以“便于排期和验收”为准，避免过粗或过碎
- 生成后检查总人天是否落在用户选择的工时范围内；若超出，应调整 Sprint 数量、任务深度或明确说明原因

## Step 4: 生成方式选择

根据上下文选择生成方式：

### 直接生成 Excel

适用于：

- 结构简单
- 当前任务只需要交付 `.xlsx`
- 不要求后续大规模复用脚本

### 生成 Python 脚本再输出 Excel

优先适用于：

- 已有 openpyxl 模板脚本可参考
- 需要大量格式控制
- 需要后续迭代复用
- 需要多工作表、图表、复杂样式或校验逻辑

当工作区已有类似 Python 脚本时，优先沿用其写法和样式约定。

### 推荐复用脚本骨架

当需要快速生成新脚本时，优先读取并复制以下模板骨架，再替换其中的占位数据：

- 经典报价脚本骨架：[references/classic-quotation-template.py](./references/classic-quotation-template.py)
- 敏捷拆分脚本骨架：[references/agile-sprint-template.py](./references/agile-sprint-template.py)
- 标准参数说明：[references/parameter-standard.md](./references/parameter-standard.md)

使用原则：

1. 如果是对客正式报价，优先从经典报价骨架开始
2. 如果是 Sprint 任务拆分、排期、追溯、风险管理，优先从敏捷拆分骨架开始
3. 如果工作区已有客户专属脚本，先参考客户脚本，再回落到骨架模板
4. 骨架中的公司名、税率、单价、字段文案都允许按项目覆盖，但不要改坏公式关系和整体结构

### 标准占位参数

为了降低每次生成脚本时的改动范围，优先使用统一参数接口：

- 通用参数：`output_file`、`project_name`、`customer_name`、`vendor_name`、`template_source`、`quote_date`、`tax_rate`
- 经典报价优先补充：`role_rates`、`change_request_rates`、`sales_contact`、`customer_contact`
- 敏捷拆分优先补充：`iteration_cycle`、`duration_text`、`amount_ex_tax`、`amount_inc_tax`、`pm_days_total`、`pg_days_total`

如果客户模板需要新增字段，优先在标准参数的基础上做扩展，而不是随意改名或分裂成另一套命名体系。

## Step 5: Excel 设计与样式要求

生成内容必须兼顾商务美观与可维护性。

### 通用要求

- 标题层级清晰，字体、底色、边框统一
- 冻结表头、设置筛选、合理列宽、启用自动换行
- 金额、税率、人天采用统一数字格式
- 汇总区域突出显示
- 客户可直接用于汇报或交付，不要生成“开发草稿感”过重的表格

### 美观要求

- 优先复用模板已有主题色
- 无模板时采用商务蓝系或与客户品牌相近的克制风格
- 不使用杂乱高饱和色块
- 表格密度适中，保证打印与屏幕查看都清晰

### 安全与严谨要求

- 不凭空捏造客户敏感信息
- 金额、人天、税率、总计必须可追溯
- 如果基于估算，应明确标注为“预估”或“假设”
- 对外文档避免出现内部调试字段或无意义注释

## Step 6: 校验清单

生成完成后至少检查以下内容：

1. 客户名称、项目名称是否正确
2. 输出模式是否与用户选择一致
3. 总人天是否落在用户选择的工时范围内
4. 人天合计、金额合计、税额、含税金额是否正确
5. Sprint 与任务分配是否前后一致
6. 样式是否与参考模板一致或至少保持商务统一
7. 工作表名称、筛选、冻结窗格、列宽是否可用
8. 如使用公式，确保无 `#REF!`、`#DIV/0!`、`#VALUE!` 等错误

## Step 7: 最终交付说明

完成后向用户明确说明：

1. 采用的是经典报价还是敏捷方式
2. 参考了哪些模板或脚本
3. 用户选择的总工时范围，以及最终总人天是否落在该范围内
4. 输出文件路径
5. 若有关键假设、缺失信息或人工估算项，需要单独列出

## 触发示例

- 帮我做一个给示例客户的经典报价 Excel
- 根据这个需求做一个敏捷任务拆分，参考当前工作区模板
- 帮我生成一份工时报价单
- 这个项目你帮我先判断应该走经典报价还是敏捷方式，再生成 Excel

## 完成标准

- 用户完成了模式选择，或用户已明确指定模式
- 输出文件已生成
- 模板来源清楚
- 金额/工时/Sprint 数据校验完成
- 最终表格可直接用于商务沟通或内部评审

