离线订单可视化与手动上传设计

设计日期:2026-09-16

项目仓库:/Users/liang/AndroidStudioProjects/CusumptionMachine

文档状态:Implemented

执行状态:已按确认设计完成业务代码落地,未执行 Git 暂存、提交或推送。

分页扩展状态:Implemented;默认每页 10 条,已实现动态页大小参数、查询加载状态与底部分页交互。

一、背景与目标

当前离线订单保存在本地 SQLite 数据库 order_db.db 的 t_order 表中,由首页 180 秒定时任务按系统配置走 HTTP 或 MQTT 通道自动补传。现有流程缺少面向设备操作人员的可视化入口,无法直接查看尚未完成的订单,也无法对单笔订单发起人工补传。

本次新增独立的“离线订单”页面,使操作人员能够查看仍需处理的离线订单并手动上传,同时保持原有定时同步机制、状态定义和自动重试策略不变。

二、范围与不变项

2.1 本次范围

2.2 明确不变

三、现有状态与展示规则

order_status含义页面是否展示手动操作
1待上传展示可点击“上传”
4上传中展示点击提示正在同步
3服务端明确业务失败不展示不再上传
9上传成功、已完成不展示无
order_type = 2 AND order_status IN (1, 4)

状态 1 → 4 时订单仍留在列表并显示“上传中”;4 → 3/9 时从列表消失;4 → 1 时重新显示“待上传”。

四、Use Case 契约

Use Case IDUC-OFFLINE-ORDER-001
Use Case 名称查看并手动上传离线订单
主要角色消费机操作人员
触发入口首页“离线订单”
优先级P0
状态Implemented
DoRREADY;服务端 msgid 幂等性作为实施前技术核验项,不改变已确认业务规则

4.1 主流程

  1. 操作人员从首页进入“离线订单”。
  2. 页面查询并展示状态 1、4 的订单及汇总信息。
  3. 点击待上传订单的“上传”,确认消费人、金额、时间和当前上传通道。
  4. 确认后系统重新读取订单并原子执行 1 → 4 抢占。
  5. 抢占成功后按 consume_submit_type 调用 HTTP 或 MQTT 单笔上传入口。
  6. 服务端返回成功,订单更新为 9 并从列表消失。

4.2 分支、异常与恢复

编号条件页面行为数据处理
A1点击状态 4 的订单提示“订单正在同步中,请勿重复操作”不修改状态
A2定时任务已先抢占提示正在同步保持当前状态
E1无网络或通道不可用提示网络或通道不可用不抢占;已抢占则条件恢复为 1
E2可重试业务失败提示可稍后重试条件更新 4 → 1
E3明确业务失败订单移出列表更新为 3
E430 秒未取得结果提示“上传超时,请稍后重试”按订单、本次上传时间条件执行 4 → 1
E5请求创建、入队或发布立即失败提示上传失败立即按本次尝试条件恢复为 1

五、首页入口设计

首页横向和竖向布局都按现有入口风格增加“离线订单”,位置固定为:

订餐核销 → 离线订单 → 余额查询

六、离线订单页面设计

6.1 页面结构

6.2 操作状态

6.3 动态刷新

6.4 分页查询与交互

6.5 手动上传确认弹框

七、组件与职责

组件职责
OfflineOrderActivity页面生命周期、5 秒当前页刷新、查询加载状态、分页交互、网络提示、确认弹框和结果提示
OfflineOrderListAdapter展示订单字段、状态和操作,使用差量更新
ManualOrderUploadManager二次校验、原子抢占、通道选择、30 秒超时、条件恢复和统一结果分发
ManualUploadOrderWorkerHTTP 模式只上传指定单笔订单,不遍历其他订单
MqttConnectionState保存离线订单上传链路使用的 MQTT 进程内状态并过滤重复变化
OfflineOrderPaginationPolicy统一默认页大小、总页数、页码校正和偏移量计算,支持任意合法页大小
OfflineOrderPage承载当前页订单、全局状态数量、有效页码、总页数和总条数
OrderManager增加页面查询、单笔读取和带本次上传时间的条件状态更新
CustomMqttService增加单笔上传动作、参数和回执关联处理
MqttSimple在初始化、成功、失败、连接丢失和主动断开时同步状态并发出变化事件

刷新周期、手动超时等规则统一定义为具名常量,并添加职责和并发边界注释,避免重复硬编码。

八、手动上传调度设计

8.1 统一入口

  1. 根据订单 ID 重新读取数据库,不信任列表缓存。
  2. 状态为 4 时返回“正在同步中”;状态不是 1 时刷新列表。
  3. 检查网络和当前通道,再原子执行 1 → 4 并记录本次 uploading_time。
  4. 只有更新行数为 1 的调用方获得本次上传所有权。
  5. 按 consume_submit_type 分派 HTTP 或 MQTT 单笔上传。
  6. 请求创建失败、通道立即失败或 30 秒超时,按订单、状态和本次上传时间条件恢复为 1。

8.2 HTTP 单笔上传

8.3 MQTT 单笔上传

九、并发与互斥

手动上传不暂停、不取消、不改写定时任务。两条路径共同使用本地数据库状态作为互斥锁:

