UniApp 小程序与 APP 报工准备
简历中没有明确的 UniApp 生产项目,因此本篇用于岗位准备。回答时应把它说成可落地的方案,不要包装成已交付经验。
一、车间移动端最小闭环
text
登录 → 选择工单/工序 → 扫码确认物料或批次 → 填写报工 → 校验设备/位置
→ 本地暂存或提交服务端 → 显示处理结果 → 查询历史与异常移动端的重点不是页面数量,而是现场网络不稳定、扫码输入快、重复点击、账号共用、设备权限和提交后可追溯。
二、报工提交策略
在线状态
- 客户端生成
client_request_id。 - 发送工单、工序、批次、数量、设备和采集时间。
- 服务端验证身份、权限、工单状态、工序和幂等键。
- 返回业务记录号和明确状态。
离线状态
- 写入 SQLite 本地队列表,状态为
PENDING。 - UI 显示“已保存,待网络恢复同步”,不要伪装成服务端成功。
- 网络恢复后按创建顺序或业务优先级同步。
200/已处理视为成功,业务冲突转为CONFLICT,网络错误才自动重试。- 同步结果可查询,用户能看到失败原因和人工处理入口。
sql
CREATE TABLE pending_reports (
id INTEGER PRIMARY KEY AUTOINCREMENT,
client_request_id TEXT NOT NULL UNIQUE,
payload_json TEXT NOT NULL,
status TEXT NOT NULL,
attempts INTEGER NOT NULL DEFAULT 0,
last_error TEXT,
created_at TEXT NOT NULL,
synced_at TEXT
);三、扫码与防重复提交
- 扫码结果先做格式校验,再查询物料、批次或工单状态。
- 提交按钮进入 loading 状态,页面离开前保留本地草稿。
- 服务端以
client_request_id建唯一索引,不能只依赖按钮防抖。 - 重复响应要返回第一次业务结果,不能再次扣料或增加产出。
- 关键工序可增加设备绑定、工位范围、双人复核或 NFC 等控制,具体以业务规则为准。
四、微信小程序和 APP 的差异
| 项目 | 微信小程序 | APP |
|---|---|---|
| 权限 | 通过微信能力申请 | 需要原生权限和系统设置 |
| 存储 | 受平台容量和 API 限制 | 可使用 SQLite 等本地存储 |
| 网络 | 小程序请求域名白名单 | 可配置更多网络策略,但仍需 TLS |
| 扫码 | 使用平台扫码能力 | 可使用摄像头或原生扫码模块 |
| 发布 | 审核、体验版、正式版 | Android/iOS 打包、签名和版本审核 |
| 更新 | 平台版本和审核节奏 | 热更新边界由公司发布策略决定 |
公共代码只抽取校验、请求、同步和状态管理;涉及平台权限、推送、蓝牙和扫码时保留适配层,不在业务页面里堆平台判断。
五、前后端接口约定
json
{
"client_request_id": "mobile-20260929-000001",
"work_order_no": "WO-20260929-001",
"operation_code": "OP-010",
"batch_no": "BATCH-001",
"device_id": "DEVICE-07",
"produced_qty": 10,
"defect_qty": 1,
"client_created_at": "2026-09-29T16:00:00+08:00"
}响应至少区分:
accepted:服务端已接收并完成本地事务。processed:业务动作已完成。pending:已接收,等待异步处理。conflict:业务状态或数量冲突,需要人工确认。rejected:字段、权限或状态校验失败。
不要让移动端根据 HTTP 200 就判断业务成功,业务状态应有明确枚举。
六、测试清单
- 正常登录、Token 过期、退出和账号被禁用。
- 重复点击、重复扫码、重复请求和服务端超时。
- 无网络、弱网、网络恢复、杀进程和手机重启。
- 同一批次被两台设备同时报工,数量超过计划量和库存不足。
- 扫描无效批次、已关闭工单、权限外工单和错误工位。
- 版本升级后本地旧数据迁移、重试和冲突展示。
- 敏感信息脱敏、日志不记录 Token 和密码。
七、面试中的诚实回答
我目前简历中没有独立交付 UniApp 生产项目,因此不会把它说成已有经验。我的后端项目已经处理过订单状态、库存并发、第三方接口、异步任务和权限控制。移动端报工我会采用本地队列加服务端幂等,明确区分本地保存和服务端成功,再通过扫码、断网、重复提交和并发报工场景验证。入职后先按团队现有组件和发布流程交付一个闭环页面。
