家政服务行业近年来呈现爆发式增长,但多数企业仍在使用纸质登记、Excel表格等传统管理方式。我在为本地多家家政公司提供技术咨询时发现,订单错乱、人员调度低效、财务对账困难是行业普遍痛点。为此,我们团队开发了一套基于Java技术的全流程订单管理系统,经过6个月的实际运行验证,帮助合作企业将订单处理效率提升300%,客户投诉率下降65%。
这套系统采用Spring Boot+MyBatis Plus+Vue.js技术栈,包含PC管理后台和微信小程序双端应用。特别针对家政行业特有的"服务非标化""人员流动性大""服务周期长"等特点,设计了弹性订单流和智能调度算法。下面从技术选型、核心模块、特色功能三个维度进行详细拆解。
选择Spring Boot 2.7作为基础框架,主要基于以下考量:
数据库采用MySQL 8.0+Redis组合方案:
sql复制CREATE TABLE `order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL COMMENT '订单编号规则:日期+类型+序列号',
`customer_id` bigint NOT NULL,
`worker_id` bigint DEFAULT NULL COMMENT '接单后才关联',
`service_type` tinyint NOT NULL COMMENT '1-住家保姆 2-钟点工...',
`start_time` datetime NOT NULL,
`end_time` datetime DEFAULT NULL,
`emergency_contact` json DEFAULT NULL COMMENT '紧急联系人JSON存储',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '0-待派单 1-已接单...',
`payment_status` tinyint DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_order_no` (`order_no`),
KEY `idx_worker_status` (`worker_id`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
管理后台采用Vue 3+Element Plus组合:
微信小程序选择Uniapp框架:
技术选型经验:家政从业人员年龄偏大,界面设计必须遵循"大字体、高对比、少步骤"原则。我们所有操作控制在3步以内完成,关键按钮尺寸不小于44×44pt。
传统派单方式依赖人工经验,我们开发了基于规则引擎的智能派单系统:
java复制public class DispatchRuleEngine {
@Resource
private WorkerService workerService;
public Worker dispatchOrder(Order order) {
// 规则1:优先匹配服务技能
List<Worker> candidates = workerService.queryQualifiedWorkers(
order.getServiceType(),
order.getStartTime());
// 规则2:就近分配(基于高德API计算距离)
candidates.sort(Comparator.comparingDouble(
w -> DistanceUtil.calculate(
w.getLocation(),
order.getAddress())));
// 规则3:平衡接单量
candidates.sort(Comparator.comparingInt(
w -> w.getCurrentOrderCount()));
return candidates.isEmpty() ? null : candidates.get(0);
}
}
实际运行中还需考虑:
家政订单具有复杂生命周期,我们采用状态模式实现:
mermaid复制stateDiagram-v2
[*] --> 待派单
待派单 --> 已接单: 派单成功
已接单 --> 服务中: 开始服务
服务中 --> 待结算: 服务完成
待结算 --> 已完成: 支付完成
待派单 --> 已取消: 客户取消
已接单 --> 已取消: 超时未确认
服务中 --> 纠纷中: 客户投诉
纠纷中 --> 服务中: 协商继续
纠纷中 --> 已取消: 终止服务
对应代码实现:
java复制public class OrderStateMachine {
private OrderState currentState;
public void changeState(OrderEvent event) {
currentState.handle(this, event);
}
// 各状态处理逻辑
public static class PendingState implements OrderState {
@Override
public void handle(OrderStateMachine machine, OrderEvent event) {
if (event == OrderEvent.DISPATCH_SUCCESS) {
machine.setState(new AcceptedState());
} else if (event == OrderEvent.CUSTOMER_CANCEL) {
machine.setState(new CancelledState());
}
}
}
// 其他状态实现...
}
家政服务价格受多种因素影响:
我们采用策略模式实现动态计价:
java复制public interface PricingStrategy {
BigDecimal calculate(Order order);
}
@Service
public class EmergencyPricing implements PricingStrategy {
@Override
public BigDecimal calculate(Order order) {
if (order.isEmergency()) {
return order.getBasePrice().multiply(new BigDecimal("0.2"));
}
return BigDecimal.ZERO;
}
}
// 使用时组合所有策略
public BigDecimal getTotalPrice(Order order) {
return pricingStrategies.stream()
.map(s -> s.calculate(order))
.reduce(order.getBasePrice(), BigDecimal::add);
}
为解决服务过程不透明的问题,系统提供:
技术实现要点:
javascript复制// 微信小程序端位置上报
wx.startLocationUpdate({
success: () => {
setInterval(() => {
wx.getLocation({
type: 'gcj02',
success: (res) => {
api.reportLocation(orderId, res.latitude, res.longitude);
}
});
}, 300000); // 每5分钟上报一次
}
});
针对家政行业常见的预付款纠纷,系统实现:
支付流程关键代码:
java复制@Transactional
public PaymentResult handlePayment(Order order, PaymentRequest request) {
// 1. 创建托管交易
Escrow escrow = escrowService.create(order);
// 2. 调用支付渠道
PaymentResponse response = paymentGateway.pay(
request.getChannel(),
request.getAmount(),
order.getOrderNo());
// 3. 更新订单状态
if (response.isSuccess()) {
order.setPaymentStatus(PaymentStatus.PAID);
orderMapper.updateById(order);
// 4. 触发服务开始
eventPublisher.publishEvent(
new PaymentSuccessEvent(order.getId()));
}
return convertResponse(response);
}
针对家政行业早高峰集中访问特点,我们采取:
java复制public boolean acceptOrder(Long orderId, Long workerId) {
String lockKey = "order_accept:" + orderId;
try {
// 使用Redis分布式锁
boolean locked = redisLock.tryLock(lockKey, 10, TimeUnit.SECONDS);
if (!locked) {
throw new BusinessException("当前订单正在处理中");
}
Order order = getById(orderId);
if (order.getStatus() != OrderStatus.PENDING) {
return false;
}
order.setWorkerId(workerId);
order.setStatus(OrderStatus.ACCEPTED);
return updateById(order);
} finally {
redisLock.unlock(lockKey);
}
}
系统上线后关键指标提升:
后续优化计划:
实际部署中发现,家政公司IT基础设施普遍薄弱,我们特别提供了:
在系统推广过程中,最大的挑战不是技术问题,而是改变用户习惯。我们总结出"3个1"培训法:
这种渐进式培训方案使50岁以上的阿姨群体也能在两周内熟练使用系统。技术赋能传统行业,需要既懂代码又懂业务场景的跨界思维,这是我们项目最宝贵的经验。