| New file |
| | |
| | | # WMS Flutter AI 开发文档 |
| | | |
| | | ## 1. 文档目标 |
| | | |
| | | 本文档用于指导当前 WMS PDA 项目从 `uni-app` 迁移到 `Flutter`,并建立一套适合 AI 协作开发的工程体系。 |
| | | |
| | | 核心目标: |
| | | |
| | | - 从 0 开始搭建一套可长期演进的 Flutter 客户端工程 |
| | | - 首期覆盖当前核心业务:登录、首页、设置、非订单组托、订单组托 |
| | | - 中间件一次设计到位,兼容后期业务复杂化、多人协作、灰度发布、离线补偿、审计追踪 |
| | | - 建立 AI 可稳定参与的开发流程,降低后续新增需求的沟通和返工成本 |
| | | |
| | | --- |
| | | |
| | | ## 2. 当前项目背景 |
| | | |
| | | 当前项目是一个基于 `uni-app + Vue2 + uView UI` 的 PDA 仓储客户端,核心链路如下: |
| | | |
| | | 1. 登录 |
| | | 2. 权限菜单首页 |
| | | 3. 设置页 |
| | | 4. 非订单组托 |
| | | 5. 订单组托 |
| | | 6. 多语言支持 |
| | | |
| | | 现有系统特点: |
| | | |
| | | - 登录态、服务端地址、业务开关依赖本地缓存 |
| | | - 请求层已有统一拦截器 |
| | | - 页面结构偏“业务页直连接口” |
| | | - `Main / NoMain` 存在重复页面 |
| | | - 已经出现“业务配置驱动页面行为”的趋势 |
| | | |
| | | 这意味着 Flutter 迁移不能只做页面翻译,而要顺手完成架构升级。 |
| | | |
| | | --- |
| | | |
| | | ## 3. 迁移原则 |
| | | |
| | | ### 3.1 业务原则 |
| | | |
| | | - 首期只迁移当前稳定核心业务,不同时重构后端 |
| | | - 迁移期间保证旧版可回退 |
| | | - 优先保证 PDA 扫码、录入、提交链路稳定 |
| | | |
| | | ### 3.2 技术原则 |
| | | |
| | | - 先建基础设施,再开发业务页面 |
| | | - 先统一数据模型,再开发交互逻辑 |
| | | - 先定义中间件链路,再开发复杂流程 |
| | | - 避免把 `uni-app` 的页面复制逻辑原样搬到 Flutter |
| | | |
| | | ### 3.3 AI 协作原则 |
| | | |
| | | - 所有需求必须先形成结构化任务卡 |
| | | - 所有 AI 生成代码必须经过规则校验和人工验收 |
| | | - 所有模块都必须有明确输入、输出、边界 |
| | | - AI 只在稳定边界内增量开发,不直接跨层乱改 |
| | | |
| | | --- |
| | | |
| | | ## 4. 目标技术栈 |
| | | |
| | | ## 4.1 基础栈 |
| | | |
| | | - `Flutter 3.x` |
| | | - `Dart 3.x` |
| | | - 目标平台:`Android` |
| | | - 后续可扩展:`iOS` |
| | | |
| | | ## 4.2 推荐库 |
| | | |
| | | - 状态管理:`flutter_riverpod` |
| | | - 路由:`go_router` |
| | | - 网络请求:`dio` |
| | | - 数据模型:`freezed` + `json_serializable` |
| | | - 本地存储:`shared_preferences` |
| | | - 安全存储:`flutter_secure_storage` |
| | | - 国际化:`intl` |
| | | - 日志:`logger` |
| | | - 崩溃与监控:`sentry_flutter` |
| | | - 二维码/扫码:按 PDA 硬件方案接入,优先保留键盘输入兼容模式 |
| | | |
| | | ## 4.3 不建议的做法 |
| | | |
| | | - 不建议首期直接上过重的微前端式拆分 |
| | | - 不建议只靠单一全局 Provider 管整个应用 |
| | | - 不建议所有业务逻辑都写在 Widget / Controller 中 |
| | | - 不建议跳过中间件层直接把 Dio 当唯一基础设施 |
| | | |
| | | --- |
| | | |
| | | ## 5. 总体架构 |
| | | |
| | | 推荐采用分层架构: |
| | | |
| | | ```text |
| | | Presentation |
| | | ├─ Pages |
| | | ├─ Widgets |
| | | ├─ ViewModels / Notifiers |
| | | Application |
| | | ├─ UseCases |
| | | ├─ DTO Mappers |
| | | ├─ Workflow Coordinators |
| | | Domain |
| | | ├─ Entities |
| | | ├─ Value Objects |
| | | ├─ Repository Contracts |
| | | Infrastructure |
| | | ├─ API Clients |
| | | ├─ Local Storage |
| | | ├─ Device Services |
| | | ├─ Repositories |
| | | Middleware |
| | | ├─ Request Middleware |
| | | ├─ Auth Middleware |
| | | ├─ Route Middleware |
| | | ├─ Action Middleware |
| | | ├─ Sync Middleware |
| | | ├─ Audit Middleware |
| | | ``` |
| | | |
| | | 说明: |
| | | |
| | | - `Presentation` 只负责展示、输入、页面状态 |
| | | - `Application` 负责流程编排,不直接依赖页面 |
| | | - `Domain` 负责业务规则抽象 |
| | | - `Infrastructure` 负责接口、存储、设备、日志等实现 |
| | | - `Middleware` 负责跨模块横切能力 |
| | | |
| | | --- |
| | | |
| | | ## 6. 一步到位的中间件设计 |
| | | |
| | | 中间件不是只指网络拦截器,而是整个客户端的“横切能力总线”。 |
| | | |
| | | ### 6.1 必须首期落地的中间件 |
| | | |
| | | #### 6.1.1 Request Middleware |
| | | |
| | | 作用: |
| | | |
| | | - 统一追加 baseUrl |
| | | - token 注入 |
| | | - header 注入 |
| | | - 请求超时控制 |
| | | - 接口重试策略 |
| | | - 幂等控制 |
| | | - 请求日志输出 |
| | | |
| | | 建议落地方式: |
| | | |
| | | - 基于 `dio` 的 `Interceptors` |
| | | |
| | | #### 6.1.2 Auth Middleware |
| | | |
| | | 作用: |
| | | |
| | | - 登录态校验 |
| | | - token 失效自动跳登录 |
| | | - 刷新 token 预留 |
| | | - 匿名路由白名单 |
| | | |
| | | 建议落地方式: |
| | | |
| | | - 请求拦截 + 路由守卫双层控制 |
| | | |
| | | #### 6.1.3 Route Middleware |
| | | |
| | | 作用: |
| | | |
| | | - 页面访问鉴权 |
| | | - 首页动态菜单权限过滤 |
| | | - 环境检查 |
| | | - 必填前置条件检查 |
| | | |
| | | 示例: |
| | | |
| | | - 未登录不可进入业务页 |
| | | - 未配置服务端地址不可发起业务请求 |
| | | - 未选择订单不可进入订单组托详情页 |
| | | |
| | | #### 6.1.4 Action Middleware |
| | | |
| | | 作用: |
| | | |
| | | - 对关键业务动作统一增强 |
| | | - 适合后期复杂流程接入审批、校验、补偿 |
| | | |
| | | 需要覆盖的动作: |
| | | |
| | | - 登录 |
| | | - 扫码入库 |
| | | - 查询物料 |
| | | - 查询订单 |
| | | - 提交组托 |
| | | - 重置操作 |
| | | - 设置保存 |
| | | |
| | | 统一能力: |
| | | |
| | | - 参数校验 |
| | | - 埋点 |
| | | - 日志 |
| | | - 防抖 |
| | | - 权限判定 |
| | | - 规则校验 |
| | | - 失败补偿入口 |
| | | |
| | | #### 6.1.5 Config Middleware |
| | | |
| | | 作用: |
| | | |
| | | - 管理服务端配置 |
| | | - 管理业务开关 |
| | | - 管理页面字段显示配置 |
| | | - 管理灰度开关 |
| | | - 管理多租户差异配置 |
| | | |
| | | 建议将当前以下数据统一纳入配置域: |
| | | |
| | | - 服务地址 |
| | | - 端口 |
| | | - 项目标识 |
| | | - 是否复核 |
| | | - 是否多选 |
| | | - 条码切分规则 |
| | | - 字段显示配置 |
| | | - 字段编辑配置 |
| | | |
| | | #### 6.1.6 Audit Middleware |
| | | |
| | | 作用: |
| | | |
| | | - 记录关键动作日志 |
| | | - 支持问题追踪 |
| | | - 兼容后期审计要求 |
| | | |
| | | 建议首期记录: |
| | | |
| | | - 登录 |
| | | - 菜单加载 |
| | | - 关键查询 |
| | | - 组托提交 |
| | | - 设置修改 |
| | | |
| | | 日志字段建议: |
| | | |
| | | - `traceId` |
| | | - `userId` |
| | | - `deviceId` |
| | | - `action` |
| | | - `requestTime` |
| | | - `responseTime` |
| | | - `status` |
| | | - `errorCode` |
| | | - `errorMessage` |
| | | |
| | | #### 6.1.7 Sync Middleware |
| | | |
| | | 作用: |
| | | |
| | | - 为后期离线场景预留 |
| | | - 为弱网重试、失败补偿、延迟提交预留 |
| | | |
| | | 首期无需完整离线化,但架构必须预留: |
| | | |
| | | - 本地任务队列 |
| | | - 提交状态标记 |
| | | - 重试机制 |
| | | - 冲突处理策略 |
| | | |
| | | ### 6.2 后期可扩展中间件 |
| | | |
| | | - Feature Flag Middleware |
| | | - Workflow Middleware |
| | | - Approval Middleware |
| | | - Rule Engine Middleware |
| | | - Notification Middleware |
| | | - Device Capability Middleware |
| | | |
| | | --- |
| | | |
| | | ## 7. 模块拆分方案 |
| | | |
| | | ```text |
| | | lib/ |
| | | app/ |
| | | bootstrap/ |
| | | router/ |
| | | theme/ |
| | | l10n/ |
| | | core/ |
| | | constants/ |
| | | errors/ |
| | | middleware/ |
| | | network/ |
| | | storage/ |
| | | logging/ |
| | | utils/ |
| | | widgets/ |
| | | domain/ |
| | | auth/ |
| | | menu/ |
| | | settings/ |
| | | container_binding/ |
| | | order_binding/ |
| | | application/ |
| | | auth/ |
| | | menu/ |
| | | settings/ |
| | | container_binding/ |
| | | order_binding/ |
| | | infrastructure/ |
| | | auth/ |
| | | menu/ |
| | | settings/ |
| | | container_binding/ |
| | | order_binding/ |
| | | device/ |
| | | presentation/ |
| | | auth/ |
| | | home/ |
| | | settings/ |
| | | container_binding/ |
| | | order_binding/ |
| | | ``` |
| | | |
| | | 模块边界要求: |
| | | |
| | | - 每个业务域都必须有自己的 `domain / application / infrastructure / presentation` |
| | | - 跨域共享能力必须放 `core` |
| | | - 禁止页面直接调用 `dio` |
| | | - 禁止页面直接读写 `shared_preferences` |
| | | |
| | | --- |
| | | |
| | | ## 8. 当前业务到 Flutter 的映射 |
| | | |
| | | ### 8.1 auth |
| | | |
| | | 功能: |
| | | |
| | | - 登录 |
| | | - 记住账号 |
| | | - 语言切换 |
| | | - 服务端地址配置 |
| | | |
| | | 拆分: |
| | | |
| | | - `AuthPage` |
| | | - `LoginUseCase` |
| | | - `AuthRepository` |
| | | - `ServerConfigRepository` |
| | | |
| | | ### 8.2 home |
| | | |
| | | 功能: |
| | | |
| | | - 动态菜单 |
| | | - 权限过滤 |
| | | - 默认菜单兜底 |
| | | |
| | | 拆分: |
| | | |
| | | - `HomePage` |
| | | - `FetchMenuUseCase` |
| | | - `MenuRepository` |
| | | - `PermissionGuard` |
| | | |
| | | ### 8.3 settings |
| | | |
| | | 功能: |
| | | |
| | | - 业务开关 |
| | | - 条码截取规则 |
| | | - 字段显示配置 |
| | | - 字段编辑配置 |
| | | |
| | | 拆分: |
| | | |
| | | - `SettingsPage` |
| | | - `LoadSettingsUseCase` |
| | | - `SaveSettingsUseCase` |
| | | - `SettingsRepository` |
| | | |
| | | ### 8.4 container_binding |
| | | |
| | | 功能: |
| | | |
| | | - 托盘扫码 |
| | | - 物料扫码 |
| | | - 物料详情编辑 |
| | | - 组托提交 |
| | | |
| | | 拆分: |
| | | |
| | | - `ContainerBindingPage` |
| | | - `MaterialSelectPage` |
| | | - `ScanContainerCodeUseCase` |
| | | - `QueryMaterialUseCase` |
| | | - `SubmitContainerBindingUseCase` |
| | | |
| | | ### 8.5 order_binding |
| | | |
| | | 功能: |
| | | |
| | | - 订单列表模式 |
| | | - 全部明细模式 |
| | | - 多选 |
| | | - 复核 |
| | | - 组托提交 |
| | | |
| | | 重构原则: |
| | | |
| | | - 不保留 `Main / NoMain` 双页面复制结构 |
| | | - 统一为一个订单组托模块,通过模式参数控制 |
| | | |
| | | 推荐模型: |
| | | |
| | | - `OrderBindingEntryMode.withOrderList` |
| | | - `OrderBindingEntryMode.directDetailList` |
| | | |
| | | --- |
| | | |
| | | ## 9. AI 协作开发规范 |
| | | |
| | | ### 9.1 AI 的职责 |
| | | |
| | | AI 适合负责: |
| | | |
| | | - 页面骨架生成 |
| | | - DTO / Entity / Mapper 生成 |
| | | - UseCase 模板生成 |
| | | - Riverpod Provider 模板生成 |
| | | - 测试样板生成 |
| | | - 文档同步更新 |
| | | |
| | | AI 不直接负责最终拍板: |
| | | |
| | | - 业务规则真值 |
| | | - 安全策略真值 |
| | | - 发布决策 |
| | | - 复杂异常流程验收 |
| | | |
| | | ### 9.2 AI 任务卡模板 |
| | | |
| | | 每次开发前必须先生成任务卡: |
| | | |
| | | ```md |
| | | ## Task |
| | | - 模块: |
| | | - 页面: |
| | | - 目标: |
| | | |
| | | ## Input |
| | | - 接口: |
| | | - 字段: |
| | | - 配置项: |
| | | |
| | | ## Output |
| | | - 文件列表: |
| | | - 交互结果: |
| | | - 验收标准: |
| | | |
| | | ## Constraints |
| | | - 不允许改动: |
| | | - 依赖边界: |
| | | - 测试要求: |
| | | ``` |
| | | |
| | | ### 9.3 AI 开发流程 |
| | | |
| | | 1. 先读模块文档 |
| | | 2. 再读任务卡 |
| | | 3. 再读接口契约 |
| | | 4. 再生成代码 |
| | | 5. 生成人工验收清单 |
| | | 6. 更新文档和测试 |
| | | |
| | | ### 9.4 AI 代码验收门槛 |
| | | |
| | | - 能编译 |
| | | - 有空安全 |
| | | - 不跨层调用 |
| | | - 不把业务逻辑堆到 Widget |
| | | - Provider 生命周期清晰 |
| | | - DTO 与实体边界清晰 |
| | | - 至少有基本测试或验收步骤 |
| | | |
| | | --- |
| | | |
| | | ## 10. 开发阶段计划 |
| | | |
| | | ### 阶段 0:基础准备 |
| | | |
| | | 输出物: |
| | | |
| | | - Flutter 工程初始化 |
| | | - lint 规则 |
| | | - 目录结构 |
| | | - 路由骨架 |
| | | - 主题和国际化骨架 |
| | | - 中间件骨架 |
| | | |
| | | ### 阶段 1:基础设施 |
| | | |
| | | 输出物: |
| | | |
| | | - Dio 网络层 |
| | | - 请求中间件 |
| | | - Auth 中间件 |
| | | - 配置仓库 |
| | | - 安全存储 |
| | | - 日志系统 |
| | | |
| | | ### 阶段 2:基础模块 |
| | | |
| | | 输出物: |
| | | |
| | | - 登录模块 |
| | | - 首页模块 |
| | | - 设置模块 |
| | | |
| | | ### 阶段 3:核心业务 |
| | | |
| | | 输出物: |
| | | |
| | | - 非订单组托 |
| | | - 订单组托统一模块 |
| | | - 多选与复核 |
| | | |
| | | ### 阶段 4:增强能力 |
| | | |
| | | 输出物: |
| | | |
| | | - 埋点 |
| | | - 审计日志 |
| | | - 音效和震动 |
| | | - 失败重试 |
| | | - 弱网提示 |
| | | |
| | | ### 阶段 5:测试与上线 |
| | | |
| | | 输出物: |
| | | |
| | | - 回归测试清单 |
| | | - PDA 设备测试清单 |
| | | - 灰度发布方案 |
| | | - 回滚方案 |
| | | |
| | | --- |
| | | |
| | | ## 11. 中间件接口建议 |
| | | |
| | | ### 11.1 RequestMiddleware |
| | | |
| | | ```dart |
| | | abstract class RequestMiddleware { |
| | | Future<RequestContext> onRequest(RequestContext context); |
| | | Future<ResponseContext> onResponse(ResponseContext context); |
| | | Future<ErrorContext> onError(ErrorContext context); |
| | | } |
| | | ``` |
| | | |
| | | ### 11.2 ActionMiddleware |
| | | |
| | | ```dart |
| | | abstract class ActionMiddleware<TInput, TOutput> { |
| | | Future<TInput> before(TInput input); |
| | | Future<TOutput> after(TOutput output); |
| | | Future<void> onError(Object error, StackTrace stackTrace); |
| | | } |
| | | ``` |
| | | |
| | | ### 11.3 RouteGuard |
| | | |
| | | ```dart |
| | | abstract class RouteGuard { |
| | | Future<bool> canActivate(RouteContext context); |
| | | } |
| | | ``` |
| | | |
| | | ### 11.4 SyncTask |
| | | |
| | | ```dart |
| | | class SyncTask { |
| | | final String id; |
| | | final String type; |
| | | final Map<String, dynamic> payload; |
| | | final int retryCount; |
| | | final String status; |
| | | } |
| | | ``` |
| | | |
| | | 说明: |
| | | |
| | | - 中间件接口必须轻量、稳定、少业务语义 |
| | | - 业务特有规则写在 UseCase 或 Rule 层,不直接写死到中间件 |
| | | |
| | | --- |
| | | |
| | | ## 12. 数据与配置策略 |
| | | |
| | | ### 12.1 存储分层 |
| | | |
| | | - `SecureStorage`:token、敏感标识 |
| | | - `SharedPreferences`:业务设置、UI 偏好、服务器配置 |
| | | - `LocalDb`:后期离线任务、审计日志、缓存明细 |
| | | |
| | | ### 12.2 配置模型统一 |
| | | |
| | | 必须合并现有项目中分裂的配置概念: |
| | | |
| | | - 服务端配置:`serverConfig` |
| | | - 业务配置:`businessConfig` |
| | | - 功能开关:`featureFlags` |
| | | - 设备配置:`deviceConfig` |
| | | |
| | | 禁止继续出现: |
| | | |
| | | - 多套命名接近但含义重叠的缓存 key |
| | | |
| | | --- |
| | | |
| | | ## 13. 测试策略 |
| | | |
| | | ### 13.1 单元测试 |
| | | |
| | | 覆盖范围: |
| | | |
| | | - UseCase |
| | | - Repository |
| | | - Mapper |
| | | - 中间件 |
| | | |
| | | ### 13.2 组件测试 |
| | | |
| | | 覆盖范围: |
| | | |
| | | - 登录表单 |
| | | - 设置项渲染 |
| | | - 明细卡片 |
| | | - 底部操作栏 |
| | | |
| | | ### 13.3 集成测试 |
| | | |
| | | 覆盖范围: |
| | | |
| | | - 登录到首页 |
| | | - 托盘扫码到组托提交 |
| | | - 订单明细到组托提交 |
| | | - 多选流程 |
| | | - 配置切换后行为变化 |
| | | |
| | | ### 13.4 真机测试 |
| | | |
| | | 必须验证: |
| | | |
| | | - PDA 扫码枪输入 |
| | | - 软键盘兼容 |
| | | - 弱网超时 |
| | | - 连续扫码 |
| | | - 多语言切换 |
| | | - 屏幕适配 |
| | | |
| | | --- |
| | | |
| | | ## 14. 发布与运维建议 |
| | | |
| | | ### 14.1 环境划分 |
| | | |
| | | - `dev` |
| | | - `test` |
| | | - `staging` |
| | | - `prod` |
| | | |
| | | ### 14.2 发布要求 |
| | | |
| | | - 支持环境切换 |
| | | - 支持灰度用户 |
| | | - 支持日志追踪 |
| | | - 支持快速回滚 |
| | | |
| | | ### 14.3 监控建议 |
| | | |
| | | - 接口错误率 |
| | | - 登录失败率 |
| | | - 组托提交失败率 |
| | | - 页面崩溃率 |
| | | - 设备型号分布 |
| | | |
| | | --- |
| | | |
| | | ## 15. 风险与规避 |
| | | |
| | | ### 风险 1:直接照搬旧页面,导致 Flutter 项目继续重复 |
| | | |
| | | 规避: |
| | | |
| | | - 先做统一模块设计,再开始开发 |
| | | |
| | | ### 风险 2:中间件只做网络拦截,后期复杂业务接不住 |
| | | |
| | | 规避: |
| | | |
| | | - 首期同时落地 Request、Auth、Route、Action、Config、Audit、Sync 七类中间件 |
| | | |
| | | ### 风险 3:AI 一次生成过多代码,质量不可控 |
| | | |
| | | 规避: |
| | | |
| | | - 小任务卡开发 |
| | | - 模块内闭环验收 |
| | | - 分层校验 |
| | | |
| | | ### 风险 4:配置项越来越多,最终失控 |
| | | |
| | | 规避: |
| | | |
| | | - 从第一天开始建立统一配置模型和版本化迁移策略 |
| | | |
| | | --- |
| | | |
| | | ## 16. 第一版落地清单 |
| | | |
| | | 首批必须完成: |
| | | |
| | | - Flutter 工程初始化 |
| | | - 路由与主题 |
| | | - 国际化骨架 |
| | | - Dio + 请求中间件 |
| | | - 登录态管理 |
| | | - 配置中心 |
| | | - 日志与 traceId |
| | | - 登录页 |
| | | - 首页 |
| | | - 设置页 |
| | | |
| | | 第二批完成: |
| | | |
| | | - 非订单组托 |
| | | - 订单组托统一模块 |
| | | - 多选 |
| | | - 复核 |
| | | - 提交组托 |
| | | |
| | | 第三批完成: |
| | | |
| | | - 审计日志 |
| | | - 同步任务队列 |
| | | - 灰度开关 |
| | | - 崩溃监控 |
| | | |
| | | --- |
| | | |
| | | ## 17. 结论 |
| | | |
| | | 这次迁移的正确方向不是“把现有 uni-app 页面改写成 Flutter”,而是: |
| | | |
| | | - 用 Flutter 重建客户端基础设施 |
| | | - 用中间件把复杂业务的横切能力提前设计好 |
| | | - 用模块化分层承接长期演进 |
| | | - 用 AI 协作流程提升开发速度,但不牺牲工程边界 |
| | | |
| | | 只要首期把架构、中间件、配置中心、日志链路打稳,后续新增出入库、盘点、上架、下架、AGV、审批流、多仓、多租户,都可以在现有基础上继续扩展,而不需要再次推倒重来。 |