Documents

jackyshen-gen-quotation

Try it

生成专业PDF报价单、培训提案和商业文档。当用户提及报价单、报价、提案、培训方案、商业文档、生成PDF,或提供培训服务、咨询费用、定价详情时触发。支持中英文内容。

What it does

从自然语言、Markdown 或结构化数据生成品牌一致、风格专业的 PDF 报价单和培训提案。 始终使用 中的 Python 脚本,不要重写 Node.js 或 JavaScript 脚本。 Usage: 中间渲染模版文件和最终输出都必须在当前工作路径下的

The skill document

报价单 & 商业文档生成器

从自然语言、Markdown 或结构化数据生成品牌一致、风格专业的 PDF 报价单和培训提案。 始终使用 scripts/render_quotation.py 中的 Python 脚本,不要重写 Node.js 或 JavaScript 脚本。 Usage: python scripts/render_quotation.py output/quotation_data.json templates/modern/quotation.html output/quotation.pdf 中间渲染模版文件和最终输出都必须在当前工作路径下的 ./output

核心流程

用户输入(自然语言 / Markdown / 结构化数据)
                ↓
    LLM 结构化提取
                ↓
  QuoteDocument Schema (Pydantic)
                ↓
     Jinja2 模板渲染
                ↓
        HTML 输出
                ↓
      Playwright PDF
                ↓
        PDF 输出

品牌主题:UPerform

主色: #083A67(深海蓝 Navy) 辅色: #4F82BA(钢蓝 Steel Blue) 点缀色: #FFFFFF(白色 White) 背景色: #FFFFFF(白色)

Logo 位置:页面右上角。

步骤一 — 识别文档类型

根据原始输入自动判断生成的类型,如果不确定,询问用户:"请确认文档类型"

类型"doc_title"值关键字段
quotation"报价单 / Quotation"customer_company, pricing_items, total, payment_terms
outline"培训大纲 / Outline"outline, modules, objectives
mixed"培训方案及报价 / Proposal"两者兼有

不明确时,默认为 mixed。

步骤二 — 收集信息

按顺序收集以下字段,如有缺失请询问用户。

任何类型都要有的必需信息

  1. 我司信息

    • 公司名称 company_name ("优普丰AI敏捷创新管理咨询")
    • 地址 company_address ("Room A2207, 333 Suhong Road, Minhang District, Shanghai")
    • 电话 company_tel ("+86-21-6380-9913")
    • 邮箱 company_email ("service@uperform.cn")
    • 口号 company_slogan ("Your AI & Agile Organization Performance Partner")
    • 品牌 logo_path(默认填 logo.png,脚本会自动在 skill 目录下查找)
  2. 客户信息

    • 客户名称 customer_name
    • 联系人 contact_person (可选)
  3. 文档信息

    • 文档标题 doc_title
    • doc_type: "quotation"(必须显式声明)
    • 日期 quotation_date (YYYY/M/D)

quotation类型特有的必需信息

  1. 文档信息
    • 报价单号 quotation_no (格式: QL-YYYYMMDD-序号)
  2. 报价项目 (至少1项)
    • 服务名称 service_name
    • 单价 unit_price (CNY)
    • 数量 quantity
    • 单位 unit (天/人/次/项)
    • 分类 category: training | travel | interview | consulting | material | other
  3. 汇总信息
    • 小计 subtotal
    • 税率 tax_rate (如: 6%)
    • 税费 tax_amount
    • 总计 total_amount
    • 币种 currency (默认 CNY)
    • 含税否 tax_included (可选)
  4. 付款条款
    • 付款方式 payment_method (可选)
    • 付款阶段 payment_schedule (可选)
  5. 有效期
    • 有效至 valid_until (默认为当前日期之后的第90天)
  6. 签章信息
    • 账户名称 account_name "上海优普丰企业管理有限公司"
    • 开户行 bank_name "第一银行南京路支行"
    • 银行账号 account_number "0000"
  7. 备注
    • Please keep the discounted price confidentially to any third party.
    • 此优惠价请对第三方高度保密。
    • 常规培训时间: 9:00am-5:00pm, 1.5小时午餐休息。
    • Regular duration: 9:00am to 5:00pm with 1.5 hour lunch break on each days.
    • 该报价单覆盖了教材费等费用。
    • Quotation covers course materials etc.

outline类型的必需信息

  1. 课程大纲 (CourseOutline) — 课程标题 title
    • modules[]
    • learning_objectives[]
    • target_audience[]

可选字段

  • 备注 notes[]
  • 品牌配置 branding{logo_path: 填 logo.png 即可,脚本会自动在 skill 目录下查找, primary_color, secondary_color, accent_color}

步骤三 — 按 QuoteDocument Schema 组织数据

