# Conflicts: # .env.example # config/runtime.js # pages/profile/profile.vue # stores/session.js # tests/page-contract.test.mjs # vite.config.js
96 lines
8.1 KiB
Markdown
96 lines
8.1 KiB
Markdown
# PDA 作业端
|
|
|
|
面向仓库现场人员的移动作业应用。
|
|
|
|
技术方案:使用 uni-app Vue 3 开发,页面采用 Vue 3 兼容的 Options API,适配仓库 PDA 设备。
|
|
|
|
当前静态原型范围:人员登录、模块化工作台、入库/出库/库存/查询入口、作业记录、个人中心,以及出库模块内的箱号选择、扫码输入、整单拣货、部分拣货、异常原因、撤销和完成提交。
|
|
|
|
三期装柜取证已具备接口适配基础:拣货页展示空仓、半仓、满仓、锁仓和带锁码照五类证据,经 File 服务上传取得真实 `fileId`,并展示待上传、上传中、失败、成功和重试状态。产品已确认 PDA 只能现场拍照,Admin 可人工上传;每类至少 1 张有效照片、同类型可多张追加,错误或重复照片只作废不硬删除。当前页面和上传队列仍按会话内单类型记录设计,尚未完整达到“多图追加+作废审计”契约。
|
|
|
|
登录后默认进入首页,不再直接进入拣货。首页采用入库、出库、库内作业、查询四个分组的三列宫格,不设置常驻底部导航;作业记录收纳在左上角功能菜单,个人中心从右上角人员入口进入。第一版本只有“出库 → 集装箱拣货”可点击并具备完整本地状态交互,其余业务入口统一置灰并禁用,保留在界面中用于确认后续信息架构。
|
|
|
|
## 页面与状态结构
|
|
|
|
- `pages/login/login`:登录与作业仓库选择,是应用首屏;
|
|
- `pages/home/home`:按业务分组的具体作业入口;
|
|
- `pages/module/module`:入库、出库、库存、查询四类业务入口;
|
|
- `pages/operation/operation`:非拣货业务共用的静态任务页;
|
|
- `pages/history/history`:本次会话的作业记录;
|
|
- `pages/profile/profile`:人员、班次、仓库信息及退出登录;
|
|
- `pages/scanner-test/scanner-test`:Android 硬件扫描广播诊断页;
|
|
- `pages/picking/picking`:集装箱拣货完整交互。
|
|
|
|
登录会话集中在 `stores/session.js` 并持久化到设备,拣货会话集中在 `stores/picking.js`。认证请求由 `api/http.js` 统一处理:Access Token 临近过期时使用 Refresh Token 轮换;并发请求共享一次刷新;401 刷新成功后只重放一次;Refresh Token 明确失效时清理会话和作业草稿并返回登录页,网络或服务异常不会误清会话。产品契约要求未提交拣货草稿持久化到设备,并绑定作业员、任务和柜次,其他账号不能继承;成功提交或明确放弃后才清理。页面头部与底部主导航位于 `components/`,演示账号、模块和任务数据位于 `data/demo-data.js`,跨页面 PDA 视觉规则位于 `styles/pda.scss`。
|
|
|
|
拣货原型会在本次登录会话内按箱保存本地草稿和最近扫码结果。已确认的正式流程是:进入任务即由后端标记“拣货中”;扫码只更新本地草稿,员工点击提交时才将整批明细写入后端,不逐码提交。允许部分拣货或跳拣,但每个未完成项必须填写异常原因,并挂起任务、阻断完成和 `LOADED`。当前草稿尚未持久化到设备,这是实现缺口,不代表允许离线作业。
|
|
|
|
正式 PDA 作业必须联网。断网时不能开始正式拣货、提交、完成任务或推进 `LOADED`;网络恢复后由员工刷新并重试。提交使用对员工不可见的轻量幂等键和服务端版本:重复提交返回原结果,版本冲突提示刷新。项目不建设离线业务提交队列。
|
|
|
|
拣货页面和本地交互以 `../../docs/悦/PDA拣货/pda-picking.html` 为依据。PDA 采用 uni-app 开发并支持在线更新;Android App 端已按广播模式接入:Action=`android.intent.action.SCANRESULT`,字符串 Extra=`value`;拣货页的扫码框仅显示广播值和当前接收目标样式,不获取输入焦点或弹出软键盘,页面隐藏或销毁时会注销接收器。当前保留演示任务,同时已有三期拣货、装柜证据和完成操作的远程接口适配;只有会话包含真实 Token、客户标识和入仓单标识时才会请求服务端,不会把缺少契约字段的本地操作模拟为远程成功。设备型号不构成开发、发布或验收门禁;正式鉴权和任务领取按服务端契约接入。
|
|
|
|
扫码输入统一使用 `components/ScanTargetInput.vue` 展示和选择目标,组件本身不注册广播。每个业务页面只在 `onShow` 注册一次广播、在 `onHide`/`onUnload` 注销,并通过页面内的 `activeScanField` 将广播值路由到当前选中的字段。多输入框页面应由用户点击切换蓝色“当前扫码”目标,避免多个输入框或隐藏页面同时消费同一次扫描。
|
|
|
|
声音反馈统一由 `utils/audio-feedback.js` 管理,内部复用一个 `uni.createInnerAudioContext()`,连续调用时会停止上一段声音,业务页面不要自行创建播放器:
|
|
|
|
```js
|
|
import { playSuccessSound, playErrorSound } from '@/utils/audio-feedback.js'
|
|
|
|
playSuccessSound()
|
|
playErrorSound()
|
|
```
|
|
|
|
应用需要主动停止或释放播放器时,可分别调用 `stopFeedbackSound()` 和 `destroyFeedbackSound()`。
|
|
|
|
## 自动检查
|
|
|
|
项目未引入 npm 依赖,状态规则和页面契约使用 Node.js 内置测试运行器:
|
|
|
|
```powershell
|
|
node --test tests/*.test.mjs
|
|
```
|
|
|
|
当前环境验证使用 Node.js 22。测试同时约束 Vue 3 入口、页面契约和本地拣货状态规则。项目尚无 HBuilderX CLI、可核实的 Android 构建命令或自动化 UI 测试设施。
|
|
|
|
## 已确认但尚待实现/验收
|
|
|
|
- 将未提交草稿持久化到设备,并按作业员、任务和柜次隔离及恢复。
|
|
- 提交真实批量拣货明细,并覆盖幂等重放、版本冲突刷新和异常挂起。
|
|
- 将五类证据从单槽位模型改为多图追加,补错误记录作废及 Admin 人工上传。
|
|
- 在目标 Android PDA 上验证状态栏、导航栏、软键盘避让、连续扫描、重复码、低电量和前后台切换。
|
|
- 按既定 uni-app 在线更新安排完成正式发布,并在目标设备验证扫描、网络和前后台行为。
|
|
|
|
## 仍待产品确认
|
|
|
|
- 同一柜次是否允许多人并行拣货,以及任务拆分/合并口径。
|
|
- 退出任务或换班时是否释放任务、由谁接管草稿。
|
|
- 批量提交超时、业务错误和网络恢复后的具体提示与重试交互。
|
|
- 谁触发最终 `LOADED`,是否需要 Admin 二次复核。
|
|
- 哪些 Admin 角色可人工上传照片,以及照片可见范围和留存期限。
|
|
- 锁码格式、长度和唯一性规则。
|
|
|
|
一期需要确认是否与管理后台头程订单及仓库任务同步上线。
|
|
|
|
## App 在线更新
|
|
|
|
Android App 启动后会读取 `VITE_PDA_UPDATE_URL` 并检查国内 PDA 的独立更新通道,员工也可在“个人中心 → 检查更新”手动触发;H5 仅展示 App 操作提示,不执行更新。更新服务接收 `appid`、`platform`、`appVersion`、`appVersionCode`、`wgtVersion` 查询参数,无更新返回 `{ "update": false }`,有更新返回:
|
|
|
|
```json
|
|
{
|
|
"update": true,
|
|
"packageType": "apk",
|
|
"versionName": "0.0.2",
|
|
"versionCode": 2,
|
|
"downloadUrl": "https://updates.example.com/pda/domestic/0.0.2.apk",
|
|
"mandatory": false,
|
|
"releaseNotes": "本次更新内容"
|
|
}
|
|
```
|
|
|
|
`packageType` 只允许 `apk` 或 `wgt`。`mandatory=true` 时员工不能跳过,并在下载或安装失败后提供重试;wgt 安装完成会立即重启,APK 交由 Android 安装器完成覆盖安装。正式发布要求:
|
|
|
|
1. 国内 PDA 每次整包发布同时递增 `manifest.json` 的 `versionName` 与整数 `versionCode`,使用国内独立 AppID、包名和签名打包 APK。
|
|
2. wgt 发布至少递增 `versionName`,并使用与已安装原生包兼容的 uni-app 编译器生成;新增原生模块、权限或不兼容运行时能力时必须发布 APK,不能只发 wgt。
|
|
3. 更新清单与下载地址使用 HTTPS,先在测试设备验证可选更新、强制更新、断网重试、APK 覆盖安装、wgt 重启及扫码作业回归,再切换正式清单。
|
|
4. 国内和海外更新记录、文件目录及发布权限保持隔离,服务端必须按请求中的 `appid` 拒绝跨应用更新包。
|