---
1. 离线下单核心逻辑
本地数据库缓存
- 技术选型:使用SQLite(Android)或CoreData/Realm(iOS)存储订单数据。
- 数据结构:
```json
{
"order_id": "临时ID(如时间戳+随机数)",
"user_id": "用户唯一标识",
"items": [{"product_id": "商品ID", "quantity": 2}],
"address": "收货地址",
"status": "pending_sync", // 待同步状态
"timestamp": "创建时间"
}
```
- 操作流程:
1. 用户下单时,数据先写入本地数据库,标记为`pending_sync`。
2. 显示“订单已保存,网络恢复后自动提交”的提示。
队列管理
- 优先级队列:按时间戳排序,确保先下单的先同步。
- 去重机制:通过`order_id`避免重复提交。
---
2. 网络恢复检测与同步
网络状态监听
- Android:通过`ConnectivityManager`监听网络变化。
- iOS:使用`NWPathMonitor`(Network框架)检测Wi-Fi/蜂窝数据。
- 跨平台方案:React Native(`@react-native-community/netinfo`)或Flutter(`connectivity_plus`)。
同步触发条件
1. 网络从断开变为连接时,立即启动同步。
2. App从后台切回前台时,检查是否有待同步订单。
同步流程
```javascript
// 伪代码示例
async function syncPendingOrders() {
const pendingOrders = await db.getOrdersByStatus(pending_sync);
for (const order of pendingOrders) {
try {
const response = await api.submitOrder(order);
if (response.success) {
await db.updateOrderStatus(order.id, synced);
} else {
// 记录失败原因,重试或提示用户
}
} catch (error) {
// 网络中断,保留订单状态为pending_sync
break;
}
}
}
```
---
3. 万象源码部署适配
源码修改点
1. 订单服务层:
- 封装离线订单的CRUD操作到独立模块(如`OfflineOrderManager`)。
- 在API调用层拦截请求,若网络不可用则存入本地。
2. UI层适配:
- 下单按钮禁用状态联动网络状态。
- 同步成功/失败后更新订单列表状态(如添加“同步中”标签)。
3. 定时任务:
- 使用`WorkManager`(Android)或`BackgroundTasks`(iOS)定期检查网络并触发同步。
配置示例(假设使用React Native)
```javascript
// 在App启动时注册网络监听
useEffect(() => {
const unsubscribe = NetInfo.addEventListener(state => {
if (state.isConnected) {
syncPendingOrders();
}
});
return () => unsubscribe();
}, []);
```
---
4. 异常处理与用户体验
- 冲突解决:若服务器已存在相同订单(如用户在其他设备下单),提示用户选择覆盖或合并。
- 数据安全:本地数据库加密(如SQLCipher),防止敏感信息泄露。
- 用户通知:同步成功时通过Toast/Banner提示,失败时显示重试按钮。
---
5. 测试场景
1. 完全离线:验证订单是否存入本地且不丢失。
2. 网络波动:模拟断网后恢复,检查是否自动重试。
3. 并发订单:快速连续下单,确保队列顺序正确。
4. 低电量模式:确保后台同步不被系统终止。
---
6. 部署建议
- 灰度发布:先在小范围用户中测试离线功能稳定性。
- 监控埋点:统计同步失败率、平均同步延迟等指标。
- 文档更新:在帮助中心说明离线功能的限制(如商品库存可能变化)。
---
通过以上方案,生鲜App可在无网络时保障用户下单体验,并在网络恢复后无缝同步数据,兼顾可靠性与实时性。具体实现需根据万象源码的实际架构调整,例如是否支持插件化扩展或需要修改核心模块。