| `new_approval` | 新审批单提交 | 当前审批人 | 审批通知卡片 |
| `approval_passed` | 审批通过 | 申请人 | 通过通知 |
| `approval_rejected` | 审批拒绝 | 申请人 + 原因 | 拒绝通知 |
| `escalation_warning` | 升级前 2h 提醒 | 当前审批人 | 催办提醒 |
| `escalation_notice` | 升级已触发 | 上级 + 原审批人 | 升级通知 |
| `system_notice` | 系统异常 | 管理员 | 系统告警 |
5.2 消息卡片模板(Markdown)
{
"touser": "user_id",
"msgtype": "template_card",
"template_card": {
"card_type": "news_notice",
"source": {
"icon_url": "https://mall.topcentral.com/static/logo.png",
"desc": "TopCentral Mall 审批系统"
},
"main_title": {
"title": "📋 新的审批申请",
"desc": "请及时处理"
},
"card_image": { "url": "" },
"vertical_content_list": [
{
"title": "审批类型",
"desc": "客户信用额度申请"
},
{
"title": "申请人",
"desc": "张三 (sales@topcentral.com)"
},
{
"title": "金额",
"desc": "¥ 150,000.00"
},
{
"title": "申请时间",
"desc": "2026-06-04 10:30:00"
}
],
"horizontal_content_list": [
{ "keyname": "当前步骤", "value": "销售经理审批" },
{ "keyname": "超时时间", "value": "2026-06-05 10:30 (剩余 23h)" }
],
"card_action": {
"type": 1,
"url": "https://mall.topcentral.com/approval/detail?id=APP20260604001"
},
"jump_list": [
{ "type": 1, "title": "查看详情", "url": "https://mall.topcentral.com/approval/detail?id=APP20260604001" },
{ "type": 1, "title": "快速审批", "url": "https://mall.topcentral.com/approval/quick-approve?id=APP20260604001" }
]
}
}
5.3 通知适配器接口
class WeChatWorkNotifier:
"""企业微信通知适配器"""
def __init__(self):
self.corp_id = os.getenv("WECHAT_CORP_ID")
self.agent_id = os.getenv("WECHAT_AGENT_ID")
self.secret = os.getenv("WECHAT_SECRET")
self.token_cache = {}
async def get_access_token(self) -> str:
"""获取 access_token(缓存 + 自动刷新)"""
if self.token_cache.get("expires_at", 0) > time.time():
return self.token_cache["token"]
# 调用企业微信API获取新token
...
async def send_approval_notification(self, approval: ApprovalModel,
notification_type: str):
"""发送审批通知"""
template = self._build_template(approval, notification_type)
await self._send_message(approval.approver_id, template)
async def send_escalation_notice(self, approval: ApprovalModel):
"""发送升级通知给上级"""
supervisor = await UserService.get_supervisor(approval.approver_id)
template = self._build_escalation_template(approval)
await self._send_message(supervisor.wechat_id, template)
# 同时通知原审批人
await self._send_message(
approval.approver_id,
self._build_escalation_warning_template(approval)
)
---
6. 数据库设计
6.1 核心表结构
-- 审批单主表
CREATE TABLE approvals (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
approval_no VARCHAR(32) UNIQUE NOT NULL, -- 审批编号, e.g. APP20260604001
type VARCHAR(32) NOT NULL, -- 审批类型
title VARCHAR(200) NOT NULL, -- 审批标题
applicant_id UUID NOT NULL, -- 申请人
department_id UUID, -- 部门
amount DECIMAL(15,2) DEFAULT 0, -- 金额
status VARCHAR(20) DEFAULT 'pending', -- pending/approved/rejected/cancelled
current_step INT DEFAULT 1, -- 当前步骤
total_steps INT NOT NULL, -- 总步骤数
escalation_count INT DEFAULT 0, -- 升级次数
form_data JSONB, -- 申请表单数据
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
completed_at TIMESTAMP
);
-- 审批节点表
CREATE TABLE approval_nodes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
approval_id UUID NOT NULL REFERENCES approvals(id),
step INT NOT NULL, -- 步骤序号
role VARCHAR(32) NOT NULL, -- 角色
approver_id UUID, -- 审批人
status VARCHAR(20) DEFAULT 'pending', -- pending/approved/rejected/skipped
comment TEXT, -- 审批意见
deadline TIMESTAMP, -- 处理截止时间
escalated BOOLEAN DEFAULT FALSE, -- 是否已升级
processed_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
-- 审批操作日志
CREATE TABLE approval_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
approval_id UUID NOT NULL REFERENCES approvals(id),
action VARCHAR(32) NOT NULL, -- submit/approve/reject/escalate/comment
operator_id UUID NOT NULL, -- 操作人
operator_name VARCHAR(100),
detail JSONB, -- 操作详情
created_at TIMESTAMP DEFAULT NOW()
);
-- 索引
CREATE INDEX idx_approvals_status ON approvals(status);
CREATE INDEX idx_approvals_applicant ON approvals(applicant_id);
CREATE INDEX idx_approvals_amount ON approvals(amount);
CREATE INDEX idx_approval_nodes_approver ON approval_nodes(approver_id);
CREATE INDEX idx_approval_nodes_deadline ON approval_nodes(deadline) WHERE status = 'pending';
---
7. API 设计
| POST | `/api/v1/mall/approval/create` | 创建审批单 |
| GET | `/api/v1/mall/approval/{id}` | 获取审批详情 |
| POST | `/api/v1/mall/approval/{id}/approve` | 通过审批 |
| POST | `/api/v1/mall/approval/{id}/reject` | 拒绝审批 |
| POST | `/api/v1/mall/approval/{id}/recall` | 撤回申请 |
| GET | `/api/v1/mall/approval/my-pending` | 我的待审批列表 |
| GET | `/api/v1/mall/approval/my-history` | 我的历史审批 |
| POST | `/api/v1/mall/approval/{id}/escalate` | 手动升级 |
| GET | `/api/v1/mall/approval/stats` | 审批统计 |
| POST | `/api/v1/mall/approval/{id}/remind` | 催办提醒 |
---
8. 与现有系统的集成
8.1 与现有 `approval_service.py` 的关系
现有的 backend/app/services/approval_service.py 提供了:
审批类型枚举、审批节点配置、AI 辅助审批配置
基础角色定义(sales, sales_manager, sales_director, finance, hr, admin 等)
新引擎将:
**复用** 现有枚举和节点配置
**增强** 金额驱动的动态审批链
**实现** 原有的 `AUTO_APPROVE_RULES` 作为前置条件引擎
**扩展** 升级机制和 WeChat Work 通知
8.2 与 RBAC 系统的集成
Approval Engine → RBAC Service → User Roles
│ │
▼ ▼
审批节点角色映射 用户权限校验
---
9. 安全与审计
| 权限校验 | 每个审批操作均通过 RBAC 校验 |
| 操作审计 | 所有审批操作记录到 `approval_logs` |
| 数据加密 | 敏感字段(金额、审批意见)使用 AES-256 加密 |
| 防篡改 | 关键审批状态变更需签名校验 |
| 合规 | 审批历史保留至少 3 年 |
---
10. 实施路线图
| Phase 1 | 动态审批链 + 金额判定 | 3 天 |
| Phase 2 | 自动升级机制 + 定时任务 | 2 天 |
| Phase 3 | WeChat Work 通知集成 | 3 天 |
| Phase 4 | 审计日志 + 报表 | 2 天 |
| Phase 5 | 测试 + 文档 + 部署 | 2 天 |
| **合计** | | **12 天** |
---
11. 附录
11.1 关键决策记录
| 审批链配置方式 | 代码 vs 数据库 | **数据库** | 支持运行时动态调整 |
| 通知渠道优先级 | WeChat > Email > SMS | **WeChat 为主** | 企业内通讯标准 |
| 升级检查频率 | 15m / 30m / 1h | **30 分钟** | 平衡实时性和性能 |
| 超时阈值 | 12h / 24h / 48h | **24h** | 行业常见标准 |
11.2 相关文件
[审批服务源码](/backend/app/services/approval_service.py)
[RBAC 服务](/backend/app/services/rbac_service.py)
[定时任务服务](/backend/app/services/cron_service.py)