随着本地上门服务业务快速发展,家政预约平台的开发需求持续增长。一套家政系统除了基础的服务浏览、预约下单之外,多技师派单调度、完整的上门服务履约流程是整个系统的核心难点。技师派单负责将工单合理分配给符合条件的服务人员,服务流程定义从下单到验收评价全链路状态流转,共同支撑上门业务闭环。
本文将从系统整体架构、技师信息模块、预约工单生成、多技师派单调度、上门履约流程、地图能力、微信支付、后台统计、技术选型、后期扩展几个维度,讲解同城上门家政系统的开发要点。

完整的家政系统分为用户小程序、技师服务端、平台管理后台,部分业务场景支持家政企业商户端,四端共享同一套API服务层,保证工单状态数据实时同步。
面向消费用户,主要能力:
面向保洁、家电维修、洗护等上门服务技师:
用于平台统一管控业务:
整体架构示意:
用户小程序
|
技师端 ---- API服务层 ---- 平台管理后台
|
数据库(MySQL + Redis)技师是家政平台的核心资源,除基础账号信息外,还需要存储技能标签、服务半径、评分、排班档期等派单依赖数据。
技师信息数据表:
CREATE TABLE technician (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) COMMENT '技师姓名',
phone VARCHAR(20) COMMENT '联系电话',
avatar VARCHAR(255) COMMENT '头像',
skill_tags VARCHAR(200) COMMENT '技能标签,逗号分隔',
service_radius INT COMMENT '可服务半径(公里)',
lat DECIMAL(10,6) COMMENT '当前位置纬度',
lng DECIMAL(10,6) COMMENT '当前位置经度',
avg_score DECIMAL(3,2) COMMENT '平均服务评分',
status TINYINT DEFAULT 0 COMMENT '0待审核 1正常接单 2禁用',
is_online TINYINT DEFAULT 0 COMMENT '0离线 1在线接单',
create_time DATETIME
);服务项目查询接口(Node.js):
router.get('/service/list', async(req,res)=>{
const serviceList = await ServiceItem.findAll({
where:{
status:1
}
})
res.json({
code:200,
data:serviceList
})
})用户选择服务项目,填写上门地址、预约服务时间、业务备注,系统计算服务金额,生成家政工单。
工单金额计算函数:
function calculateWorkOrderAmount(serviceItem, params){
let total = serviceItem.price;
// 加急费、夜间服务费附加计算
if(params.is_urgent){
total += params.urgent_fee;
}
return total;
}创建预约工单逻辑:
async function createWorkOrder(userId,serviceItem,params){
const amount = calculateWorkOrderAmount(serviceItem,params);
const workOrder = await WorkOrder.create({
user_id:userId,
service_id:serviceItem.id,
appoint_time:params.appointTime,
address:params.address,
remark:params.remark,
user_lat:params.userLat,
user_lng:params.userLng,
amount:amount,
status:'待支付'
})
return workOrder;
}家政工单完整状态流转:
待支付
|
已支付
|
待派单
|
技师已接单
|
技师出发上门
|
上门签到
|
服务进行中
|
待用户验收
|
已完成派单支持自动加权派单、技师抢单两种模式,平台后台可自由切换。派单前置过滤条件:技师审核通过、在线接单、技能标签匹配、预约档期空闲、在服务半径范围内。过滤完成后综合距离、服务评分、当前在手工单负载做加权匹配;自动派单无人承接时,工单自动进入抢单池,也支持后台人工改派兜底。
工单调度状态常量:
const dispatchStatus = {
WAIT_DISPATCH:1, //待派单
AUTO_PUSH:2, //系统已推送
GRAB_ORDER_POOL:3, //抢单池中
TECH_ACCEPT:4, //技师已接单
ON_THE_WAY:5, //正在前往
ARRIVED:6, //已上门签到
SERVICING:7, //服务进行中
WAIT_CHECK:8, //待用户验收
FINISH:9 //订单完成
}技师抢单接口示例:
router.post('/technician/grabOrder',async(req,res)=>{
let orderId = req.body.orderId;
let techId = req.body.techId;
const orderInfo = await WorkOrder.findByPk(orderId);
if(orderInfo.dispatch_status !== dispatchStatus.GRAB_ORDER_POOL){
return res.json({code:500,message:"该工单不可抢单"})
}
await WorkOrder.update({
technician_id:techId,
dispatch_status:dispatchStatus.TECH_ACCEPT
},{
where:{id:orderId}
})
res.json({message:"抢单接单成功"})
})简易自动派单筛选逻辑:
// 简化版自动派单,筛选周边符合条件技师
async function autoDispatch(workOrder){
//从Redis获取用户地址周边在线、技能匹配技师列表
const techList = await getNearAvailableTechnician(workOrder.user_lat,workOrder.user_lng,workOrder.service_id);
if(techList.length === 0){
//无匹配技师,转入抢单池
await WorkOrder.update({dispatch_status:dispatchStatus.GRAB_ORDER_POOL},{where:{id:workOrder.id}});
return false;
}
//业务中可增加加权打分,此处取列表首位技师演示
const targetTech = techList[0];
await WorkOrder.update({
technician_id:targetTech.id,
dispatch_status:dispatchStatus.TECH_ACCEPT
},{where:{id:workOrder.id}});
return true;
}业务说明:实际项目中,还需要增加档期冲突校验、派单超时重试、人工改派接口,避免工单长时间无人处理。
家政上门业务强依赖地图服务,实现如下能力:
路线调用接口示例:
function getServiceRoute(start,end){
return axios.get(
"[https://api.map.com/direction](https://api.map.com/direction)",
{
params:{
origin:start,
destination:end
}
}
)
}用户提交预约工单之后,需要完成线上支付,支付完成工单进入待派单调度池。
支付业务流程:
用户提交预约工单
↓
生成业务工单记录
↓
调用微信支付接口
↓
用户完成小程序支付
↓
接收微信异步回调
↓
更新工单状态为待派单,触发派单任务支付回调示例代码:
router.post('/pay/notify', async(req,res)=>{
let orderId=req.body.orderId;
await WorkOrder.update({
status:"待派单"
},{
where:{
id:orderId
}
});
res.send("success");
})平台运营需要统计工单数量、技师绩效、平台营收佣金等业务指标。
统计每日工单数量SQL:
SELECT
DATE(create_time) AS day, COUNT(*) AS order_count
FROM work_order
GROUP BY day;统计平台已完成工单总营收:
SELECT
SUM(amount) AS total_income
FROM work_order
WHERE dispatch_status=9;技师维度服务统计:
SELECT technician_id,COUNT(id) AS service_num,AVG(score) AS avg_score
FROM work_order
WHERE dispatch_status=9
GROUP BY technician_id;通过统计数据,可以帮助运营人员掌握预约工单走势、技师服务质量、平台营收情况。
SpringBoot项目目录参考:
housekeeping‑system
├── user 用户模块
├── service 家政服务项目模块
├── technician 技师人员管理模块
├── workorder 预约工单核心模块
├── dispatch 多技师派单调度模块
├── payment 支付模块
└── admin 平台后台按照业务模块拆分代码,便于后续迭代扩展。
基础预约与派单调度搭建完成后,还可以根据业务场景拓展更多能力。
同城上门家政系统,不仅仅是简单的预约下单工具,核心在于多技师派单调度和完整的上门履约服务流程。
开发过程除基础CRUD接口之外,需要重点处理技师过滤匹配、派单兜底降级、工单状态机流转、上门签到等业务边界场景。通过合理设计数据表结构,借助Redis处理地理位置检索,可以搭建稳定的上门预约平台。基于系统可扩展特性,还可以叠加次卡套餐、企业预约、商家入驻等功能,适配多样化的本地上门服务业务需求。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。