记录日期:2026-07-13
项目仓库:/Users/liang/AndroidStudioProjects/CusumptionMachine
实施分支:fix_repeat_upload_order
针对离线订单在 HTTP 或 MQTT 上传链路中可能被多个调度任务重复提交的问题,落实客户端防重。范围仅包含本地订单状态、离线上传调度、HTTP Worker 与 MQTT 历史订单上传路径。
uploading_time 字段。1 待上传只有通过 UPDATE ... WHERE order_status = 1 才能变为 4 上传中。9 已完成;网络异常、MQTT publish 失败或本地保存失败恢复为 1;服务端明确业务失败更新为 3,不再重试。enqueueUniqueWork(..., ExistingWorkPolicy.KEEP, ...),避免同类 Worker 并发入队。OrderManager.saveOrder(...) 在已有未完成离线订单收到实时成功回包时,用成功结果覆盖原订单,修复原来仅更新旧对象导致状态持续为待上传的问题。CustomMqttService 和仍可被显式启动的 MqttForegroundService 都接入同一数据库抢占逻辑,防止两条 MQTT 路径交叉重复发布。app/src/main/java/com/cpt/cusumption/dataabase/OrderDatabaseHelper.javaapp/src/main/java/com/cpt/cusumption/order/OrderDao.javaapp/src/main/java/com/cpt/cusumption/order/OrderManager.javaapp/src/main/java/com/cpt/cusumption/receiver/AlarmReceiver.javaapp/src/main/java/com/cpt/cusumption/workmanager/UploadOrderWorker.javaapp/src/main/java/com/cpt/cusumption/service/CustomMqttService.javaapp/src/main/java/com/cpt/cusumption/service/MqttForegroundService.javaJAVA_HOME=$(/usr/libexec/java_home -v 1.8) sh ./gradlew :app:assembleDebug:通过。JAVA_HOME=$(/usr/libexec/java_home -v 1.8) sh ./gradlew :app:testDebugUnitTest:通过。msgid 做最终幂等保护;客户端状态机用于避免不必要的重复请求,不能替代服务端幂等。