插件开发指南

基于 PWM CRM 插件架构,快速构建行业插件、功能扩展和第三方集成,释放平台无限可能。

Quick Start 插件 API 参考

插件架构

PWM CRM 插件系统采用微前端架构,每个插件是一个独立的、可热插拔的Module。插件运行在沙箱环境Medium,通过标准化的 Plugin API 与主平台交互。

插件类型

类型说明示例
行业插件针对特定行业的业务流程定制快消Shelf Check、医药Compliant Visits
功能插件扩展通用ModuleContract Management、Invoicing、营销Auto化
集成插件对接第三方系统ERP 同步、财务对接、企业微信
AI 插件扩展 AI Capabilities自定义行业模型、专用识别模型

技术栈

  • 前端:React / Vue / 原生 JS,Supports任意前端框架
  • 后端:Node.js / Python / Go,提供 Serverless 函数Supports
  • 样式:CSS Modules / Tailwind CSS,Auto隔离样式
  • 通信:基于 postMessage 的安全通信通道

Quick Start

1. 安装 CLI 工具

npm install -g @pwmapp/cli
# 或
yarn global add @pwmapp/cli

2. 创建插件项目

pwmapp plugin create my-first-plugin
cd my-first-plugin

CLI 会交互式询问插件名称、描述、类型、模板等信息,生成项目骨架。

3. 项目结构

my-first-plugin/
├── manifest.json        # 插件清单(必填)
├── package.json
├── src/
│   ├── index.js         # 插件入口
│   ├── App.jsx          # 主组件
│   └── styles.css       # 样式
├── server/
│   └── functions/       # Serverless 函数(Optional)
│       └── hello.js
├── assets/              # 静态Resources
│   └── icon.png
└── README.md

4. 本地开发调试

pwmapp plugin dev

