refactor: 通用技能按类别拆分为独立目录

skills/ → skills-dev(9), skills-req(10), skills-ops(4),
skills-integration(8), skills-biz(4), skills-workflow(7)

generate-marketplace.py 改为自动扫描所有 skills-* 目录。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-14 11:31:58 +10:30
parent ea266e9cce
commit 712063071c
170 changed files with 341 additions and 346 deletions

View File

@@ -0,0 +1,8 @@
{
"name": "biz-contract-plugin",
"description": "商务合同撰写。支持多种合同类型:软件订阅合同、软件定制开发合同、物流合同、销售服务合同、贸易合同等。当用户提到合同、协议、签约、合作协议相关任务时自动激活。",
"version": "1.0.0",
"author": {
"name": "qiudl"
}
}

View File

@@ -0,0 +1,742 @@
---
name: biz-contract
description: 商务合同撰写。支持多种合同类型:软件订阅合同、软件定制开发合同、物流合同、销售服务合同、贸易合同等。当用户提到合同、协议、签约、合作协议相关任务时自动激活。
---
# 商务合同撰写技能 (biz-contract)
## 概述
本技能用于辅助商务合同的撰写与管理,支持多家公司主体、多种合同类型。
---
## 用户公司信息
### 公司主体列表
| 公司简称 | 公司全称 | 纳税人识别号 | 地址 | 联系电话 | 法定代表人 |
|----------|----------|--------------|------|----------|------------|
| 智慧云彩 | 北京智慧云彩电子商务科技有限公司 | 91110114MA004M80XX | 北京市海淀区丰智东路13号院1号楼1层101 | - | - |
| 欢乐宿 | 北京欢乐宿供应链科技有限公司 | 91110113MACWJKYU8P | 北京市顺义区军营南街10号院3幢3层327室 | - | - |
| 对丝 | 北京对丝信息技术有限公司 | 91110113MAE4XXHR5E | 北京市顺义区军营南街10号院3幢3层3216室 | - | - |
| 妗晨 | 重庆妗晨工贸有限公司 | 91500104MA7EJTPA6D | 重庆市大渡口区跳磴镇海康路106号1-1 | 15213397998 | - |
| 名风 | 北京名风新能源科技有限公司 | 91110106092440790K | 北京市密云区西田各庄镇雁密路99号601室-3509集群注册 | - | 魏小健 |
| 鸿侨 | 沈阳鸿侨物流有限公司 | 91210113MADBXPU93P | 辽宁省沈阳市沈北新区蒲河路49-2号1-29-2 | 15567339320 | 禚子乔 |
### 开户信息
| 公司简称 | 开户银行 | 银行账号 |
|----------|----------|----------|
| 智慧云彩 | 招商银行股份有限公司北京立水桥支行 | 110922001210512 |
| 欢乐宿 | 中国工商银行北京南十里支行 | 0200206709200036024 |
| 对丝 | 招商银行股份有限公司北京顺义支行 | 110961225610001 |
| 妗晨 | 中国农业银行股份有限公司重庆大渡口天安支行 | 31230401040004386 |
| 名风 | 中国建设银行北京黄亦路支行 | 11001181700052501668 |
| 鸿侨 | 中国建设银行股份有限公司沈阳辉山支行 | 21050149004200001104 |
---
## 支持的合同类型
| 类型 | 说明 | 典型场景 |
|------|------|----------|
| 软件订阅合同 | SaaS 软件服务订阅 | 云服务、在线系统 |
| 软件定制开发合同 | 软件外包开发 | 项目制开发 |
| 物流合同 | 物流运输服务 | 货运、仓储 |
| 销售服务合同 | 产品销售与服务 | 商品买卖 |
| 贸易合同 | 商品贸易 | 进出口、批发 |
| 技术服务合同 | 技术咨询、支持 | IT 服务 |
| 保密协议 (NDA) | 信息保密 | 合作前签署 |
---
## 合同撰写流程
```
1. 确定合同类型
├── 识别业务场景
├── 选择合同模板
└── 确定双方主体
2. 收集合同要素
├── 甲方/乙方信息
├── 标的物/服务内容
├── 价款与支付方式
├── 履行期限
└── 特殊条款需求
3. 生成合同草稿
├── 套用模板
├── 填充具体内容
└── 调整条款
4. 审核与完善
├── 法律合规检查
├── 风险条款审查
└── 最终定稿
```
---
## 合同模板
### 1. 软件订阅合同 (SaaS)
```markdown
# 软件订阅服务合同
**合同编号**: [自动生成或手填]
**甲方(服务提供方)**: [公司全称]
统一社会信用代码: [代码]
地址: [地址]
法定代表人: [姓名]
**乙方(订阅方)**: [公司全称]
统一社会信用代码: [代码]
地址: [地址]
法定代表人: [姓名]
---
鉴于甲方拥有 [软件名称] 的合法运营权,乙方有意订阅使用该软件服务,双方本着平等互利的原则,经友好协商,达成如下协议:
## 第一条 软件服务内容
1.1 软件名称:[软件名称]
1.2 服务内容:[功能模块描述,或"详见系统操作手册"]
1.3 服务方式SaaS 云服务模式,乙方通过互联网访问使用
1.4 账号数量:[数量] 个用户账号
## 第二条 服务期限
2.1 服务期限:自 [起始日期] 至 [结束日期]
2.2 续约条款:合同期满前 [30] 日,双方均未提出书面异议的,本合同自动续期 [1] 年,届时服务费按届时标准执行
## 第三条 服务费用与支付
3.1 服务费用:
- 月付标准:人民币 [金额] 元/月
- 年付标准:人民币 [金额] 元/年
3.2 支付方式:[年付/月付/季付]
3.3 付款时间:乙方应于本合同签订后 [N] 个工作日内,在收到甲方开具的发票后,一次性支付服务费用
3.4 付款账户:
开户名称:[甲方公司全称]
开户银行:[银行名称]
银行账号:[账号]
## 第四条 甲方权利与义务
4.1 甲方应保证软件服务的稳定运行,年可用性不低于 99.5%
4.2 甲方应提供必要的技术支持和培训服务
4.3 甲方应对乙方的业务数据严格保密
4.4 甲方有权在乙方未按时付款时暂停服务
## 第五条 乙方权利与义务
5.1 乙方有权在服务期内正常使用软件服务
5.2 乙方应按约定及时支付服务费用
5.3 乙方不得将账号转让、出租给第三方
5.4 乙方应妥善保管账号密码,因保管不善造成的损失由乙方承担
## 第六条 数据安全与保密
6.1 甲方应采取合理的技术措施保护乙方数据安全
6.2 未经对方书面同意,任何一方不得向第三方披露本合同内容及对方商业秘密
6.3 保密义务在合同终止后 [2] 年内继续有效
## 第七条 违约责任
7.1 任何一方违反本合同约定,应向守约方支付合同总金额 [10]% 的违约金
7.2 因甲方原因导致服务中断超过 [24] 小时的,甲方应按日退还相应服务费
## 第八条 合同变更与解除
8.1 经双方协商一致,可以变更或解除本合同
8.2 乙方提前解约的,已付费用不予退还
8.3 甲方提前解约的,应退还乙方剩余期限的服务费用
## 第九条 争议解决
9.1 本合同的签订、履行、解释均适用中华人民共和国法律
9.2 双方因履行本合同发生争议,应友好协商解决;协商不成的,任何一方均可向甲方所在地人民法院提起诉讼
## 第十条 其他条款
10.1 本合同一式两份,双方各执一份,具有同等法律效力
10.2 本合同自双方签字盖章之日起生效
10.3 本合同未尽事宜,由双方另行协商签订补充协议
---
**甲方(盖章)**: **乙方(盖章)**:
法定代表人/授权代表: 法定代表人/授权代表:
日期: 日期:
```
---
### 2. 软件定制开发合同
```markdown
# 软件定制开发合同
**合同编号**: [编号]
**甲方(委托方)**: [公司全称]
**乙方(开发方)**: [公司全称]
---
## 第一条 项目内容
1.1 项目名称:[项目名称]
1.2 开发内容:[详细描述或附件《需求规格说明书》]
1.3 技术要求:[技术栈、性能指标等]
1.4 交付物:
- 软件源代码
- 部署文档
- 操作手册
- [其他]
## 第二条 开发周期
2.1 总工期:[N] 个工作日
2.2 里程碑:
| 阶段 | 内容 | 交付时间 |
|------|------|----------|
| 需求确认 | 需求规格说明书 | [日期] |
| 设计阶段 | 设计文档 | [日期] |
| 开发阶段 | 功能开发完成 | [日期] |
| 测试阶段 | 测试报告 | [日期] |
| 验收交付 | 全部交付物 | [日期] |
## 第三条 合同金额与支付
3.1 合同总金额:人民币 [金额] 元(大写:[大写金额]
3.2 支付方式:
- 合同签订后 [N] 日内,支付 [30]%,即 [金额] 元
- 需求确认后 [N] 日内,支付 [30]%,即 [金额] 元
- 验收通过后 [N] 日内,支付 [40]%,即 [金额] 元
## 第四条 验收标准
4.1 乙方完成开发后,应书面通知甲方验收
4.2 甲方应在收到通知后 [10] 个工作日内完成验收
4.3 验收标准以《需求规格说明书》为准
4.4 甲方逾期未验收且未提出书面异议的,视为验收通过
## 第五条 知识产权
5.1 定制开发的软件著作权归 [甲方/乙方/共有]
5.2 乙方保证交付的软件不侵犯任何第三方知识产权
## 第六条 质保与维护
6.1 免费质保期:验收通过后 [12] 个月
6.2 质保期内,乙方应免费修复软件缺陷
6.3 质保期后,双方可另行签订维护协议
## 第七条 违约责任
7.1 乙方逾期交付,每逾期一日,应向甲方支付合同总金额 [0.5]‰ 的违约金
7.2 甲方逾期付款,每逾期一日,应向乙方支付应付金额 [0.5]‰ 的违约金
## 第八条 其他条款
[参照标准条款]
---
**甲方(盖章)**: **乙方(盖章)**:
日期: 日期:
```
---
### 3. 物流服务合同
**物流服务增值税税率9%**
```markdown
# 物流服务合同
**合同编号**: [编号]
**甲方(托运方)**: [公司全称]
**统一社会信用代码**: [代码]
**地址**: [地址]
**联系电话**: [电话]
**乙方(承运方)**: [公司全称]
**统一社会信用代码**: [代码]
**地址**: [地址]
**法定代表人**: [姓名]
---
## 第一条 运输服务内容
1.1 服务类型:[整车运输/零担运输/仓储配送]
1.2 运输路线:[起点] 至 [终点]
1.3 货物类型:[货物描述]
## 第二条 服务期限
2.1 合同有效期:自 [起始日期] 至 [结束日期]
## 第三条 运费与结算
3.1 计费方式:[按重量/体积/件数/趟次]
3.2 运费标准:[具体标准]
3.3 结算周期:[月结/单结]
3.4 付款期限:甲方在收到乙方对账单并确认无误后 [N] 个工作日内支付运费
## 第四条 发票与税务
4.1 发票类型:增值税专用发票
4.2 税率9%(交通运输服务)
4.3 开票时间:乙方应在甲方付款前开具发票
4.4 发票内容:运输服务费
### 甲方开票信息(付款方)
- 名称:[甲方公司全称]
- 纳税人识别号:[税号]
- 地址、电话:[地址] [电话]
- 开户行及账号:[开户银行] [账号]
### 乙方开票信息(收款方)
- 名称:[乙方公司全称]
- 纳税人识别号:[税号]
- 地址、电话:[地址] [电话]
- 开户行及账号:[开户银行] [账号]
## 第五条 甲方权利与义务
5.1 如实申报货物名称、数量、重量
5.2 按约定及时支付运费
5.3 提供必要的装卸条件
## 第六条 乙方权利与义务
6.1 按时提货、送货
6.2 保证货物运输安全
6.3 提供运输单据和签收证明
6.4 按约定开具增值税专用发票
## 第七条 货损赔偿
7.1 因乙方原因造成货物损失,按货物实际价值赔偿,最高不超过运费的 [N] 倍
7.2 甲方应在签收时验货,当场提出异议
## 第八条 其他条款
[参照标准条款]
---
### 签章
| | 甲方 | 乙方 |
|---|---|---|
| 单位名称 | | |
| 法定代表人/授权代表 |(签字)|(签字)|
| 单位盖章 |(盖章处)|(盖章处)|
| 签订日期 | 年 月 日 | 年 月 日 |
```
#### 物流合同开票信息速查
| 公司简称 | 公司全称 | 纳税人识别号 | 开票地址电话 | 开户行及账号 |
|----------|----------|--------------|--------------|--------------|
| 妗晨 | 重庆妗晨工贸有限公司 | 91500104MA7EJTPA6D | 重庆市大渡口区跳磴镇海康路106号1-1 / 15213397998 | 中国农业银行重庆大渡口天安支行 31230401040004386 |
| 名风 | 北京名风新能源科技有限公司 | 91110106092440790K | 北京市密云区西田各庄镇雁密路99号601室-3509 / - | 中国建设银行北京黄亦路支行 11001181700052501668 |
| 鸿侨 | 沈阳鸿侨物流有限公司 | 91210113MADBXPU93P | 辽宁省沈阳市沈北新区蒲河路49-2号(1-29-2) / 15567339320 | 中国建设银行沈阳辉山支行 21050149004200001104 |
---
### 4. 销售服务合同
```markdown
# 销售服务合同
**合同编号**: [编号]
**甲方(销售方)**: [公司全称]
**乙方(购买方)**: [公司全称]
---
## 第一条 产品/服务内容
| 序号 | 名称 | 规格型号 | 单位 | 数量 | 单价(元) | 金额(元) |
|------|------|----------|------|------|------------|------------|
| 1 | | | | | | |
| 2 | | | | | | |
| **合计** | | | | | | **[总金额]** |
## 第二条 合同金额
2.1 合同总金额:人民币 [金额] 元(大写:[大写金额]
2.2 以上价格 [含/不含] 增值税
## 第三条 交付方式
3.1 交付时间:[日期]
3.2 交付地点:[地址]
3.3 交付方式:[送货上门/自提/物流]
## 第四条 付款方式
4.1 [全款预付/货到付款/分期付款]
4.2 付款账户:[账户信息]
## 第五条 验收标准
5.1 乙方应在收货后 [N] 日内完成验收
5.2 验收标准:[标准描述]
## 第六条 售后服务
6.1 质保期:[N] 个月
6.2 质保内容:[描述]
## 第七条 违约责任
[标准条款]
---
**甲方(盖章)**: **乙方(盖章)**:
日期: 日期:
```
---
### 5. 贸易合同
```markdown
# 贸易合同
**合同编号**: [编号]
**甲方(供货方)**: [公司全称]
**乙方(采购方)**: [公司全称]
---
## 第一条 货物明细
| 品名 | 规格 | 产地 | 单位 | 数量 | 单价 | 金额 |
|------|------|------|------|------|------|------|
| | | | | | | |
| **合计** | | | | | | |
## 第二条 质量标准
2.1 质量标准:[国标/行标/企标/样品]
2.2 检验方式:[抽检/全检]
## 第三条 包装要求
3.1 包装方式:[描述]
3.2 包装费用:[含在货款中/另计]
## 第四条 交货
4.1 交货时间:[日期]
4.2 交货地点:[地址]
4.3 运输方式:[描述]
4.4 运费承担:[甲方/乙方]
## 第五条 价款与支付
5.1 合同总价:人民币 [金额] 元
5.2 付款方式:[预付款比例、货到付款等]
5.3 发票类型:[增值税专用发票/普通发票]
## 第六条 验收与异议
6.1 验收期限:收货后 [N] 日内
6.2 异议期限:发现质量问题后 [N] 日内书面提出
## 第七条 违约责任
7.1 甲方逾期交货,每日按合同金额 [0.5]‰ 支付违约金
7.2 乙方逾期付款,每日按应付金额 [0.5]‰ 支付违约金
---
**甲方(盖章)**: **乙方(盖章)**:
日期: 日期:
```
---
## 合同要素检查清单
撰写合同时,确保包含以下要素:
### 基本要素
- [ ] 合同编号
- [ ] 合同标题
- [ ] 签约双方信息(全称、代码、地址、法人)
- [ ] 签订日期
### 核心条款
- [ ] 标的物/服务内容(明确、具体)
- [ ] 数量/规格
- [ ] 价款/费用
- [ ] 支付方式与时间
- [ ] 履行期限/服务期限
- [ ] 交付方式/地点
### 权责条款
- [ ] 甲方权利与义务
- [ ] 乙方权利与义务
- [ ] 验收标准
- [ ] 质保条款
### 风险条款
- [ ] 违约责任
- [ ] 争议解决方式
- [ ] 不可抗力
- [ ] 保密条款
### 其他
- [ ] 合同变更与解除
- [ ] 通知送达方式
- [ ] 合同份数
- [ ] 生效条件
- [ ] 签字盖章位置
---
## 使用说明
### 快速生成合同
向我描述合同需求,我会帮您生成合同草稿:
**示例输入**
> 拟定一份软件订阅合同北京智慧云彩为服务方重庆妗晨为订阅方软件是智云物流管理系统年费2.4万合同期1年到期自动续约
**我会输出**
- 完整的合同文本
- 需要补充的信息提示
- 风险提示(如有)
### 合同审核
您也可以提供合同文本让我审核,我会检查:
- 条款完整性
- 权责平衡性
- 法律风险点
- 用语规范性
---
## 注意事项
1. **本技能生成的合同仅供参考**,重要合同建议经法务/律师审核
2. 涉及大额交易、复杂条款的合同,建议专业法律意见
3. 请确保公司信息准确无误后再签署
4. 合同金额大写与小写应一致
5. 注意保留合同签署过程的证据
---
## 思源笔记集成(推荐)
合同文档优先保存到思源笔记,校对确认后再发布到云文档。
### 工作流程
```
合同技能生成内容 → 思源笔记(预览/校对) → 飞书云文档(正式发布)
```
### 笔记本配置
| 配置项 | 值 |
|--------|-----|
| 笔记本名称 | 商务合同 |
| 笔记本ID | `20260202080313-kjtgg1j` |
### 路径规范
```
/商务合同/
├── 物流合同/
│ ├── 妗晨-名风-2026
│ └── 妗晨-鸿侨-2026
├── 软件订阅合同/
│ └── 智慧云彩-xxx-2026
└── 贸易合同/
└── ...
```
路径格式:`/{合同类型}/{甲方简称}-{乙方简称}-{年份}`
### 使用示例
```python
from siyuan_api import SiYuanAPI
api = SiYuanAPI()
NOTEBOOK_ID = "20260202080313-kjtgg1j"
# 1. 创建合同到思源笔记
contract_md = generate_contract_markdown(...)
doc_id = api.upsert_doc(
NOTEBOOK_ID,
"/物流合同/妗晨-名风-2026",
contract_md
)
print(f"请在思源笔记中校对: {doc_id}")
# 2. 校对完成后,发布到飞书
api.publish_to_feishu(doc_id, "物流服务合同-妗晨与名风")
```
### 文档状态标记
| 状态 | 含义 |
|------|------|
| 📝 草稿 | 初始生成,待校对 |
| 🔍 校对中 | 正在审核内容 |
| ✅ 已确认 | 校对完成,可发布 |
| 🚀 已发布 | 已发布到云文档 |
---
## 与 ai-proj 集成
合同相关需求可创建到 ai-proj 系统:
```
类型: biz (业务类型)
分类: other
示例标题: 拟定 XXX 与 YYY 的软件订阅合同
```
合同完成后,可作为文档附件关联到对应需求。
---
## 飞书文档集成
本技能已集成飞书文档,可将合同直接创建到飞书云文档。
### 权限说明
**重要**:飞书文档默认对组织内权限是开放的,允许编辑。创建的合同文档在组织内成员均可查看和编辑。如需限制访问权限,请在飞书中手动调整文档权限设置。
### 可用工具
| 工具 | 功能 |
|------|------|
| `create_document` | 创建空白飞书文档 |
| `write_document` | 向已有文档写入内容 |
| `create_and_write_document` | 创建文档并写入内容(推荐) |
| `get_document_info` | 获取文档信息 |
### 使用示例
```
# 创建合同文档
使用 feishu-doc MCP 的 create_and_write_document 工具:
- title: "软件订阅服务合同-智慧云彩与妗晨"
- content: [Markdown 格式的合同内容]
- folder_token: [可选,指定文件夹]
```
### 获取文件夹 Token
1. 在飞书中打开目标文件夹
2. 复制 URL 中的 folder token格式如`fldcnXXXXXX`
3. 调用工具时传入 folder_token 参数
### 飞书输出格式规范
#### 开票信息表格
物流合同中的开票信息应使用**表格**格式展示,列宽配置:
| 配置项 | 值 | 说明 |
|--------|-----|------|
| 项目列宽 | 120px | 显示"名称"、"纳税人识别号"等标签 |
| 内容列宽 | 480px | 显示具体信息 |
```python
# 创建开票信息表格示例
from feishu_docx import FeishuDocx
docx = FeishuDocx()
doc = docx.create_document("物流服务合同")
# 创建表格4行2列指定列宽
table = docx.create_table(doc["document_id"], rows=4, cols=2, col_widths=[120, 480])
# 填充内容
docx.fill_table(doc["document_id"], table, [
["名称", "重庆妗晨工贸有限公司"],
["纳税人识别号", "91500104MA7EJTPA6D"],
["地址、电话", "重庆市大渡口区跳磴镇海康路106号1-1 / 15213397998"],
["开户行及账号", "中国农业银行重庆大渡口天安支行 31230401040004386"],
])
```
#### 签章格式
推荐使用**独立区块式**签章格式:
```
【甲 方】
单位名称:重庆妗晨工贸有限公司
法定代表人(或授权代表): (签字/盖章)
单位盖章:
签订日期: 年 月 日
─────────────────────────────────────────────────────
【乙 方】
单位名称:北京名风新能源科技有限公司
法定代表人(或授权代表): (签字/盖章)
单位盖章:
签订日期: 年 月 日
```
**特点**:甲乙双方独立区块,留白充足,便于盖章签字。
#### 物流合同税率
| 服务类型 | 税率 | 发票类型 |
|----------|------|----------|
| 交通运输服务 | 9% | 增值税专用发票 |
#### 默认存储路径
| 平台 | 路径 |
|------|------|
| 飞书云文档 | ai-proj/01运营 (folder_token: `C80gfkRnzlonQ5d4AhOcOACDnNg`) |
| 思源笔记 | 商务合同笔记本 /物流合同/{甲方简称}-{乙方简称}-{年份} |