输出必须匹配以下 Schema 的结构化 JSON:

QuoteDocument:
  company: CompanyInfo         # 供方信息
  customer: CustomerInfo       # 需方信息
  quotation: QuotationInfo     # 文档基本信息
  doc_type: str               # "quotation" | "outline" | "mixed" — 控制模板条件渲染
  pricing_items: list[PricingItem]  # 报价明细(doc_type != "outline" 时显示)
  pricing_summary: PricingSummary  # subtotal, tax_rate, tax_amount, total_amount, currency, tax_included
  payment_terms: PaymentTerms  # 付款条款
  tax: TaxInfo                # 税费
  validity: ValidityInfo      # 有效期
  outline: CourseOutline | None  # 课程大纲(doc_type != "quotation" 时显示)
  notes: list[str] = []      # 备注
  signature: SignatureInfo   # 签章信息(doc_type != "outline" 时显示)
  branding: BrandingConfig   # 品牌配置

PricingItem

PricingItem:
  category: str       # training | travel | interview | consulting | material | other
  service_name: str  # 服务名称
  unit_price: float  # 单价
  quantity: float    # 数量
  unit: str          # 天/人/次/项
  days: float | None # 天数(可选)
  subtotal: float    # 小计
  remarks: str | None # 备注(可选)

CourseOutline (可选)

CourseOutline:
  title: str
  modules: list[CourseModule]
  learning_objectives: list[str] = []
  target_audience: list[str] = []

CourseModule:
  module_title: str
  duration: str | None  # 如 "2小时"
  topics: list[str]
  exercises: list[str] = []

CompanyInfo

CompanyInfo:
  name: str           # 公司名称
  address: str        # 地址
  tel: str            # 电话
  email: str | None   # 邮箱(可选)
  slogan: str | None  # 口号(可选)

CustomerInfo

CustomerInfo:
  name: str                 # 客户名称
  contact_person: str | None  # 联系人(可选)

PricingSummary

PricingSummary:
  subtotal: float     # 小计
  tax_rate: float     # 税率(默认 0)
  tax_amount: float   # 税费(默认 0)
  total_amount: float # 总计(必填,模板依赖此字段)
  currency: str       # 币种(默认 "CNY")
  tax_included: bool  # 含税否(默认 false)

PaymentTerms

PaymentTerms:
  payment_method: str | None   # 付款方式(如"银行转账")
  payment_schedule: str | None # 付款阶段(如"课程结束后结算")

ValidityInfo

ValidityInfo:
  valid_until: str  # 有效期,格式 YYYY/M/D(默认当前日期+90天)

SignatureInfo

SignatureInfo:
  account_name: str  # 账户名称
  bank_name: str     # 开户行
  account_number: str # 银行账号

BrandingConfig

BrandingConfig:
  logo_path: str  # 填 "logo.png",脚本自动在 skill 目录下查找
  primary_color: str   # 主色(默认 #083A67)
  secondary_color: str # 辅色(默认 #4F82BA)
  accent_color: str    # 点缀色(默认 #FFFFFF)

步骤四 — Jinja2 渲染为 HTML → PDF

使用 Jinja2 模板方式。禁止 LLM 直接生成 HTML。

模板路径: templates/modern/quotation.html 渲染后的模版路径: output/quotation_output.html