启动本地开发服务器,在 PWM CRM 管理后台「Settings - 插件 - 开发者模式」Medium输入本地地址(默认 http://localhost:3000),即可实时预览插件效果。

5. 构建与打包

pwmapp plugin build
pwmapp plugin package

构建产物为 .tcplugin 格式,可直接上传到Plugin Marketplace或私有部署环境。

插件清单(manifest.json)

manifest.json 是插件的核心配置文件,定义了插件的基本信息、权限、扩展点等。

{
  "manifest_version": "1.0",
  "id": "com.example.order-sync",
  "name": "Order Sync插件",
  "version": "1.2.0",
  "description": "将 PWM CRM 商机同步到 ERP 系统,Auto创建订单",
  "author": {
    "name": "Example Inc.",
    "email": "dev@example.com",
    "url": "https://example.com"
  },
  "type": "integration",
  "permissions": [
    "opportunity:read",
    "opportunity:write",
    "customer:read",
    "webhook:subscribe",
    "external_api:call"
  ],
  "entry": {
    "main": "src/index.js",
    "settings": "src/Settings.jsx"
  },
  "extension_points": [
    {
      "point": "opportunity.detail.tab",
      "title": "Order Sync",
      "component": "OrderSyncTab"
    },
    {
      "point": "global.command",
      "title": "同步订单到ERP",
      "command": "sync-to-erp"
    }
  ],
  "webhooks": [
    "opportunity.stage_changed",
    "opportunity.won"
  ],
  "serverless": {
    "functions": [
      {
        "name": "syncOrder",
        "path": "server/functions/syncOrder.js",
        "trigger": "webhook"
      }
    ]
  },
  "icon": "assets/icon.png",
  "homepage_url": "https://example.com/order-sync",
  "support_url": "https://example.com/support"
}

插件生命周期

插件有以下生命周期Status:

  1. 已安装:用户安装插件,但未启用
  2. 已启用:插件正常运行,扩展点已注册
  3. 已禁用:插件被暂停,扩展点临时移除
  4. 已卸载:插件被移除,数据按策略清理

插件可通过生命周期钩子执行初始化和清理逻辑:

import { registerPlugin } from '@pwmapp/sdk';

registerPlugin({
  async onInstall(context) {
    // 插件安装时执行,初始化数据
    console.log('Plugin installed', context);
  },
  async onEnable(context) {
    // 插件启用时执行
  },
  async onDisable(context) {
    // 插件禁用时执行
  },
  async onUninstall(context) {
    // 插件卸载时执行,清理数据
  }
});

UI 扩展点

插件可以在以下位置注入 UI 组件:

扩展点 ID位置说明
customer.detail.tabClient详情页 Tab在Client详情页添加自定义 Tab
customer.detail.panelClient详情页侧边栏在Client详情页侧边栏添加面板
opportunity.detail.tab商机详情页 Tab在商机详情页添加自定义 Tab
visit.detail.action拜访详情页操作栏添加自定义操作按钮
dashboard.widget仪表盘添加自定义数据看板组件
global.command全局命令注册 AI Assistant可调用的命令
global.menuMain NavigationMenu添加独立页面入口
settings.pageSettings页面添加插件Settings页

注册扩展点示例:

import { registerExtension } from '@pwmapp/sdk';
import OrderSyncTab from './OrderSyncTab';

registerExtension('opportunity.detail.tab', {
  id: 'order-sync-tab',
  title: 'Order Sync',
  icon: 'sync',
  component: OrderSyncTab,
  // 控制是否显示
  shouldShow: (context) => context.opportunity.stage === 'won'
});

数据访问

插件通过 SDK 访问 PWM CRM 数据,权限由 manifest.json Medium声明的 permissions 控制。

import { api } from '@pwmapp/sdk';

// 获取Client列表
const customers = await api.customers.list({
  page: 1,
  page_size: 20,
  filter: { level: 'A' }
});

// 创建商机
const opportunity = await api.opportunities.create({
  customer_id: 'cus_001',
  name: '年度采购合作',
  amount: 500000,
  stage: 'needs_analysis'
});

// 调用自定义 Serverless 函数
const result = await api.functions.call('syncOrder', {
  opportunity_id: 'opp_001'
});

权限说明:插件只能访问 manifest.json Medium声明权限范围内的数据。未声明权限的 API Calls将被拒绝。用户在安装插件时会看到权限申请列表。

AI Capabilities集成

插件可以调用 PWM CRM 的 AI Capabilities,Or以注册自定义 AI 命令。

调用 AI Capabilities

import { ai } from '@pwmapp/sdk';

// AI 对话
const response = await ai.chat({
  query: '分析这个Client的跟进情况',
  context: { customer_id: 'cus_001' }
});

// Smart摘要
const summary = await ai.summarize({
  text: '大量的Follow-up Records文本...',
  format: 'bullet_points'
});

// 商机Scoring
const score = await ai.scoreOpportunity({
  opportunity_id: 'opp_001'
});

注册 AI 命令

插件可以注册自定义命令,让用户通过 AI Assistant自然语言调用插件功能:

import { registerAICommand } from '@pwmapp/sdk';

registerAICommand({
  command: 'sync-to-erp',
  description: '将当前商机同步到 ERP 系统创建订单',
  examples: ['同步这个订单到ERP', '把商机推送到ERP'],
  handler: async (context) => {
    const { opportunity } = context;
    const result = await syncToERP(opportunity);
    return {
      type: 'card',
      title: 'Order Sync成功',
      content: `订单号:${result.order_no}`,
      actions: [{ label: 'View订单', url: result.url }]
    };
  }
});

事件订阅

插件可以订阅 PWM CRM 的业务事件,在事件发生时触发 Serverless 函数执行。

// server/functions/onOpportunityWon.js
export default async function handler(event, context) {
  const { type, data } = event;
  
  if (type === 'opportunity.won') {
    // 商机赢单时,Auto同步到 ERP
    const order = await syncToERP(data.opportunity);
    
    // 在 PWM CRM Medium创建Follow-up Records
    await context.api.activities.create({
      customer_id: data.opportunity.customer_id,
      type: 'system',
      content: `商机已赢单,ERP 订单号:${order.order_no}`
    });
  }
  
  return { success: true };
}

插件Settings页

插件可以提供Settings页面,让用户配置插件参数。Settings页组件接收 settingsonChange 两个 props:

测试与调试

本地调试

使用 pwmapp plugin dev 启动开发服务器,Supports热更新。在浏览器开发者工具Medium可以View插件的 console 输出和网络请求。

单元测试

SDK 提供测试工具包,Supports Mock API Calls:

import { mockApi } from '@pwmapp/sdk/testing';

mockApi.customers.list.mockResolvedValue({
  items: [{ id: 'cus_001', name: '测试Client' }]
});

// 运行测试...

审核前检查清单

  • manifest.json 信息完整,权限声明最小化
  • 插件图标符合规范(512×512 PNG,圆角)
  • 所有外部请求使用 HTTPS
  • 不收集用户隐私数据(如需收集需明确告知)
  • 错误处理完善,不影响主平台稳定性
  • 提供完整的 README 和使用说明

上架流程

  1. Submit审核:使用 pwmapp plugin submit Submit插件到Plugin Marketplace
  2. 审核Medium:PWM CRM 团队进行安全审核和功能测试,通常 3-5 个工作日
  3. 审核通过:插件上架到Plugin Marketplace,所有用户可安装
  4. 发布更新:新版本同样需要审核,但流程更快(通常 1-2 个工作日)

企业私有插件:Enterprise用户可以将插件发布到企业私有Plugin Marketplace,仅本企业员工可见,无需公开审核。

示例插件

我们提供多个开源示例插件,帮助您快速上手:

  • Order Sync插件:商机赢单后Auto同步到 ERP 创建订单
  • Contract Management插件:在商机详情页添加Contract Management Tab,Supports电子签章
  • 营销Auto化插件:基于Client行为触发Auto化营销流程
  • 快消Shelf Check插件:拍照 AI 识别门店陈列问题,生成整改建议
  • 企业微信集成插件:双向同步Client、Follow-up Records,Supports消息通知

所有示例插件源码:https://github.com/pwmapp/plugin-examples

开发者Supports:如有开发问题,请加入开发者社区(Discord / 微信群),或Send邮件至 developer@pwmapp.com。Enterprise用户享受专属技术顾问Supports。