1. 项目概述:带工作流审批的CRM系统源码解析
这套基于ThinkPHP+Uniapp的CRM系统源码,最吸引人的特点是内置了完整的工作流审批引擎。我在实际部署测试中发现,它的审批流设计非常贴合中小企业实际业务场景——从销售合同审批到费用报销,所有流程都能通过可视化配置实现,不需要修改核心代码。对于需要快速上线CRM又希望保留定制能力的企业来说,这种"开箱即用+灵活扩展"的组合确实能节省大量开发成本。
系统采用前后端分离架构,后端用ThinkPHP实现业务逻辑和审批引擎,前端用Uniapp构建跨平台应用。这种技术选型让二次开发变得异常简单:PHP开发者可以快速理解后端逻辑,而熟悉Vue的前端工程师能无缝接手Uniapp部分。我特别注意到源码里已经封装了多级审批、会签、转审等常见工作流模式,这比从零开发至少节省200人/天的工作量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能拆解与技术实现
2.1 工作流审批引擎设计
审批模块的核心在于WorkflowService这个类,它采用状态机模式管理审批流程。源码中预置了五种基础审批类型:
- 直线型审批(A→B→C)
- 会签审批(A+B+C同时审批)
- 或签审批(A/B/C任意一人审批)
- 条件分支审批(根据金额自动路由)
- 转审/加签动态调整
数据库设计也很讲究,wf_approval表用current_step和next_step字段实现流程推进,配合wf_approval_log表完整记录审批轨迹。我在测试时故意中断审批过程,系统能准确恢复到中断前的状态,这得益于事务日志的完善设计。
2.2 CRM业务模块深度整合
系统没有简单地把工作流作为独立模块,而是深度耦合了销售、客户、合同等核心业务:
- 客户信息变更触发审批(防止销售私自修改客户归属)
- 合同审批自动关联客户信用额度检查
- 退款申请联动财务系统预校验
这种设计使得业务操作天然具备审计追踪能力。我模拟了一个销售试图绕过审批直接签合同的场景,系统在保存前会自动检查contract_approval_status字段,未通过审批的合同根本无法进入生效状态。
3. 二次开发实战指南
3.1 开发环境快速搭建
建议使用PHPStudy集成环境,配置时特别注意Nginx伪静态规则:
nginx复制location / {
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php?s=$1 last;
}
}
前端开发则推荐VSCode+uniapp插件,创建项目时选择"导入已有项目",指向源码中的uniapp-crm目录。遇到白屏问题通常是路由配置错误,检查pages.json中的分包配置是否完整。
3.2 典型定制开发案例
案例1:增加审批层级
修改application/crm/service/WorkflowService.php中的getApprovalFlow方法:
php复制// 原代码
if ($amount < 5000) {
$steps = [['role'=>'sales_manager']];
}
// 修改后
if ($amount < 5000) {
$steps = [['role'=>'sales_manager'], ['role'=>'finance_audit']];
} elseif ($amount > 50000) {
$steps = [['role'=>'ceo']];
}
案例2:定制审批通知
Uniapp端的消息推送在/static/js/approval-notify.js中扩展:
javascript复制// 增加企业微信通知
function sendWXWorkNotify(approvalId) {
uni.request({
url: '/api/approval/wechat-notify',
method: 'POST',
data: { id: approvalId }
})
}
4. 部署与运维关键点
4.1 生产环境部署清单
- PHP版本必须≥7.3(实测7.4性能最佳)
- MySQL配置建议:
ini复制innodb_buffer_pool_size = 2G innodb_log_file_size = 256M - Redis缓存必装(处理并发审批锁)
4.2 常见问题排查手册
问题1:审批流卡住不动
- 检查
wf_approval表的current_status字段 - 查看
runtime/log目录下的工作流日志 - 常见原因:审批人账号被禁用或角色配置错误
问题2:Uniapp端白屏
- 先运行
npm run dev:mp-weixin测试小程序端 - 检查
manifest.json中的基础配置路径 - 尝试清除H5部署后的浏览器缓存(304问题)
5. 二次开发进阶技巧
5.1 审批性能优化方案
对于高频审批场景(如日报审批),建议:
- 使用Redis队列异步处理审批触发事件
- 在
WorkflowService中添加内存缓存:
php复制// 缓存审批流配置
$flows = Cache::remember('approval_flows', 3600, function() {
return Db::name('wf_template')->select();
});
5.2 与企业微信集成
源码预留了企业微信接口,在application/extra/wechat.php配置:
php复制return [
'corp_id' => '您的企业ID',
'approval_secret' => '审批应用Secret',
'agent_id' => 1000002
];
然后在审批通过事件中调用企业微信API同步状态。
这套源码最让我惊喜的是它的扩展性——上周刚用它给客户实现了与用友U8的对接,通过扩展AbstractApprovalHook类,只用三天就完成了ERP单据联动审批。对于预算有限又需要专业级CRM的企业,这确实是个宝藏项目。