View File

@@ -0,0 +1,8 @@
{
"name": "biz-ops-plugin",
"description": "商务运营技能。支持商业计划书(BP)撰写和商务合同起草。当用户提到商业计划书、BP、融资计划、商业模式、合同、协议、签约等相关任务时自动激活。",
"version": "1.0.0",
"author": {
"name": "qiudl"
}
}

View File

@@ -0,0 +1,178 @@
---
name: biz-ops
description: 商务运营技能。支持商业计划书(BP)撰写和商务合同起草。当用户提到商业计划书、BP、融资计划、商业模式、合同、协议、签约等相关任务时自动激活。
---
# 商务运营 (biz-ops)
## 一、商业计划书 (BP)
### 公司背景
| 项目 | 描述 |
|------|------|
| 公司定位 | 酒店供应链系统研发公司 |
| 核心能力 | 软件系统研发 + 供应链运营经验 |
| 商业模式 | 换房额度 → 供应链平台采购 → 交易佣金 |
**换房模式**:酒店提供换房额度 → 转化为平台采购额度 → 酒店消费 → 平台抽佣X%
### 标准 BP 结构10-15页
| 章节 | 页数 | 核心内容 |
|------|------|----------|
| 1. 封面 | 1 | 公司名称、Slogan、联系方式 |
| 2. 公司简介 | 1 | 一句话定位、发展历程、里程碑 |
| 3. 痛点与机会 | 1-2 | 行业痛点、市场机会、为什么是现在 |
| 4. 解决方案 | 2 | 产品/服务介绍、核心功能、价值主张 |
| 5. 商业模式 | 1-2 | 如何赚钱、收入来源、定价策略 |
| 6. 市场规模 | 1 | TAM/SAM/SOM酒店采购TAM 2000亿SOM 100亿 |
| 7. 竞争分析 | 1 | 竞争格局、差异化:软件+供应链双轮 |
| 8. 运营数据 | 1-2 | GMV、客户数、复购率、增长曲线 |
| 9. 团队介绍 | 1 | 核心成员、背景优势 |
| 10. 融资计划 | 1 | 金额、估值、用途研发40%/市场30%/运营20%/储备10% |
### 商业模式收入模型
| 收入来源 | 说明 |
|----------|------|
| 交易佣金 | 供应链交易抽佣 (3-8%) |
| SaaS 订阅费 | 系统使用年费 |
| 金融服务 | 供应链金融分润 |
| 增值服务 | 数据服务、营销服务 |
**Unit Economics**CAC / LTV健康值 LTV/CAC >3/ 毛利率 / 回本周期
### PPT 输出
生成路演 PPT 时,输出为单个 HTML 文件(全屏演示):
- 支持键盘翻页(← →、F 全屏、触摸滑动
- 配色:深色科技风 `#1a1a2e` 背景 + `#667eea` 主色
- 数据卡片 + 两栏布局 + 流程图组件
- 保存到桌面后 `open ~/Desktop/bp-presentation.html`
**PPT 设计原则**:一页一重点 / 大字标题48px+正文24px+/ 数据可视化 / 留白充足
---
## 二、商务合同
### 用户公司信息
| 公司简称 | 公司全称 | 纳税人识别号 | 地址 | 联系电话 | 法定代表人 |
|----------|----------|--------------|------|----------|------------|
| 智慧云彩 | 北京智慧云彩电子商务科技有限公司 | 91110114MA004M80XX | 北京市海淀区丰智东路13号院1号楼1层101 | - | - |
| 欢乐宿 | 北京欢乐宿供应链科技有限公司 | 91110113MACWJKYU8P | 北京市顺义区军营南街10号院3幢3层327室 | - | - |
| 对丝 | 北京对丝信息技术有限公司 | 91110113MAE4XXHR5E | 北京市顺义区军营南街10号院3幢3层3216室 | - | - |
| 妗晨 | 重庆妗晨工贸有限公司 | 91500104MA7EJTPA6D | 重庆市大渡口区跳磴镇海康路106号1-1 | 15213397998 | - |
| 名风 | 北京名风新能源科技有限公司 | 91110106092440790K | 北京市密云区西田各庄镇雁密路99号601室-3509集群注册 | - | 魏小健 |
| 鸿侨 | 沈阳鸿侨物流有限公司 | 91210113MADBXPU93P | 辽宁省沈阳市沈北新区蒲河路49-2号1-29-2 | 15567339320 | 禚子乔 |
### 开户信息
| 公司简称 | 开户银行 | 银行账号 |
|----------|----------|----------|
| 智慧云彩 | 招商银行股份有限公司北京立水桥支行 | 110922001210512 |
| 欢乐宿 | 中国工商银行北京南十里支行 | 0200206709200036024 |
| 对丝 | 招商银行股份有限公司北京顺义支行 | 110961225610001 |
| 妗晨 | 中国农业银行股份有限公司重庆大渡口天安支行 | 31230401040004386 |
| 名风 | 中国建设银行北京黄亦路支行 | 11001181700052501668 |
| 鸿侨 | 中国建设银行股份有限公司沈阳辉山支行 | 21050149004200001104 |
### 支持的合同类型
| 类型 | 典型场景 | 税率 |
|------|----------|------|
| 软件订阅合同 (SaaS) | 云服务、在线系统 | 6% |
| 软件定制开发合同 | 项目制开发 | 6% |
| 物流服务合同 | 货运、仓储 | **9%**(交通运输服务) |
| 销售服务合同 | 商品买卖 | 13% |
| 贸易合同 | 批发、进出口 | 13% |
| 技术服务合同 | IT 咨询 | 6% |
| 保密协议 (NDA) | 合作前签署 | - |
### 合同模板速查
#### SaaS 软件订阅合同核心条款
```
第一条 软件服务内容名称、模块、账号数、SaaS云服务模式
第二条 服务期限起止日期、到期前30日未异议自动续期
第三条 服务费用与支付(月付/年付标准、付款时间、付款账户)
第四条 甲方义务年可用性≥99.5%、技术支持、数据保密、逾期可暂停服务)
第五条 乙方义务(按时付款、禁止转让账号)
第六条 数据安全与保密保密义务合同终止后2年继续有效
第七条 违约责任(违约金=合同总额10%;服务中断>24小时按日退费
第八条 合同变更与解除(乙方提前解约已付费不退;甲方提前解约退剩余)
第九条 争议解决(甲方所在地法院)
```
#### 软件定制开发合同核心条款
```
第一条 项目内容(名称、开发内容/需求规格说明书、技术要求、交付物清单)
第二条 开发周期(总工期、里程碑:需求确认→设计→开发→测试→验收)
第三条 付款节点签约30%→需求确认30%→验收通过40%
第四条 验收标准收通知后10个工作日内逾期未验收视为通过
第五条 知识产权(归甲方/乙方/共有)
第六条 质保与维护免费质保期12个月
第七条 违约责任逾期交付合同额0.5‰/日逾期付款应付额0.5‰/日)
```
#### 物流服务合同核心条款
```
税率9%(交通运输服务增值税专用发票)
第一条 运输服务内容(整车/零担/仓储配送、路线、货物类型)
第二条 服务期限
第三条 运费与结算(计费方式、月结/单结、付款期限)
第四条 发票与税务9%增值税专用发票;开票时间:付款前)
第五条/六条 甲乙方权利义务
第七条 货损赔偿实际价值赔偿最高不超过运费N倍当场提出异议
```
**签章格式**(推荐独立区块式):
```
【甲 方】
单位名称:
法定代表人(或授权代表): (签字/盖章)
单位盖章:
签订日期: 年 月 日
─────────────────────────────────────────────
【乙 方】
...
```
### 合同要素检查清单
- [ ] 合同编号、标题、签订日期
- [ ] 双方全称、统一社会信用代码、地址、法人
- [ ] 标的物/服务内容(明确具体)
- [ ] 价款、支付方式与时间
- [ ] 履行期限/交付方式
- [ ] 验收标准、质保条款
- [ ] 违约责任(违约金比例)
- [ ] 争议解决方式
- [ ] 不可抗力、保密条款
- [ ] 合同份数、生效条件
### 文档存储
| 平台 | 路径/Token |
|------|------------|
| 飞书云文档 | ai-proj/01运营 (`C80gfkRnzlonQ5d4AhOcOACDnNg`) |
| 思源笔记 | 商务合同笔记本 ID: `20260202080313-kjtgg1j` |
思源路径规范:`/{合同类型}/{甲方简称}-{乙方简称}-{年份}`
工作流:合同技能生成内容 → 思源笔记(校对)→ 飞书云文档(正式发布)
---
## 注意事项
1. BP 数据必须真实可查证,敏感数据可用 [X] 占位
2. 合同金额大写与小写必须一致
3. **本技能生成的合同仅供参考**,重要合同建议经法务/律师审核
4. 公司信息确认无误后再签署

View File

@@ -0,0 +1,8 @@
{
"name": "biz-plan-plugin",
"description": "Plugin for biz-plan",
"version": "1.0.0",
"author": {
"name": "qiudl"
}
}

View File

@@ -0,0 +1,760 @@
---
name: biz-plan
description: 商业计划书撰写。支持融资BP、战略规划、商业模式设计等。当用户提到商业计划书、BP、融资计划、商业模式、战略规划相关任务时自动激活。
---
# 商业计划书撰写技能 (biz-plan)
## 概述
本技能用于辅助商业计划书的撰写与优化,特别适用于 B2B SaaS、供应链平台、产业互联网等领域。
---
## 公司背景(可定制)
### 核心信息
| 项目 | 描述 |
|------|------|
| 公司定位 | 酒店供应链系统研发公司 |
| 发展阶段 | 多轮融资,成熟期 |
| 核心能力 | 软件系统研发 + 供应链运营经验 |
| 资源优势 | 头部酒店集团资源 |
### 商业模式
```
┌─────────────────────────────────────────────────────────────┐
│ 平台商业模式 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ 换房额度 ┌──────────────┐ │
│ │ 酒店端 │ ──────────────────→ │ 供应链平台 │ │
│ │ │ ←────────────────── │ (集团总部) │ │
│ └──────────┘ 采购消费 └──────────────┘ │
│ │ │ │
│ │ 房间资源 │ 商品/服务 │
│ ↓ ↓ │
│ ┌──────────┐ ┌──────────────┐ │
│ │ 换房用户 │ │ 供应商 │ │
│ └──────────┘ └──────────────┘ │
│ │
│ 收入来源: 供应链交易服务佣金 │
│ 核心价值: 软件系统增强上下游粘性 │
└─────────────────────────────────────────────────────────────┘
```
---
## 商业计划书结构
### 标准融资 BP 结构10-15页
| 章节 | 页数 | 核心内容 |
|------|------|----------|
| 1. 封面 | 1 | 公司名称、Slogan、联系方式 |
| 2. 公司简介 | 1 | 一句话定位、发展历程、里程碑 |
| 3. 痛点与机会 | 1-2 | 行业痛点、市场机会、为什么是现在 |
| 4. 解决方案 | 2 | 产品/服务介绍、核心功能、价值主张 |
| 5. 商业模式 | 1-2 | 如何赚钱、收入来源、定价策略 |
| 6. 市场规模 | 1 | TAM/SAM/SOM、增长趋势 |
| 7. 竞争分析 | 1 | 竞争格局、差异化优势 |
| 8. 运营数据 | 1-2 | 关键指标、增长曲线、客户案例 |
| 9. 团队介绍 | 1 | 核心成员、背景优势 |
| 10. 融资计划 | 1 | 融资金额、估值、资金用途 |
---
## 各章节撰写指南
### 1. 封面
```
[公司 LOGO]
公司名称
——————————————
一句话 Slogan不超过20字
联系人XXX
电话XXX
邮箱XXX
[日期]
[保密声明]
```
### 2. 公司简介
**一句话定位模板**
> 我们是 [行业] 领域的 [产品类型],通过 [核心能力],帮助 [目标客户] 实现 [核心价值]。
**示例**
> 我们是酒店供应链领域的产业互联网平台,通过 SaaS 系统 + 供应链服务,帮助酒店集团降低采购成本、提升运营效率。
**发展历程**
| 时间 | 里程碑 |
|------|--------|
| 20XX年 | 公司成立,获得天使轮融资 |
| 20XX年 | 产品上线,首批客户签约 |
| 20XX年 | A轮融资GMV突破X亿 |
| 20XX年 | 签约X家头部酒店集团 |
### 3. 痛点与机会
**痛点分析框架**
```
行业痛点
├── 酒店端痛点
│ ├── 采购成本高、供应商分散
│ ├── 库存管理粗放
│ └── 缺乏数字化工具
├── 供应商端痛点
│ ├── 获客成本高
│ ├── 账期长、现金流压力
│ └── 缺乏稳定渠道
└── 行业痛点
├── 信息不对称
├── 交易效率低
└── 缺乏标准化
```
**市场机会**
- 政策利好:数字化转型、供应链金融政策
- 技术成熟SaaS、移动互联网、大数据
- 行业变革:酒店行业整合、集团化趋势
### 4. 解决方案
**产品矩阵**
| 产品 | 目标用户 | 核心功能 | 价值 |
|------|----------|----------|------|
| 酒店采购系统 | 酒店采购部 | 在线下单、供应商管理、成本分析 | 降本30% |
| 供应商平台 | 供应商 | 商品管理、订单处理、对账结算 | 获客成本降低50% |
| 集团管控系统 | 酒店集团 | 集采管理、数据分析、合规审计 | 管理效率提升 |
| 换房服务平台 | 企业/个人 | 房间预订、积分兑换 | 差旅成本优化 |
**技术架构**(简化版):
```
┌─────────────────────────────────────┐
│ 业务中台 │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │订单 │ │商品 │ │用户 │ │结算 │ │
│ └─────┘ └─────┘ └─────┘ └─────┘ │
├─────────────────────────────────────┤
│ 数据中台 │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │BI │ │算法 │ │数仓 │ │
│ └─────┘ └─────┘ └─────┘ │
└─────────────────────────────────────┘
```
### 5. 商业模式
**收入模型**
| 收入来源 | 说明 | 占比 |
|----------|------|------|
| 交易佣金 | 供应链交易抽佣 (X%) | XX% |
| SaaS 订阅费 | 系统使用年费 | XX% |
| 金融服务 | 供应链金融分润 | XX% |
| 增值服务 | 数据服务、营销服务 | XX% |
**单位经济模型**Unit Economics
| 指标 | 数值 | 说明 |
|------|------|------|
| CAC | ¥XXX | 获客成本 |
| LTV | ¥XXX | 客户生命周期价值 |
| LTV/CAC | X.X | 健康值 >3 |
| 毛利率 | XX% | |
| 回本周期 | X个月 | |
### 6. 市场规模
**TAM/SAM/SOM 分析**
```
┌────────────────────────────────────────┐
│ TAM: XXX亿 │
│ (Total Addressable Market) │
│ ┌────────────────────────────┐ │
│ │ SAM: XXX亿 │ │
│ │ (Serviceable Addressable) │ │
│ │ ┌──────────────────┐ │ │
│ │ │ SOM: XXX亿 │ │ │
│ │ │ (Serviceable │ │ │
│ │ │ Obtainable) │ │ │
│ │ └──────────────────┘ │ │
│ └────────────────────────────┘ │
└────────────────────────────────────────┘
```
**酒店供应链市场规模**(示例):
- 中国酒店行业规模:约 6000 亿
- 酒店采购市场TAM约 2000 亿
- 连锁/集团酒店采购SAM约 800 亿
- 可触达市场SOM约 100 亿
### 7. 竞争分析
**竞争格局**
| 类型 | 代表企业 | 优势 | 劣势 |
|------|----------|------|------|
| 传统供应商 | XX、YY | 客户关系、线下服务 | 数字化能力弱 |
| SaaS 厂商 | AA、BB | 技术能力强 | 缺乏供应链能力 |
| 互联网平台 | CC、DD | 流量、资金 | 行业理解不深 |
| **我们** | - | 软件+供应链双轮驱动 | - |
**差异化优势**
1. **行业 Know-how**:多年酒店供应链经验
2. **头部资源**XX家头部集团客户
3. **创新模式**:换房模式增强粘性
4. **技术壁垒**:自研系统,快速迭代
### 8. 运营数据
**关键指标**
| 指标 | 2023 | 2024 | 2025E | YoY增长 |
|------|------|------|-------|---------|
| GMV亿 | X | X | X | XX% |
| 收入(万) | X | X | X | XX% |
| 客户数 | X | X | X | XX% |
| 复购率 | X% | X% | X% | - |
**增长曲线**(用文字描述,实际 BP 用图表):
- 2022-2023产品打磨期种子客户验证
- 2024规模扩张期客户数 X 倍增长
- 2025加速增长期目标 GMV XX亿
**标杆客户案例**
> **XX酒店集团**X00家酒店
> - 合作前:采购分散,年采购成本 X 亿
> - 合作后:统一平台采购,成本降低 XX%
> - 换房模式:年换房 X 万间夜,转化采购额 XX 万
### 9. 团队介绍
**核心团队**
| 姓名 | 职位 | 背景 |
|------|------|------|
| XXX | CEO | XX酒店集团XX年XX大学MBA |
| XXX | CTO | 原XX公司技术总监XX年技术经验 |
| XXX | COO | 原XX供应链公司XX年运营经验 |
| XXX | CFO | 原XX投资XX年财务经验 |
**团队优势**
- 酒店行业背景:平均 X 年行业经验
- 技术能力XX 人研发团队
- 资源网络:覆盖 XX% 头部酒店集团
### 10. 融资计划
**本轮融资**
| 项目 | 内容 |
|------|------|
| 融资轮次 | X 轮 |
| 融资金额 | 人民币 XXX 万元 |
| 出让股份 | XX% |
| 投前估值 | 人民币 XXX 万元 |
| 资金用途 | 见下表 |
**资金用途**
| 用途 | 占比 | 说明 |
|------|------|------|
| 产品研发 | 40% | 核心系统升级、AI 能力建设 |
| 市场拓展 | 30% | 销售团队扩张、客户获取 |
| 运营投入 | 20% | 供应链能力建设、服务体系 |
| 储备资金 | 10% | 现金流储备 |
**里程碑规划**
| 时间 | 目标 |
|------|------|
| 融资后6个月 | 客户数达到 X 家GMV XX亿 |
| 融资后12个月 | 新产品上线,进入 X 个新区域 |
| 融资后18个月 | 实现盈亏平衡 |
---
## 行业专项模板
### 酒店供应链 BP 要点
**换房模式说明**
```
换房模式运作逻辑
─────────────────────────────────────────
1. 酒店提供房间资源
酒店 → 平台承诺年度换房额度如100万间夜
2. 平台转化为采购额度
换房价值 → 按比例转化为供应链采购额度
3. 酒店在平台消费
酒店使用额度 → 在供应链平台采购商品/服务
4. 平台获取佣金
供应链交易 → 平台抽取 X% 服务佣金
核心价值:
✓ 酒店:用闲置资源换取采购成本优化
✓ 平台:获得稳定交易额 + 服务佣金
✓ 供应商:获得优质渠道 + 稳定订单
```
### 供应链平台指标体系
| 指标类别 | 指标名称 | 说明 | 行业基准 |
|----------|----------|------|----------|
| 规模指标 | GMV | 平台交易总额 | - |
| | 活跃客户数 | 月活跃采购客户 | - |
| | SKU 数量 | 商品种类数 | - |
| 效率指标 | 订单转化率 | 询价到下单转化 | >15% |
| | 履约率 | 按时交付率 | >95% |
| | 客诉率 | 投诉订单占比 | <1% |
| 财务指标 | 佣金率 | 平台抽佣比例 | 3-8% |
| | 毛利率 | | 30-50% |
| | CAC Payback | 获客成本回收期 | <12月 |
---
## 使用说明
### 快速生成 BP
向我描述你的需求,我会帮你生成商业计划书内容:
**示例输入**
> 帮我写商业计划书第5章商业模式部分我们是酒店供应链平台主要收入来源是交易佣金和SaaS订阅费另外还有换房模式
**我会输出**
- 结构化的商业模式描述
- 收入模型分析
- 需要补充的数据清单
### BP 审核优化
你可以提供已有的 BP 内容让我帮你:
- 检查逻辑完整性
- 优化表达方式
- 补充行业数据
- 突出差异化优势
---
## 输出格式
### 支持的输出方式
| 方式 | 工具 | 说明 |
|------|------|------|
| Markdown | 直接输出 | 快速预览 |
| 飞书文档 | feishu skill | 在线协作 |
| Word/PDF | docx/pdf skill | 正式文件 |
| PPT | pptx skill | 路演演示 |
### 融资路演 PPT 结构
如需生成融资路演 PPT建议使用以下结构
1. 封面(公司名+Slogan
2. 问题(行业痛点)
3. 方案(产品价值)
4. 市场(规模机会)
5. 产品(功能展示)
6. 模式(如何赚钱)
7. 数据(业绩证明)
8. 竞争(差异优势)
9. 团队(核心成员)
10. 融资(计划用途)
---
## 注意事项
1. **数据真实性**BP 中的数据必须真实可查证
2. **保密性**:敏感数据可用 X 代替
3. **针对性**:根据投资人偏好调整侧重点
4. **简洁性**:每页一个核心信息点
5. **视觉化**:用图表代替大段文字
---
## 与其他技能协同
| 技能 | 协同场景 |
|------|----------|
| biz-contract | 融资后签署投资协议 |
| feishu | 将 BP 保存到飞书文档 |
| data-excel | 财务模型和数据分析 |
---
## PPT 设计能力
本技能支持生成商业计划书 PPT输出为 HTML 格式的演示文稿,可直接在浏览器中全屏演示,也可转换为 PDF 或截图使用。
### PPT 输出方式
当用户要求生成 PPT 时,使用以下方式:
1. **HTML 演示文稿**(推荐)
- 生成单个 HTML 文件
- 支持全屏演示(按 F 键)
- 支持键盘翻页(← →)
- 可直接打印为 PDF
- 响应式设计,适配各种屏幕
2. **Markdown 演示脚本**
- 输出每页内容的文字稿
- 用户可自行复制到 PPT 软件
### HTML PPT 模板
生成 PPT 时使用以下 HTML 模板结构:
```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>商业计划书 - [公司名称]</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
background: #1a1a2e;
color: #fff;
overflow: hidden;
}
.slide {
display: none;
width: 100vw;
height: 100vh;
padding: 60px 80px;
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
position: relative;
}
.slide.active {
display: flex;
flex-direction: column;
justify-content: center;
}
/* 封面样式 */
.slide.cover {
text-align: center;
justify-content: center;
align-items: center;
}
.slide.cover h1 {
font-size: 72px;
font-weight: 700;
margin-bottom: 20px;
background: linear-gradient(90deg, #667eea, #764ba2);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.slide.cover .slogan {
font-size: 28px;
color: #a0aec0;
margin-bottom: 60px;
}
.slide.cover .info {
font-size: 18px;
color: #718096;
}
/* 内容页样式 */
.slide h2 {
font-size: 48px;
font-weight: 600;
margin-bottom: 40px;
color: #667eea;
}
.slide h3 {
font-size: 32px;
font-weight: 500;
margin-bottom: 24px;
color: #a0aec0;
}
.slide p, .slide li {
font-size: 24px;
line-height: 1.8;
color: #e2e8f0;
}
.slide ul {
list-style: none;
padding-left: 0;
}
.slide ul li {
padding: 12px 0;
padding-left: 40px;
position: relative;
}
.slide ul li::before {
content: "▸";
position: absolute;
left: 0;
color: #667eea;
}
/* 数据卡片 */
.metrics {
display: flex;
gap: 40px;
margin-top: 40px;
}
.metric-card {
flex: 1;
background: rgba(102, 126, 234, 0.1);
border: 1px solid rgba(102, 126, 234, 0.3);
border-radius: 16px;
padding: 32px;
text-align: center;
}
.metric-card .value {
font-size: 48px;
font-weight: 700;
color: #667eea;
}
.metric-card .label {
font-size: 18px;
color: #a0aec0;
margin-top: 8px;
}
/* 两栏布局 */
.two-columns {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 60px;
margin-top: 40px;
}
/* 流程图 */
.flow {
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
margin-top: 40px;
}
.flow-item {
background: rgba(102, 126, 234, 0.15);
border-radius: 12px;
padding: 24px 32px;
text-align: center;
}
.flow-arrow {
color: #667eea;
font-size: 32px;
}
/* 页码 */
.page-number {
position: absolute;
bottom: 30px;
right: 40px;
font-size: 16px;
color: #4a5568;
}
/* 进度条 */
.progress {
position: fixed;
top: 0;
left: 0;
height: 4px;
background: linear-gradient(90deg, #667eea, #764ba2);
transition: width 0.3s;
z-index: 100;
}
/* 导航提示 */
.nav-hint {
position: fixed;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
font-size: 14px;
color: #4a5568;
}
</style>
</head>
<body>
<div class="progress" id="progress"></div>
<!-- Slide 1: 封面 -->
<div class="slide cover active">
<h1>[公司名称]</h1>
<p class="slogan">[一句话 Slogan]</p>
<p class="info">[日期] · 商业计划书</p>
<span class="page-number">1 / N</span>
</div>
<!-- Slide 2: 公司定位 -->
<div class="slide">
<h2>公司定位</h2>
<h3>[一句话定位]</h3>
<div class="metrics">
<div class="metric-card">
<div class="value">[X]年</div>
<div class="label">深耕行业</div>
</div>
<div class="metric-card">
<div class="value">[X]家</div>
<div class="label">头部客户</div>
</div>
<div class="metric-card">
<div class="value">[X]轮</div>
<div class="label">完成融资</div>
</div>
</div>
<span class="page-number">2 / N</span>
</div>
<!-- 更多 slides... -->
<p class="nav-hint">← → 翻页 · F 全屏 · ESC 退出</p>
<script>
const slides = document.querySelectorAll('.slide');
const progress = document.getElementById('progress');
let current = 0;
function showSlide(n) {
slides[current].classList.remove('active');
current = (n + slides.length) % slides.length;
slides[current].classList.add('active');
progress.style.width = ((current + 1) / slides.length * 100) + '%';
}
document.addEventListener('keydown', (e) => {
if (e.key === 'ArrowRight' || e.key === ' ') showSlide(current + 1);
if (e.key === 'ArrowLeft') showSlide(current - 1);
if (e.key === 'f' || e.key === 'F') {
document.documentElement.requestFullscreen?.();
}
});
// 触摸滑动支持
let touchStartX = 0;
document.addEventListener('touchstart', e => touchStartX = e.touches[0].clientX);
document.addEventListener('touchend', e => {
const diff = e.changedTouches[0].clientX - touchStartX;
if (Math.abs(diff) > 50) showSlide(current + (diff > 0 ? -1 : 1));
});
</script>
</body>
</html>
```
### BP PPT 标准页面结构
生成商业计划书 PPT 时,按以下结构组织:
| 页码 | 页面类型 | 内容要点 | 设计建议 |
|------|----------|----------|----------|
| 1 | 封面 | 公司名、Slogan、日期 | 居中大标题,渐变背景 |
| 2 | 公司定位 | 一句话定位 + 核心数据 | 3-4 个数据卡片 |
| 3 | 行业痛点 | 3-4 个核心痛点 | 图标 + 简短描述 |
| 4 | 解决方案 | 产品价值主张 | 流程图或产品矩阵 |
| 5 | 商业模式 | 收入来源、盈利方式 | 模式图 + 收入占比 |
| 6 | 市场规模 | TAM/SAM/SOM | 同心圆图 + 数字 |
| 7 | 竞争分析 | 竞争矩阵、差异化 | 2x2 矩阵图 |
| 8 | 运营数据 | 核心指标、增长趋势 | 4 个大数字卡片 |
| 9 | 客户案例 | 标杆客户、成果 | Logo + 数据对比 |
| 10 | 团队介绍 | 核心成员背景 | 头像 + 简介 |
| 11 | 里程碑 | 发展历程 | 时间线 |
| 12 | 财务预测 | 3 年收入预测 | 柱状图示意 |
| 13 | 战略规划 | 未来规划 | 阶段性目标 |
| 14 | 融资计划 | 金额、用途、联系方式 | 饼图 + 联系信息 |
### PPT 设计原则
1. **一页一重点**:每页只传达一个核心信息
2. **大字少字**:标题 48px+,正文 24px+,每页文字不超过 50 字
3. **数据可视化**:用数字卡片、图表代替文字描述
4. **留白充足**:内容不要铺满,保持呼吸感
5. **配色统一**:使用 2-3 种主色,保持一致性
6. **高对比度**:深色背景 + 浅色文字,或浅色背景 + 深色文字
### 配色方案
**深色科技风**(推荐):
- 背景:#1a1a2e#16213e(渐变)
- 主色:#667eea(蓝紫色)
- 辅助:#764ba2(紫色)
- 文字:#e2e8f0(浅灰)
- 次要文字:#a0aec0(中灰)
**浅色商务风**
- 背景:#ffffff
- 主色:#2196F3(蓝色)
- 辅助:#1976D2(深蓝)
- 文字:#212121(深灰)
- 次要文字:#616161(中灰)
### 使用示例
用户请求:
> 帮我生成商业计划书 PPT
输出方式:
1. 生成完整的 HTML 文件
2. 保存到用户指定位置(如桌面、项目目录)
3. 用户用浏览器打开即可演示
```bash
# 打开 PPT
open ~/Desktop/bp-presentation.html
# 或在浏览器中打开后按 F 进入全屏模式
```
### 导出为 PDF
HTML PPT 可通过浏览器打印功能导出为 PDF
1. 在浏览器中打开 HTML 文件
2. 按 Cmd+P (Mac) 或 Ctrl+P (Windows)
3. 选择"另存为 PDF"
4. 设置页面大小为横向 A4 或 16:9
### 注意事项
1. **内容优先**:先确定 BP 内容,再生成 PPT
2. **数据占位**:敏感数据可用 [X] 占位
3. **迭代优化**:可分页生成,逐步完善
4. **本地演示**HTML 文件完全离线可用,无需网络

View File

@@ -0,0 +1,8 @@
{
"name": "finance-plugin",
"description": "Plugin for finance",
"version": "1.0.0",
"author": {
"name": "qiudl"
}
}

View File

@@ -0,0 +1,948 @@
---
name: finance
description: 财务对账技能。支持银行对账、应收对账、应付对账、内部往来对账等。通过自然语言实现账单导入、差异分析、对账报告生成。当用户提到对账、银行流水、应收应付、账单核对、财务核销相关任务时自动激活。
---
# 财务对账技能
## 功能概述
- **银行对账**: 银行流水 vs 系统收付款记录匹配
- **应收对账**: 客户对账单生成与核对
- **应付对账**: 供应商对账单核对
- **内部对账**: 公司间/部门间往来核对
- **差异分析**: 自动识别未达账项、差异原因
- **对账报告**: 生成标准化对账报告
- **扫描单据OCR**: PDF/图片扫描件识别,提取订单号与对账单匹配(适用于诉讼证据核对)
---
## 对账类型
### 1. 银行对账
| 对账项 | 说明 |
|--------|------|
| 银行已收/企业未收 | 银行已入账,系统未记录 |
| 企业已收/银行未收 | 系统已记录,银行未入账 |
| 银行已付/企业未付 | 银行已扣款,系统未记录 |
| 企业已付/银行未付 | 系统已记录,银行未扣款 |
### 2. 应收对账
- 客户欠款余额核对
- 发票与回款匹配
- 账龄分析
### 3. 应付对账
- 供应商应付余额核对
- 采购入库与付款匹配
- 预付款冲销
---
## 数据格式要求
### 银行流水格式
```csv
交易日期,交易类型,摘要,金额,余额,对方账户,对方名称,交易流水号
2026-01-15,收入,货款,50000.00,150000.00,622848******1234,深圳XX公司,TXN20260115001
2026-01-16,支出,采购款,-30000.00,120000.00,622848******5678,广州YY公司,TXN20260116001
```
### 系统收付款格式
```csv
单据日期,单据类型,单据编号,金额,客户/供应商,备注,关联流水号
2026-01-15,收款单,SK20260115001,50000.00,深圳XX公司,货款,TXN20260115001
2026-01-16,付款单,FK20260116001,30000.00,广州YY公司,采购款,
```
---
## 自然语言操作示例
### 银行对账
| 用户说 | 执行操作 |
|--------|----------|
| "导入银行流水" | 解析银行导出的 Excel/CSV |
| "和系统记录对账" | 自动匹配流水号/金额/日期 |
| "找出未达账项" | 识别双方差异记录 |
| "生成银行余额调节表" | 输出标准调节表 |
### 应收对账
| 用户说 | 执行操作 |
|--------|----------|
| "生成客户对账单" | 按客户汇总应收明细 |
| "核对XX公司的应收款" | 单客户对账 |
| "应收账龄分析" | 按账龄分段统计 |
| "哪些发票还没收到款" | 查询未核销发票 |
### 应付对账
| 用户说 | 执行操作 |
|--------|----------|
| "核对供应商对账单" | 导入并匹配供应商账单 |
| "本月应付汇总" | 按供应商统计应付 |
| "哪些采购单还没付款" | 查询未付款采购单 |
### 扫描单据OCR对账
| 用户说 | 执行操作 |
|--------|----------|
| "识别扫描件与对账单匹配" | OCR 提取 PDF 订单号并与 Excel 对账 |
| "承运商起诉了,核对证据" | 诉讼证据对账分析 |
| "PDF发票识别" | OCR 提取发票信息 |
| "找出对账单没有的订单" | 差异订单识别 |
---
## Python 代码模板
### 银行对账核心逻辑
```python
import pandas as pd
from datetime import datetime
def load_bank_statement(file_path: str) -> pd.DataFrame:
"""加载银行流水"""
df = pd.read_excel(file_path) if file_path.endswith('.xlsx') else pd.read_csv(file_path)
# 标准化列名
column_mapping = {
'交易日期': 'date',
'金额': 'amount',
'交易流水号': 'ref_no',
'对方名称': 'counterparty',
'摘要': 'memo'
}
df = df.rename(columns=column_mapping)
df['date'] = pd.to_datetime(df['date'])
df['source'] = 'bank'
return df
def load_system_records(file_path: str) -> pd.DataFrame:
"""加载系统收付款记录"""
df = pd.read_excel(file_path) if file_path.endswith('.xlsx') else pd.read_csv(file_path)
column_mapping = {
'单据日期': 'date',
'金额': 'amount',
'关联流水号': 'ref_no',
'客户/供应商': 'counterparty',
'单据编号': 'doc_no'
}
df = df.rename(columns=column_mapping)
df['date'] = pd.to_datetime(df['date'])
df['source'] = 'system'
return df
def reconcile(bank_df: pd.DataFrame, system_df: pd.DataFrame) -> dict:
"""
执行对账
Returns:
{
'matched': 已匹配记录,
'bank_only': 银行有/系统无 (银行未达),
'system_only': 系统有/银行无 (企业未达),
'summary': 对账汇总
}
"""
# 方法1: 按流水号精确匹配
bank_with_ref = bank_df[bank_df['ref_no'].notna() & (bank_df['ref_no'] != '')]
system_with_ref = system_df[system_df['ref_no'].notna() & (system_df['ref_no'] != '')]
matched_by_ref = pd.merge(
bank_with_ref,
system_with_ref,
on='ref_no',
suffixes=('_bank', '_system'),
how='inner'
)
matched_refs = set(matched_by_ref['ref_no'])
# 方法2: 无流水号的按金额+日期模糊匹配
bank_unmatched = bank_df[~bank_df['ref_no'].isin(matched_refs)]
system_unmatched = system_df[~system_df['ref_no'].isin(matched_refs)]
# 按金额和日期(±3天)匹配
fuzzy_matched = []
bank_remaining = bank_unmatched.copy()
system_remaining = system_unmatched.copy()
for idx, bank_row in bank_unmatched.iterrows():
for sys_idx, sys_row in system_remaining.iterrows():
if (abs(bank_row['amount'] - sys_row['amount']) < 0.01 and
abs((bank_row['date'] - sys_row['date']).days) <= 3):
fuzzy_matched.append({
'bank_idx': idx,
'system_idx': sys_idx,
'amount': bank_row['amount'],
'bank_date': bank_row['date'],
'system_date': sys_row['date']
})
system_remaining = system_remaining.drop(sys_idx)
bank_remaining = bank_remaining.drop(idx)
break
# 未匹配项
bank_only = bank_remaining # 银行有/系统无
system_only = system_remaining # 系统有/银行无
# 汇总
summary = {
'bank_total': bank_df['amount'].sum(),
'system_total': system_df['amount'].sum(),
'matched_count': len(matched_by_ref) + len(fuzzy_matched),
'bank_only_count': len(bank_only),
'bank_only_amount': bank_only['amount'].sum() if len(bank_only) > 0 else 0,
'system_only_count': len(system_only),
'system_only_amount': system_only['amount'].sum() if len(system_only) > 0 else 0,
'difference': bank_df['amount'].sum() - system_df['amount'].sum()
}
return {
'matched': pd.concat([matched_by_ref, pd.DataFrame(fuzzy_matched)]),
'bank_only': bank_only,
'system_only': system_only,
'summary': summary
}
```
### 银行余额调节表
```python
def generate_bank_reconciliation_report(
bank_balance: float,
book_balance: float,
bank_only: pd.DataFrame,
system_only: pd.DataFrame,
as_of_date: str
) -> str:
"""生成银行余额调节表"""
# 分类未达账项
bank_receipts_not_in_book = bank_only[bank_only['amount'] > 0]['amount'].sum()
bank_payments_not_in_book = bank_only[bank_only['amount'] < 0]['amount'].sum()
book_receipts_not_in_bank = system_only[system_only['amount'] > 0]['amount'].sum()
book_payments_not_in_bank = system_only[system_only['amount'] < 0]['amount'].sum()
report = f"""
================================================================================
银行存款余额调节表
截止日期: {as_of_date}
================================================================================
一、银行对账单余额 {bank_balance:>15,.2f}
加: 企业已收/银行未收 {book_receipts_not_in_bank:>15,.2f}
减: 企业已付/银行未付 {abs(book_payments_not_in_bank):>15,.2f}
─────────────────
调节后余额 {bank_balance + book_receipts_not_in_bank + book_payments_not_in_bank:>15,.2f}
--------------------------------------------------------------------------------
二、企业账面余额 {book_balance:>15,.2f}
加: 银行已收/企业未收 {bank_receipts_not_in_book:>15,.2f}
减: 银行已付/企业未付 {abs(bank_payments_not_in_book):>15,.2f}
─────────────────
调节后余额 {book_balance + bank_receipts_not_in_book + bank_payments_not_in_book:>15,.2f}
================================================================================
未达账项明细
================================================================================
【银行已收/企业未收】
"""
if len(bank_only[bank_only['amount'] > 0]) > 0:
for _, row in bank_only[bank_only['amount'] > 0].iterrows():
report += f" {row['date'].strftime('%Y-%m-%d')} {row.get('counterparty', ''):<20} {row['amount']:>12,.2f}\n"
else:
report += " (无)\n"
report += "\n【银行已付/企业未付】\n"
if len(bank_only[bank_only['amount'] < 0]) > 0:
for _, row in bank_only[bank_only['amount'] < 0].iterrows():
report += f" {row['date'].strftime('%Y-%m-%d')} {row.get('counterparty', ''):<20} {row['amount']:>12,.2f}\n"
else:
report += " (无)\n"
report += "\n【企业已收/银行未收】\n"
if len(system_only[system_only['amount'] > 0]) > 0:
for _, row in system_only[system_only['amount'] > 0].iterrows():
report += f" {row['date'].strftime('%Y-%m-%d')} {row.get('counterparty', ''):<20} {row['amount']:>12,.2f}\n"
else:
report += " (无)\n"
report += "\n【企业已付/银行未付】\n"
if len(system_only[system_only['amount'] < 0]) > 0:
for _, row in system_only[system_only['amount'] < 0].iterrows():
report += f" {row['date'].strftime('%Y-%m-%d')} {row.get('counterparty', ''):<20} {row['amount']:>12,.2f}\n"
else:
report += " (无)\n"
return report
```
### 应收对账
```python
def generate_ar_statement(
customer_name: str,
transactions: pd.DataFrame,
as_of_date: str
) -> str:
"""
生成客户对账单
transactions 格式:
- date: 日期
- doc_type: 单据类型 (发票/收款/退货)
- doc_no: 单据编号
- debit: 借方(应收增加)
- credit: 贷方(应收减少)
- memo: 摘要
"""
df = transactions.sort_values('date')
report = f"""
================================================================================
客户对账单
================================================================================
客户名称: {customer_name}
对账期间: {df['date'].min().strftime('%Y-%m-%d')}{as_of_date}
================================================================================
日期 单据类型 单据编号 借方 贷方 余额
--------------------------------------------------------------------------------
"""
balance = 0
for _, row in df.iterrows():
debit = row.get('debit', 0) or 0
credit = row.get('credit', 0) or 0
balance += debit - credit
report += f"{row['date'].strftime('%Y-%m-%d')} {row['doc_type']:<8} {row['doc_no']:<16} {debit:>12,.2f} {credit:>12,.2f} {balance:>12,.2f}\n"
report += f"""
--------------------------------------------------------------------------------
合计 {df['debit'].sum():>12,.2f} {df['credit'].sum():>12,.2f} {balance:>12,.2f}
================================================================================
期末应收余额: {balance:,.2f}
请贵司核对以上账目,如有异议请于收到对账单后 7 日内书面告知。
如无异议,视为确认。
对账联系人: _______________
联系电话: _______________
"""
return report
```
### 账龄分析
```python
from datetime import datetime, timedelta
def aging_analysis(
receivables: pd.DataFrame,
as_of_date: str,
aging_buckets: list = [30, 60, 90, 180, 365]
) -> pd.DataFrame:
"""
应收账龄分析
receivables 格式:
- customer: 客户
- invoice_date: 发票日期
- amount: 未收金额
"""
as_of = datetime.strptime(as_of_date, '%Y-%m-%d')
def get_aging_bucket(invoice_date):
days = (as_of - invoice_date).days
for i, bucket in enumerate(aging_buckets):
if days <= bucket:
if i == 0:
return f'0-{bucket}'
else:
return f'{aging_buckets[i-1]+1}-{bucket}'
return f'{aging_buckets[-1]+1}天以上'
df = receivables.copy()
df['invoice_date'] = pd.to_datetime(df['invoice_date'])
df['aging_days'] = (as_of - df['invoice_date']).dt.days
df['aging_bucket'] = df['invoice_date'].apply(get_aging_bucket)
# 按客户和账龄分组汇总
summary = df.pivot_table(
index='customer',
columns='aging_bucket',
values='amount',
aggfunc='sum',
fill_value=0
)
# 添加合计列
summary['合计'] = summary.sum(axis=1)
# 添加合计行
summary.loc['合计'] = summary.sum()
return summary
```
---
## 对账报告模板
### Excel 对账报告
```python
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
def export_reconciliation_to_excel(
result: dict,
output_path: str,
report_date: str
):
"""导出对账结果到 Excel"""
wb = Workbook()
# Sheet1: 对账汇总
ws_summary = wb.active
ws_summary.title = "对账汇总"
summary = result['summary']
ws_summary['A1'] = '对账汇总报告'
ws_summary['A1'].font = Font(bold=True, size=14)
ws_summary['A2'] = f'对账日期: {report_date}'
headers = ['项目', '金额', '笔数']
for col, header in enumerate(headers, 1):
ws_summary.cell(row=4, column=col, value=header)
data = [
('银行流水合计', summary['bank_total'], '-'),
('系统记录合计', summary['system_total'], '-'),
('已匹配', '-', summary['matched_count']),
('银行有/系统无', summary['bank_only_amount'], summary['bank_only_count']),
('系统有/银行无', summary['system_only_amount'], summary['system_only_count']),
('差异金额', summary['difference'], '-'),
]
for row, (item, amount, count) in enumerate(data, 5):
ws_summary.cell(row=row, column=1, value=item)
ws_summary.cell(row=row, column=2, value=amount)
ws_summary.cell(row=row, column=3, value=count)
# Sheet2: 银行未达账项
ws_bank = wb.create_sheet("银行未达账项")
if len(result['bank_only']) > 0:
for col, header in enumerate(result['bank_only'].columns, 1):
ws_bank.cell(row=1, column=col, value=header)
for row, data_row in enumerate(result['bank_only'].values, 2):
for col, value in enumerate(data_row, 1):
ws_bank.cell(row=row, column=col, value=value)
# Sheet3: 企业未达账项
ws_system = wb.create_sheet("企业未达账项")
if len(result['system_only']) > 0:
for col, header in enumerate(result['system_only'].columns, 1):
ws_system.cell(row=1, column=col, value=header)
for row, data_row in enumerate(result['system_only'].values, 2):
for col, value in enumerate(data_row, 1):
ws_system.cell(row=row, column=col, value=value)
wb.save(output_path)
print(f"对账报告已保存: {output_path}")
```
---
## 常见对账场景
### 场景1: 月末银行对账
```python
# 1. 加载数据
bank_df = load_bank_statement('银行流水_202601.xlsx')
system_df = load_system_records('收付款记录_202601.xlsx')
# 2. 执行对账
result = reconcile(bank_df, system_df)
# 3. 查看汇总
print(f"已匹配: {result['summary']['matched_count']}")
print(f"银行未达: {result['summary']['bank_only_count']} 笔, 金额 {result['summary']['bank_only_amount']:,.2f}")
print(f"企业未达: {result['summary']['system_only_count']} 笔, 金额 {result['summary']['system_only_amount']:,.2f}")
# 4. 生成调节表
report = generate_bank_reconciliation_report(
bank_balance=150000.00, # 银行对账单余额
book_balance=145000.00, # 企业账面余额
bank_only=result['bank_only'],
system_only=result['system_only'],
as_of_date='2026-01-31'
)
print(report)
# 5. 导出 Excel
export_reconciliation_to_excel(result, '银行对账_202601.xlsx', '2026-01-31')
```
### 场景2: 客户对账
```python
# 加载客户交易明细
ar_transactions = pd.read_excel('应收明细.xlsx')
# 筛选特定客户
customer_data = ar_transactions[ar_transactions['customer'] == '深圳XX公司']
# 生成对账单
statement = generate_ar_statement(
customer_name='深圳XX公司',
transactions=customer_data,
as_of_date='2026-01-31'
)
print(statement)
```
### 场景3: 账龄分析
```python
# 加载未收款数据
receivables = pd.read_excel('应收账款.xlsx')
# 账龄分析
aging = aging_analysis(
receivables=receivables,
as_of_date='2026-01-31',
aging_buckets=[30, 60, 90, 180, 365]
)
print(aging)
# 导出
aging.to_excel('账龄分析_202601.xlsx')
```
### 场景4: 扫描单据OCR识别与对账匹配诉讼证据核对
适用于:承运商/供应商提供扫描件作为诉讼证据,需要与我司对账单进行匹配核对。
```python
from pdf2image import convert_from_path
import pytesseract
import pandas as pd
import re
def ocr_pdf_extract_orders(pdf_path: str, dpi: int = 150) -> pd.DataFrame:
"""
从 PDF 扫描件中 OCR 提取订单信息
Args:
pdf_path: PDF 文件路径
dpi: 图像分辨率,越高识别越准但速度越慢
Returns:
DataFrame 包含 order_no, page, tc_no 等字段
"""
print(f"正在转换 PDF...")
images = convert_from_path(pdf_path, dpi=dpi)
print(f"{len(images)} 页,开始 OCR 识别...")
all_records = []
for i, img in enumerate(images, 1):
if i % 10 == 0:
print(f" 处理进度: {i}/{len(images)}")
text = pytesseract.image_to_string(img, lang='chi_sim+eng')
# 提取多种订单号格式(根据实际业务调整)
hm_orders = re.findall(r'(HM\d{12,15})(?:-\d+)?', text) # 华住订单
hpo_orders = re.findall(r'(HPO-\d{8}-\d+)', text) # 华住采购订单
fy_orders = re.findall(r'(FY\d{9,})', text) # 凤悦订单
phgco_orders = re.findall(r'(PHGCO\d{9,})', text) # 锦江订单
tc_orders = re.findall(r'(TC\d{8,})', text) # 运单号
# 提取日期
dates = re.findall(r'(\d{4}-\d{2}-\d{2})', text)
all_orders = hm_orders + hpo_orders + fy_orders + phgco_orders
for order in all_orders:
all_records.append({
'order_no': order,
'page': i,
'tc_no': tc_orders[0] if tc_orders else None,
'date': dates[0] if dates else None,
'raw_text': text[:500] # 保留部分原文用于核查
})
df = pd.DataFrame(all_records)
df = df.drop_duplicates(subset=['order_no'])
print(f"提取完成,共 {len(df)} 条唯一订单")
return df
def extract_base_order_no(order_no: str) -> str:
"""
提取基础订单号(移除后缀如 -1, -2
例如: HM202505227320-1 -> HM202505227320
"""
if pd.isna(order_no):
return None
order_str = str(order_no)
match = re.match(r'(HM\d{12,15}|HPO-\d{8}-\d+|FY\d{9,}|PHGCO\d{9,})', order_str)
return match.group(1) if match else order_str
def reconcile_scanned_with_excel(
scanned_df: pd.DataFrame,
excel_path: str,
main_sheet: str,
pending_sheet: str = None,
order_column: str = '华住/锦江订单号'
) -> dict:
"""
扫描单据与 Excel 对账单匹配
Args:
scanned_df: OCR 提取的订单 DataFrame
excel_path: Excel 对账单路径
main_sheet: 主数据 Sheet 名称
pending_sheet: 待结算/次月结 Sheet 名称(可选)
order_column: 订单号列名
Returns:
{
'matched_main': 在主表中匹配的订单,
'matched_pending': 在待结算表中匹配的订单,
'not_found': 未找到的订单,
'summary': 汇总统计
}
"""
# 加载主表
df_main = pd.read_excel(excel_path, sheet_name=main_sheet)
# 处理表头(如果第一行是表头)
if df_main.iloc[0].astype(str).str.contains(order_column).any():
df_main.columns = df_main.iloc[0]
df_main = df_main.iloc[1:].reset_index(drop=True)
# 提取基础订单号
main_orders = set(df_main[order_column].apply(extract_base_order_no).dropna())
# 加载待结算表(如有)
pending_orders = set()
df_pending = None
if pending_sheet:
try:
df_pending = pd.read_excel(excel_path, sheet_name=pending_sheet)
pending_orders = set(df_pending[order_column].apply(extract_base_order_no).dropna())
except:
pass
all_excel_orders = main_orders | pending_orders
# 扫描件订单号
scan_orders = set(scanned_df['order_no'].apply(extract_base_order_no).dropna())
# 匹配分析
matched_main = scan_orders & main_orders
matched_pending = scan_orders & pending_orders
not_found = scan_orders - all_excel_orders
# 汇总
summary = {
'scan_total': len(scan_orders),
'matched_main_count': len(matched_main),
'matched_pending_count': len(matched_pending),
'not_found_count': len(not_found),
'match_rate': (len(matched_main) + len(matched_pending)) / len(scan_orders) * 100 if scan_orders else 0
}
return {
'matched_main': matched_main,
'matched_pending': matched_pending,
'not_found': not_found,
'summary': summary,
'df_main': df_main,
'df_pending': df_pending
}
def generate_litigation_reconciliation_report(
result: dict,
scanned_df: pd.DataFrame,
output_path: str
):
"""
生成诉讼对账分析报告
"""
summary = result['summary']
with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
# Sheet1: 汇总
summary_df = pd.DataFrame({
'项目': [
'扫描件订单数',
'在主对账单中找到',
'在待结算表中找到',
'完全未找到',
'匹配率'
],
'数值': [
summary['scan_total'],
summary['matched_main_count'],
summary['matched_pending_count'],
summary['not_found_count'],
f"{summary['match_rate']:.1f}%"
]
})
summary_df.to_excel(writer, sheet_name='对账汇总', index=False)
# Sheet2: 未找到的订单
if result['not_found']:
not_found_df = scanned_df[
scanned_df['order_no'].apply(extract_base_order_no).isin(result['not_found'])
][['order_no', 'page', 'tc_no', 'date']]
not_found_df.columns = ['订单号', 'PDF页码', '运单号', '日期']
not_found_df.to_excel(writer, sheet_name='未找到订单', index=False)
# Sheet3: 待结算订单详情
if result['matched_pending'] and result['df_pending'] is not None:
pending_detail = result['df_pending'][
result['df_pending']['华住/锦江订单号'].apply(extract_base_order_no).isin(result['matched_pending'])
]
pending_detail.to_excel(writer, sheet_name='待结算订单', index=False)
print(f"报告已保存: {output_path}")
```
#### 使用示例
```python
# 1. 从 PDF 扫描件提取订单
pdf_path = "承运商证据_6月业务.pdf"
scanned_df = ocr_pdf_extract_orders(pdf_path, dpi=150)
# 2. 与 Excel 对账单匹配
result = reconcile_scanned_with_excel(
scanned_df=scanned_df,
excel_path="对账单_2025年6月.xlsx",
main_sheet="2025.6",
pending_sheet="次月结",
order_column="华住/锦江订单号"
)
# 3. 查看匹配结果
print(f"匹配率: {result['summary']['match_rate']:.1f}%")
print(f"未找到: {result['summary']['not_found_count']}")
if result['not_found']:
print("\n未找到的订单:")
for order in result['not_found']:
print(f" {order}")
# 4. 生成报告
generate_litigation_reconciliation_report(
result=result,
scanned_df=scanned_df,
output_path="诉讼对账分析报告.xlsx"
)
```
#### OCR 识别注意事项
1. **环境依赖**:
```bash
# macOS
brew install tesseract tesseract-lang poppler
pip install pdf2image pytesseract pandas openpyxl
```
2. **识别精度**:
- DPI 150 适合快速扫描DPI 200-250 适合精确识别
- 中文识别需要 `chi_sim` 语言包
3. **订单号格式差异**:
- PDF 中可能是 `HM202505227320`
- Excel 中可能是 `HM202505227320-1`、`HM202505227320-2`(带后缀)
- 匹配时应使用基础订单号
4. **常见问题**:
- 空白页(签收单背面)会被自动跳过
- OCR 可能误识别字符(如 5→S, 0→O建议人工抽查
- 大 PDF 处理较慢,可先用低 DPI 预览
5. **"次月结"/"待结算" 订单**:
- 这类订单通常标记为"没有报价"、"未建单"等
- 虽然在系统中有记录,但可能未计入正式结算金额
- 诉讼中需特别关注这类订单的状态
6. **多承运商订单归属校验(重要风险点)**:
- 承运商可能将其他公司的订单混入证据,企图多收运费
- 必须检查PDF订单是否出现在其他承运商的对账单中
- 如果订单同时出现在多个承运商对账单中,则为异常订单
#### 多承运商订单归属校验
```python
def check_order_ownership(
scanned_df: pd.DataFrame,
my_company_excel: str,
other_carrier_excels: list[str],
order_column: str = '华住/锦江订单号'
) -> dict:
"""
检查订单归属,识别是否有其他承运商的订单被混入
Args:
scanned_df: OCR 提取的订单 DataFrame
my_company_excel: 我司对账单路径
other_carrier_excels: 其他承运商对账单路径列表
order_column: 订单号列名
Returns:
{
'my_orders': 属于我司的订单,
'other_carrier_orders': 属于其他承运商的订单(异常),
'disputed_orders': 同时出现在多处的争议订单,
'summary': 汇总
}
"""
# 提取PDF订单
scan_orders = set(scanned_df['order_no'].apply(extract_base_order_no).dropna())
# 加载我司对账单订单
my_orders = set()
try:
xl = pd.ExcelFile(my_company_excel)
for sheet in xl.sheet_names:
df = pd.read_excel(my_company_excel, sheet_name=sheet)
for col in df.columns:
if '订单' in str(col):
orders = df[col].apply(extract_base_order_no).dropna()
my_orders.update(orders)
except Exception as e:
print(f"加载我司对账单失败: {e}")
# 加载其他承运商对账单订单
other_orders = {} # {carrier_name: set of orders}
for excel_path in other_carrier_excels:
carrier_name = excel_path.split('/')[-1]
carrier_orders = set()
try:
xl = pd.ExcelFile(excel_path)
for sheet in xl.sheet_names:
df = pd.read_excel(excel_path, sheet_name=sheet)
for col in df.columns:
if '订单' in str(col):
orders = df[col].apply(extract_base_order_no).dropna()
carrier_orders.update(orders)
other_orders[carrier_name] = carrier_orders
except:
pass
# 分析订单归属
all_other_orders = set()
for orders in other_orders.values():
all_other_orders.update(orders)
# 分类
only_mine = scan_orders & my_orders - all_other_orders # 仅在我司
only_others = scan_orders & all_other_orders - my_orders # 仅在其他承运商(异常!)
in_both = scan_orders & my_orders & all_other_orders # 同时出现(争议)
nowhere = scan_orders - my_orders - all_other_orders # 哪里都没有
# 识别异常订单属于哪个承运商
abnormal_details = []
for order in only_others:
for carrier, orders in other_orders.items():
if order in orders:
page = scanned_df[scanned_df['order_no'].apply(extract_base_order_no) == order]['page'].values
abnormal_details.append({
'order_no': order,
'belongs_to': carrier,
'pdf_page': page[0] if len(page) > 0 else None
})
summary = {
'scan_total': len(scan_orders),
'my_orders_count': len(only_mine),
'other_carrier_count': len(only_others), # 异常订单数
'disputed_count': len(in_both),
'not_found_count': len(nowhere)
}
return {
'my_orders': only_mine,
'other_carrier_orders': only_others,
'abnormal_details': abnormal_details,
'disputed_orders': in_both,
'not_found': nowhere,
'summary': summary
}
```
#### 使用示例(多承运商校验)
```python
# 检查订单归属
result = check_order_ownership(
scanned_df=scanned_df,
my_company_excel="智慧云彩对账单_2025年6月.xlsx",
other_carrier_excels=[
"友利速运对账单_2025年6月.xlsx",
"其他承运商对账单.xlsx"
]
)
# 检查是否有异常订单
if result['summary']['other_carrier_count'] > 0:
print(f"⚠️ 发现 {result['summary']['other_carrier_count']} 个异常订单!")
print("这些订单属于其他承运商,不应由我司支付:")
for item in result['abnormal_details']:
print(f" {item['order_no']} -> 属于 {item['belongs_to']} (PDF第{item['pdf_page']}页)")
else:
print("✓ 未发现异常订单,所有订单归属正确")
```
---
## 注意事项
1. **数据格式统一**: 确保日期、金额格式一致后再对账
2. **匹配规则灵活**: 先精确匹配流水号,再模糊匹配金额+日期
3. **差异原因分析**: 对未达账项要逐笔核实原因
4. **定期对账**: 建议至少每月进行一次银行对账
5. **凭证留存**: 对账报告需打印签字存档
6. **OCR 核对**: 扫描件 OCR 后应人工抽查,确保识别准确
7. **多承运商校验**: 诉讼场景下必须检查订单是否属于其他承运商,防止对方混入他人订单骗取运费
---
## 与其他技能协作
- **data-excel**: 处理复杂的 Excel 数据转换
- **feishu**: 将对账报告保存到飞书云文档
- **siyuan**: 记录对账工作日志到思源笔记