1. 项目背景与核心需求
汽车预销售管理系统是4S店和汽车经销商的核心业务支撑平台。传统手工登记客户信息、纸质合同管理的模式已经无法满足现代汽车销售的需求。我们团队基于ThinkPHP+Vue技术栈开发的这套系统,主要解决以下行业痛点:
- 客户信息碎片化:销售顾问通过微信、电话等多渠道接触客户,但缺乏统一管理
- 订单状态不透明:从意向登记到最终交车涉及10余个环节,各部门协作效率低
- 营销效果难追踪:市场活动带来的线索转化率无法精确统计
- 库存周转率低下:畅销车型和滞销车型的配比缺乏数据支撑
系统设计的四个核心角色及其关键职能如下表所示:
| 角色 | 权限范围 | 典型工作场景 |
|---|---|---|
| 销售顾问 | 客户管理/试驾预约/订单创建 | 录入潜在客户信息、跟进购车意向、生成预订单 |
| 销售经理 | 团队管理/业绩统计/库存调配 | 查看销售漏斗数据、审批特殊折扣申请、调配库存车辆 |
| 财务专员 | 定金收取/贷款办理/发票管理 | 确认收款状态、对接银行金融产品、开具购车发票 |
| 系统管理员 | 基础数据/权限分配/系统维护 | 维护车型配置参数、设置业务流程节点、管理账号权限 |
实际开发中发现,销售经理角色需要特别关注"库存可视域"功能设计——既要能看到本店库存,又要受限不能查看其他门店的具体库存数字,这个权限控制点在后续架构设计中需要重点考虑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与架构设计
2.1 后端技术栈:ThinkPHP 6.0的实践考量
选择ThinkPHP 6.0而非5.1版本主要基于以下技术判断:
- 更完善的PSR规范支持(特别是PSR-15中间件标准)
- 原生支持Swoole协程环境(实测QPS提升3倍以上)
- 改进的ORM关联查询(解决N+1查询问题)
典型控制器代码结构示例:
php复制namespace app\controller;
use app\BaseController;
use app\model\PreOrder;
class Order extends BaseController
{
public function create()
{
// 使用验证器严格校验预订单字段
$data = $this->request->check([
'car_model_id' => 'require|number',
'client_mobile' => 'require|mobile',
'deposit' => 'require|float'
]);
// 事务处理确保数据一致性
return PreOrder::transaction(function() use ($data){
$order = PreOrder::create($data);
// 触发库存预占逻辑
event('OrderCreated', $order);
return json($order);
});
}
}
2.2 前端架构:Vue 3组合式API的优势
采用Vue 3而非Vue 2的主要收益体现在:
- Composition API使业务逻辑更好封装(特别是订单状态机逻辑)
- 更优的类型推导(配合TypeScript)
- 更小的运行时体积(gzip后约13KB)
销售看板的核心状态管理实现:
javascript复制// stores/sales.js
import { reactive, computed } from 'vue'
import { defineStore } from 'pinia'
export const useSalesStore = defineStore('sales', () => {
const state = reactive({
leads: [], // 潜在客户
orders: [], // 预订单
deliveries: [] // 交付中订单
})
// 计算属性
const conversionRate = computed(() => {
return (state.orders.length / state.leads.length * 100).toFixed(1)
})
// 异步动作
async function loadData(month) {
const res = await api.get(`/stats?month=${month}`)
Object.assign(state, res.data)
}
return { state, conversionRate, loadData }
})
2.3 前后端交互设计
针对汽车销售业务的高并发场景(如新车发布时的抢购),我们设计了特殊的数据交换协议:
- 长列表采用分块传输编码(Chunked Transfer Encoding)
- 价格敏感字段使用Decimal.js进行精确计算
- 文件导出功能结合WebSocket实现进度通知
接口安全方案:
- JWT令牌动态刷新(15分钟有效期)
- 敏感操作二次验证(短信验证码)
- 数据权限过滤(自动注入SQL WHERE条件)
3. 核心业务模块实现
3.1 客户生命周期管理
汽车销售客户的典型转化路径需要实现全流程追踪:
code复制潜在客户 → 试驾预约 → 报价协商 → 定金支付 → 贷款审批 → 车辆准备 → 最终交付
关键技术实现点:
- 使用状态模式(State Pattern)管理客户状态
- 历史变更记录采用MongoDB存储JSON diff
- 自动化提醒通过RabbitMQ延迟队列实现
状态机配置示例:
php复制// config/state_machine.php
return [
'customer' => [
'states' => ['new', 'test_drive', 'quoted', 'deposited', 'approved', 'delivered'],
'transitions' => [
'schedule_test_drive' => [
'from' => 'new',
'to' => 'test_drive'
],
// 其他状态转换规则...
]
]
];
3.2 库存智能匹配系统
解决"客户想要A配置但库存只有B配置"的行业难题:
-
基于Elasticsearch实现近似匹配:
- 颜色优先级算法(金属漆>普通漆)
- 配置差异打分(天窗+2分,座椅加热+1分)
-
跨店调货预测:
- 使用时间序列分析预测调货时长
- 考虑物流成本约束
3.3 金融方案计算引擎
封装不同银行的利率计算规则:
javascript复制// utils/finance.js
export class FinanceCalculator {
constructor(bankPolicy) {
this.policy = bankPolicy
}
calculate(amount, months) {
// 等额本息计算
const monthlyRate = this.policy.interestRate / 12
const factor = Math.pow(1 + monthlyRate, months)
return amount * monthlyRate * factor / (factor - 1)
}
}
// 使用示例
const icbc = new FinanceCalculator({ interestRate: 0.039 })
console.log(icbc.calculate(200000, 36)) // 输出月供金额
4. 权限系统深度设计
4.1 基于RBAC的权限模型
系统采用改进的RBAC模型,特点包括:
- 部门数据隔离(销售团队只能看到自己客户)
- 字段级权限控制(销售顾问看不到成本价)
- 临时权限授予(销售经理代班场景)
权限表结构设计:
sql复制CREATE TABLE `auth_assignment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '用户ID',
`role_code` varchar(32) NOT NULL COMMENT '角色编码',
`scope` json DEFAULT NULL COMMENT '数据范围限制',
`expire_time` datetime DEFAULT NULL COMMENT '过期时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_role` (`user_id`,`role_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 Vue前端的权限控制
实现方案:
- 路由级权限:通过meta.roles配置
- 组件级权限:v-permission指令
- 按钮级权限:usePermission组合式函数
动态路由注册逻辑:
javascript复制// permission.js
router.beforeEach(async (to) => {
const { getCurrentUserRoles } = useAuthStore()
const roles = await getCurrentUserRoles()
if (to.meta.roles && !to.meta.roles.some(r => roles.includes(r))) {
return '/403'
}
// 动态添加可访问路由
if (!router.hasRoute(to.name)) {
const routes = await generateRoutes(roles)
routes.forEach(r => router.addRoute(r))
return to.fullPath
}
})
5. 性能优化实践
5.1 高并发场景应对
在双十一促销期间的系统优化措施:
- 预售页面静态化(Nuxt.js生成)
- 订单提交队列削峰(Redis Stream)
- 库存检查本地缓存(Bloom Filter)
压测数据对比:
| 优化措施 | 单机QPS | 平均响应时间 |
|---|---|---|
| 原始方案 | 128 | 450ms |
| 静态化+缓存 | 2100 | 68ms |
| 加入消息队列 | 3500 | 32ms |
5.2 大数据量处理
年销售数据导出(超50万行)的解决方案:
- 使用PHP的生成器(yield)避免内存溢出
- 前端采用WebSocket进度通知
- 最终文件生成后OSS临时链接下载
后端导出代码片段:
php复制public function exportAnnualReport($year)
{
return response()->streamDownload(function() use ($year) {
$handle = fopen('php://output', 'w');
fputcsv($handle, ['日期', '订单数', '销售额']);
$query = Order::whereYear('created_at', $year)
->selectRaw('DATE(created_at) as date, COUNT(*) as count, SUM(amount) as total')
->groupBy('date')
->cursor();
foreach ($query as $row) {
fputcsv($handle, [
$row->date,
$row->count,
$row->total
]);
}
fclose($handle);
}, "sales_report_{$year}.csv");
}
6. 项目部署与运维
6.1 容器化部署方案
Docker Compose核心服务编排:
yaml复制version: '3'
services:
app:
build: ./docker/php
ports: ["9000:9000"]
depends_on: [redis, mysql]
volumes:
- ./:/var/www/html
web:
image: nginx:1.25
ports: ["80:80"]
volumes:
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
- ./public:/var/www/html/public
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
6.2 监控体系搭建
使用Prometheus+Grafana监控关键指标:
- 业务指标:试驾转化率、订单取消率
- 系统指标:API响应时间、数据库查询耗时
- 预警规则:5分钟内订单失败率>3%触发告警
Prometheus配置示例:
yaml复制scrape_configs:
- job_name: 'app'
metrics_path: '/metrics'
static_configs:
- targets: ['app:9000']
- job_name: 'mysql'
static_configs:
- targets: ['mysql:9104']
7. 典型问题与解决方案
7.1 微信支付回调处理
遇到的坑:微信支付通知可能重复发送
解决方案:
- 使用Redis原子操作实现幂等控制
- 回调日志落库前先写中间表
- 设置15秒的乐观锁超时
关键代码:
php复制public function handleWechatNotify($xml)
{
$redis = new \Redis;
$lockKey = "wxpay:{$xml->out_trade_no}";
// 获取分布式锁
if (!$redis->set($lockKey, 1, ['NX', 'EX' => 15])) {
return 'FAIL';
}
try {
// 处理业务逻辑
$this->updateOrderStatus($xml);
return 'SUCCESS';
} finally {
$redis->del($lockKey);
}
}
7.2 跨门店数据同步
挑战:不同地区门店网络质量差异大
最终方案:
- 采用ETCD实现配置中心
- 重要数据使用CRDT算法
- 断网时自动切换本地模式
同步策略对比表:
| 方案 | 实时性 | 网络要求 | 实现复杂度 |
|---|---|---|---|
| 直接数据库同步 | 高 | 专线 | 低 |
| 消息队列中转 | 中 | 普通宽带 | 中 |
| CRDT最终一致 | 低 | 可断续 | 高 |
8. 项目演进方向
当前系统在实际运行中,我们发现还有以下可优化空间:
-
销售预测模块:计划引入LSTM神经网络模型,利用历史销售数据预测未来三个月的车型需求,目前正在收集足够的时间序列数据
-
移动端体验:现有H5页面在低端安卓机上表现不佳,考虑用Uniapp重构关键流程页面,实测在华为畅享系列上有望提升40%的渲染速度
-
语音输入支持:销售顾问在带客户看车时需要快速记录需求,正在测试科大讯飞的语音转写SDK集成方案
-
电子合同存证:现有PDF合同需要升级为区块链存证版本,已与蚂蚁链技术团队进行初步对接
在技术架构层面,我们团队正在评估将部分服务迁移到Serverless架构的可能性,特别是促销活动期间临时扩容的营销计算任务,通过函数计算可以显著降低成本。实测一个典型的促销数据分析任务,在传统ECS上需要持续运行4小时(费用约15元),而改用函数计算后费用降至0.3元左右。
