mcpField
E
enterprise-patterns

enterprise-patterns

github.com/lubusin开发69106 次安装12 周前更新
代码仓库

关于 enterprise-patterns

面向构建生产级 Frappe 应用的架构技能,适用于开发 CRM、Helpdesk、HRMS 等多实体系统。介绍工作流、权限、审计记录、SLA、分配队列、通知和外部集成的设计模式。

主要功能

  1. 01用 DocType 和关联建模实体
  2. 02设计工作流和状态转换
  3. 03执行角色及行级权限控制
  4. 04记录活动与审计历史
  5. 05实现 SLA 和升级规则
  6. 06管理分配队列与外部集成

适用场景

  1. 01设计 CRM 或 Helpdesk 数据模型
  2. 02设置基于角色的工作流转换
  3. 03追踪变更和 SLA 超时
  4. 04分配记录并协调外部同步

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/lubusin/frappe-skills --skill enterprise-patterns

安装后在 Claude Code 中输入/enterprise-patterns确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
advanced-permissions.md
enterprise-patterns.md
integration-patterns.md
queue-patterns.md
sla-implementation.md
workflow-patterns.md

详细介绍

Frappe 企业级模式

用于构建生产级企业应用的架构模式。

适用场景

  • 构建 CRM、Helpdesk、HRMS 或类似的多实体系统
  • 设计由 SLA 驱动的工作流
  • 实现分配和队列管理
  • 构建审计跟踪和活动日志
  • 与外部系统集成(电子邮件、电话、CRM)

所需输入

  • 系统类型(CRM/Helpdesk/自定义)
  • 核心实体及其关系
  • SLA 要求
  • 工作流状态和转换
  • 集成点

流程

0) 设计数据模型

从清晰、规范化的 DocType 开始:

Ticket (parent)
├── customer (Link: Customer)
├── assigned_to (Link: User)
├── status (Select: Open, In Progress, Resolved, Closed)
├── priority (Link: Priority)
├── sla (Link: SLA)
├── activities (Table: Ticket Activity)
└── response_by, resolution_by (Datetime)

关键模式:

  • 使用 Link 字段表示关系
  • 使用子表存储活动、时间线、明细项
  • 当目标 DocType 不固定时使用 Dynamic Link
1) 实现状态机

选项 A:Workflow DocType

  • 创建包含状态和基于角色的转换的 Workflow
  • 将其关联到你的 DocType

选项 B:用于提交流程的 docstatus

docstatus含义
0草稿
1已提交
2已取消

选项 C:使用自定义状态字段进行验证

def validate(self):
    allowed = self.get_allowed_transitions()
    if self.status not in allowed:
        frappe.throw(f"Cannot transition to {self.status}")
2) 设置权限

行级筛选:

  • 使用 User Permissions 按实体限制访问
  • 与 Role Permissions 结合使用

始终在 RPC 方法中重新检查:

@frappe.whitelist()
def update_ticket(name, status):
    doc = frappe.get_doc("Ticket", name)
    if not frappe.has_permission("Ticket", "write", doc):
        frappe.throw("Not permitted", frappe.PermissionError)
    doc.status = status
    doc.save()
3) 构建活动跟踪

使用 Activity Log 或自定义子表跟踪变更:

def on_update(self):
    if self.has_value_changed("status"):
        self.append("activities", {
            "action": "Status Change",
            "old_value": self._doc_before_save.status,
            "new_value": self.status,
            "timestamp": frappe.utils.now()
        })
4) 实现 SLA

SLA DocType:

SLA
├── entity_type (Link: DocType)
├── response_time (Duration)
├── resolution_time (Duration)
└── escalation_rules (Table: Escalation Rule)

创建时应用 SLA:

def after_insert(self):
    sla = get_applicable_sla(self)
    if sla:
        self.response_by = add_to_date(self.creation, hours=sla.response_time)
        self.resolution_by = add_to_date(self.creation, hours=sla.resolution_time)
        self.db_update()

监控违约情况(计划任务):

def check_sla_breaches():
    tickets = frappe.get_all("Ticket", 
        filters={"status": ["not in", ["Resolved", "Closed"]]},
        fields=["name", "resolution_by"]
    )
    for t in tickets:
        if frappe.utils.now_datetime() > t.resolution_by:
            mark_sla_breached(t.name)
5) 分配和队列

轮询分配:

def assign_next_agent(queue):
    agents = frappe.get_all("Queue Member",
        filters={"queue": queue, "available": 1},
        fields=["user", "current_load"],
        order_by="current_load asc"
    )
    if agents:
        return agents[0].user
    return None

Assignment Rules DocType 用于自动分配。

6) 通知和升级

配置 Notification DocType,用于:

  • SLA 即将违约
  • 分配变更
  • 状态转换
  • 客户回复

升级链:

Level 1 (0h): Notify assigned agent
Level 2 (4h): Notify team lead
Level 3 (8h): Notify manager
Level 4 (24h): Notify department head
7) 外部集成

在 integrations/ 模块中集中管理:

# my_app/integrations/email_connector.py
def sync_emails():
    # Fetch from Email Account
    # Create Communications
    # Link to Tickets

使用后台任务进行同步:

frappe.enqueue(
    "my_app.integrations.email_connector.sync_emails",
    queue="long",
    timeout=600
)

验证

  • 所有角色的工作流转换均正常
  • 在 API 层强制执行权限
  • 活动日志记录所有变更
  • SLA 计算正确
  • 通知正常触发
  • 集成同步运行无误

故障模式 / 调试

  • 绕过权限:检查 RPC 方法是否包含明确的权限检查
  • 未应用 SLA:确认计划任务正在运行
  • 未记录活动:检查 has_value_changed 的用法
  • 未发送通知:检查 Notification 规则和电子邮件队列

升级处理

参考资料

防护措施

  • 遵循 CRM/Helpdesk UI 模式:对于 CRUD 应用,请遵循 ui-patterns 技能,其中记录了官方 Frappe 应用中的应用外壳、导航、列表视图和表单模式。这包括侧边栏布局、快速筛选器、看板视图和详情面板。
  • 前端使用 Frappe UI:所有自定义企业前端都必须使用 Frappe UI(Vue 3 + TailwindCSS),绝不能使用原生 JS 或 jQuery
  • 谨慎设计工作流:实施前规划所有状态和转换;考虑回滚路径
  • 处理边缘情况:为工作流中的已取消、暂停和异常状态做好规划
  • 尽早测试性能:对高容量 DocType 和复杂查询运行负载测试
  • 重型操作使用后台任务:绝不让长时间运行的任务阻塞 Web 请求
  • 记录关键操作:使用 frappe.log_error() 和活动日志,以便进行审计

常见错误

错误失败原因修复方法
工作流过于复杂难以维护,令用户困惑尽可能保持工作流线性;拆分复杂流程
集成中缺少错误处理静默失败、数据不一致使用 try/except 包装外部调用;记录错误;添加重试逻辑
文档更新中的竞态条件数据损坏使用 frappe.db.get_value(..., for_update=True) 加锁
SLA 未处理时区面向全球用户时计算错误以 UTC 存储和比较;使用 frappe.utils.convert_utc_to_timezone
批量操作未使用队列超时、内存问题对大量记录执行操作时使用 frappe.enqueue()
角色名称硬编码角色变更时失效使用常量或设置来指定角色名称
自定义 UI 模式UX 不一致,令用户困惑研究并遵循 CRM/Helpdesk 应用外壳
前端使用原生 JS/jQuery增加维护负担,与生态系统不匹配始终使用基于 Vue 3 的 Frappe UI

评论

支持 Markdown