状态 1 --原子抢占成功--> 状态 4 --请求成功--> 状态 9
                                |--可重试失败/30秒超时--> 状态 1
                                |--明确业务失败--> 状态 3

十、超时与晚到结果

规则时长用途
页面刷新周期5 秒动态反映本地状态并降低持续查询频率
定时自动上传周期180 秒保持现有 Alarm 调度
手动上传结果等待30 秒控制人工操作等待时长
上传中兜底恢复10 分钟保持现有异常进程恢复

十一、数据、日志与安全

十二、验收标准

编号验收内容
AC-001首页两套布局均显示“订餐核销 → 离线订单 → 余额查询”,并可进入页面
AC-002只展示 order_type=2 且状态为 1、4 的订单
AC-003状态 3、9 不显示,也不能通过页面再次上传
AC-004定时任务把订单改为 4 后,页面最迟 5 秒显示“上传中”
AC-005订单恢复为 1 后,页面最迟 5 秒恢复“待上传”
AC-006订单变为 3 或 9 后,页面最迟 5 秒移除
AC-007点击上传中的订单只提示正在同步,不产生新请求
AC-008手动与定时并发时,只有一个调用方成功执行上传
AC-009严格按 consume_submit_type 选择 HTTP 或 MQTT
AC-01030 秒无结果时提示超时,并仅恢复仍属于本次尝试的订单
AC-011180 秒定时同步和 10 分钟兜底恢复行为不变
AC-012页面退出停止刷新,但已发起上传继续完成并正确写库
AC-013页面动态展示 MQTT 的未启动、连接中、已连接和已断开状态,不影响定时同步
AC-014默认每页只查询 10 条,pageSize 集中定义并可在运行时替换,SQL 不写死页大小
AC-015分页栏显示上一页、页码/总页数/总条数和下一页,首尾页按钮正确禁用,无数据时隐藏
AC-016汇总数量始终为全局数量;当前页越界时自动回退到有效页
AC-017每次查询显示加载控件,完成或退出时隐藏;查询中不能重复翻页或并发读取
AC-018列表首列展示全局连续序号;默认第二页从 11 开始,动态调整页大小后仍按实际偏移量计数
AC-019手动上传确认使用项目通用弹框风格,取消不改变状态,确认继续执行原上传流程

十三、测试矩阵

测试编号场景预期结果
UT-001页面状态过滤只返回状态 1、4
UT-002同订单并发抢占只有一个更新成功
UT-003条件超时恢复订单、状态、本次上传时间都匹配才恢复
UT-004通道选择HTTP/MQTT 与配置一致
UT-005MQTT 状态快照状态可更新,重复或空状态不产生变化
UT-006分页计算任意合法页大小均正确计算总页数、有效页码和偏移量
UT-007页码越界恢复空数据、页码小于 1、总页数缩减时返回正确页码
UT-008分页序号计算第一页从 1 开始,后续页按动态页大小计算全局起始序号
IT-001手动先抢占、定时后执行定时任务跳过状态 4
IT-002定时先抢占、手动后点击提示正在同步,不重复请求
IT-003/004HTTP/MQTT 三类回执分别进入 9、1、3
IT-005手动任务 30 秒超时提示超时并条件恢复为 1
IT-006旧回调与新任务并发旧任务不能错误释放新任务
UI-001定时任务修改列表订单最迟 5 秒正确更新或移除
UI-002页面前后台切换前台刷新、后台停止、返回立即加载
UI-003MQTT 连接、断开和重连汇总区立即显示对应状态,订单定时同步不受影响
UI-004上一页、下一页和边界按钮目标页正确、列表回到顶部、首尾按钮正确禁用
UI-005当前页订单被同步移除总数更新,页码有效,末页清空后自动回退
UI-006查询加载状态查询开始显示进度条,结束、异常或退出均隐藏,加载中分页按钮不可重复触发
REG-001原有定时 HTTP/MQTT180 秒调度、重试和 10 分钟恢复无回归

性能边界:以 500 条待处理订单连续前台运行 10 分钟,页面查询不得阻塞主线程,不得出现明显滚动卡顿、重复弹窗或持续内存增长。

十四、实施影响清单

预计新增:OfflineOrderActivity、OfflineOrderListAdapter、页面与列表项布局、ManualOrderUploadManager、ManualUploadOrderWorker 及入口图标资源。

预计修改:首页跳转与两套布局、OrderManager、CustomMqttService、订单回执处理、清单注册、字符串资源和测试文件。

具体类名、资源名和包路径在实施计划阶段以当前代码结构为准,不在设计阶段假定不存在的公共抽象。

十五、风险与实施前核验

  1. 编码前通过接口契约或联调日志确认服务端对同一订单固定 msgid 的重复提交具备幂等处理。
  2. MQTT 回执必须能关联本次尝试;否则 30 秒后重试可能与晚到回执交错,需要补充可回显请求标识。
  3. 5 秒查询应在后台线程执行并使用差量刷新,避免阻塞主线程。
  4. 不复制完整定时批量逻辑;只复用请求组装和回执映射,调度入口与生命周期隔离。

十六、交付边界