模板使用 UPerform 品牌主题:

  • 页眉:深海蓝 (#083A67) + 白色背景
  • 强调线:深海蓝 (#083A67)
  • Logo:右上角
  • 客户区域:白色背景 + 深海蓝边框
  • 备注区域:白色背景 + 深海蓝边框
  • 银行账户区域:白色背景 + 深海蓝边框
  • 所有文字:黑色 (#1a1a1a) + 白色背景
  • 字体:宋体 (SimSun) 用于中文
  • 内容区域:左右各 20% 边距

核心规则: LLM 输出 JSON → JSON 传入 Jinja2 → Jinja2 生成 HTML → Playwright 渲染 PDF。LLM 绝不直接写 HTML。

步骤五 — 输出格式

默认输出:PDF 文件,通过 Playwright page.pdf() 生成。

仅预览 HTML 时,使用 html 输出。

快速开始模板

当用户说"生成报价单"或类似内容时,回复:

好的,我来帮您生成专业报价单。

请提供以下信息(可以一次性全部提供,也可以逐项回答):

1. **客户信息** — 客户名称、公司名
2. **服务项目** — 培训/咨询内容、人数、天数、单价
3. **文档标题** — 报价单标题
4. **报价日期** — YYYY/M/D
5. **付款信息** — 银行账户信息(可选)

分类参考

category中文示例
training培训讲师授课、培训课程
travel差旅讲师差旅、交通住宿
interview访谈前期调研、访谈
consulting咨询咨询服务、顾问费
material材料教材、设计物料
other其他其他费用

文档类型条件渲染

模板根据 doc_type 字段决定显示哪些区块:

字段quotationoutlinemixed
报价明细 pricing_items✅❌✅
银行账户 signature✅❌✅
课程大纲 outline❌✅✅
备注 notes✅✅✅

示例结构

quotation 类型:

公司: 上海优普丰企业管理有限公司
客户: 第一食品公司
日期: 2026/5/28
doc_type: "quotation"

报价项目:
| 项目 | 时长 | 人数 | 单价 | 小计 |
|------|------|------|------|------|
| 变革管理敏捷项目培训 | 2天 | 30人以内 | 45,000.00/天 | 90,000.00 |
| 课前访谈调研(线上) | 0.5天 | — | — | 10,000.00 |
| 讲师差旅 | 2天 | — | — | 10,000.00 |

共计: 110,000.00 CNY

备注:
- 培训时间: 9:00am-5:00pm, 1.5小时午餐
- 报价含讲师差旅、课程费、教材费等


outline 类型:

公司: 上海优普丰企业管理有限公司
客户: 第一食品公司
日期: 2026/5/28
doc_type: "outline"

课程目标:
1. 破冰融合——通过互动活动,促进ABC项目组跨职能成员相互认识、建立信任
2. 激活知识——基于ABC项目真实场景,演练敏捷项目管理工具
3. 建立共识——运用ADKAR变革管理模型,识别项目当前所处阶段

课程大纲:
模块一:第一天:敏捷项目管理实战演练(9:00-17:00)
- 开场与破冰
- 项目挑战共识
- 敏捷项目管理框架回顾
...

模块二:第二天:变革管理与项目推进共识(9:00-16:00)
...

重要原则

  1. LLM 输出 JSON,不输出 HTML — 样式全部由模板控制
  2. Schema 是数据源 — 所有输入必须映射到 QuoteDocument
  3. doc_type 控制条件渲染 — 必须显式声明 "quotation" | "outline" | "mixed",模板据此显示/隐藏对应区块
  4. 品牌一致性 — Logo 右上角、深蓝页眉、蓝色点缀。logo_path 填 logo.png 即可,脚本会自动在 skill 目录下查找。
  5. 中英双语 — 单文档支持中文和英文
  6. PDF 是最终输出 — 使用 Playwright 将 HTML 转为 PDF
  7. 禁止直接注入 CSS — 所有样式来自模板
  8. 报价默认是不含税 - 不要主动增加税,或在备注里提到是否含税、税率、税额等任何税务相关信息。但如果用户明确要求含税报价,则:
    • 设置 pricing_summary.tax_included = true
    • 填入 pricing_summary.tax_rate(如 6,表示 6%)和 pricing_summary.tax_amount
    • 模板会自动在「报价项目」表格之后、总计行之前,渲染两行:税率 / Tax Rate、税费 / Tax Amount
    • 税前金额 = 各 pricing_items 小计之和(即 subtotal),税后金额 = 总计行(已显示)
    • 税务信息只能出现在金额汇总表格中,禁止写入 REMARKS / 备注段落

错误处理

  • 缺少必填字段 → 明确询问用户
  • 分类不明确 → 请用户确认分类
  • 模板缺失 → 回退到基础 HTML 结构
  • 解析失败 → 展示原始文本并请用户修正

Related skills

Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.

by nssa.io1.0k installs47 stars

Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.

by johnpatternai22 installs8 stars

Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.

by Iván855 installs69 stars

Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.

by Iván559 installs18 stars

Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.

by fly0pants4.3k installs296 stars

More from mebusw

Browse all skills

Manage scheduled Zoom meetings, cloud recordings, and account users from agent workflows via Server-to-Server OAuth.

by mebusw21 installs1 stars

Use when user asks to "generate workshop outline", "create training agenda", "design course structure", "build workshop schedule", or requests help planning...

by mebusw23 installs1 stars

Generate engaging short video scripts (30s-3min) for social media platforms like WeChat Channels, Douyin, Xiaohongshu, TikTok, and Reels. Use when user asks...

by mebusw33 installs

Use when user asks to "write WeChat article", "create 公众号文章", "write media content", or needs engaging articles for WeChat Official Accounts. Applies Pyramid...

by mebusw27 installs

Use Playwright via Bash `exec` tool (not the built-in browser tool) to fetch GasBuddy fuel prices for a target city/area (especially Toronto/North York), and...

by mebusw12 installs

Audit and improve existing Agent Skills (SKILL.md files) against the agentskills.io standard. Use this skill whenever the user wants to optimize, polish, imp...

by mebusw6 installs