日期: 2026-05-29 版本: 1.0
在 tboss_oa_module(Flutter Add-to-App 模块)中实现完整的 OA 前端功能,嵌入现有 Android(Java/Kotlin)和 iOS(Objective-C)宿主应用。
#00ABF3 · UI 框架 TDesign Flutter 0.2.7采用 3 Tab 底部导航(消息 / 工作台 / 我的),使用 GoRouter + TDesign TabBar。
| Tab | 内容 | 图标 |
|---|---|---|
| 消息 | 审批通知 + 系统公告提醒 | bell |
| 工作台 | 功能入口 + 待办统计 + 报表入口 | app |
| 我的 | 我发起的 + 我审批的 + 草稿箱 + 设置 | user |
| 页面 | 路由 | 说明 |
|---|---|---|
| AppShell | / |
3 Tab 外壳,包含底部导航 |
| 消息列表 | /messages |
审批通知 + 公告提醒聚合 |
| 我的 | /profile |
个人中心 |
| 页面 | 路由 | 说明 |
|---|---|---|
| 报销单列表 | /expense/list |
状态筛选 + 卡片列表 + 左滑编辑 |
| 报销申请 | /expense/apply?id= |
分组表单 + 明细添加 + 存草稿/提交 |
| 报销单详情 | /expense/detail/:id |
信息展示 + 审批时间线 + 角色操作栏 |
| 页面 | 路由 |
|---|---|
| 报销申请列表 | /expense-apply/list |
| 报销申请表单 | /expense-apply/apply?id= |
| 报销申请详情 | /expense-apply/detail/:id |
| 页面 | 路由 |
|---|---|
| 加班列表 | /overtime/list |
| 加班申请 | /overtime/apply?id= |
| 加班详情 | /overtime/detail/:id |
| 页面 | 路由 |
|---|---|
| 用车列表 | /vehicle/list |
| 用车申请 | /vehicle/apply?id= |
| 用车详情 | /vehicle/detail/:id |
| 页面 | 路由 |
|---|---|
| 外出日志列表 | /outing-log/list |
| 外出日志创建 | /outing-log/create |
| 外出日志详情 | /outing-log/detail/:id |
| 页面 | 路由 |
|---|---|
| 公告列表 | /announcement/list |
| 公告详情 | /announcement/detail/:id |
| 页面 | 路由 |
|---|---|
| 报销明细报表 | /report/expense-detail |
| 报销申请明细报表 | /report/expense-apply-detail |
| 加班明细报表 | /report/overtime-detail |
| 用车明细报表 | /report/vehicle-detail |
┌─────────────────────────────┐
│ AppBar: 标题 [+] │
├─────────────────────────────┤
│ [全部] [待审批] [已通过] [已拒绝] ← 横向滚动状态筛选
├─────────────────────────────┤
│ ┌─────────────────────┐ │
│ │ BX-20240501-001 待审批 │ │ ← 卡片,点击进详情
│ │ 差旅费 · ¥2,380.00 │ │ ← 左滑露出编辑按钮
│ │ 张三 · 2024-05-01 │ │
│ └─────────────────────┘ │
│ ┌─────────────────────┐ │
│ │ BX-20240428-002 已通过 │ │
│ │ ... │ │
│ └─────────────────────┘ │
└─────────────────────────────┘
┌─────────────────────────────┐
│ AppBar: 标题 草稿 │
├─────────────────────────────┤
│ ┌─ 基本信息 ─────────────┐ │
│ │ 报销类型 差旅费 › │ │ ← FormFieldRow,点击弹出选择
│ │ 报销金额 ¥2,380.00 │ │
│ │ 备注 选填 › │ │
│ └────────────────────────┘ │
│ ┌─ 报销明细 +添加 ──┐ │
│ │ 机票 ¥1,308 ✕ │ │ ← 明细行,可删除
│ │ 酒店住宿 ¥848 ✕ │ │
│ └────────────────────────┘ │
├─────────────────────────────┤
│ [存草稿] [提交审批] │ ← 底部固定操作栏
└─────────────────────────────┘
┌─────────────────────────────┐
│ AppBar: 标题 │
├─────────────────────────────┤
│ ┌───────┐ │
│ │ ⏳ │ 待审批 │ ← 状态头部(颜色随状态变)
│ │ 当前审批人:王经理 │
│ └───────┘ │
│ ┌─ 基本信息 ─────────────┐ │
│ │ 报销单号 BX-... │ │ ← 键值对展示
│ │ 申请人 张三·销售部 │ │
│ │ 总金额 ¥2,380.00 │ │
│ └────────────────────────┘ │
│ ┌─ 审批进度 ─────────────┐ │
│ │ ● 提交申请 张三 5/1 │ │ ← 时间线
│ │ ● 经理审批 王经理 │ │
│ │ ○ 财务审批 待处理 │ │
│ └────────────────────────┘ │
├─────────────────────────────┤
│ [通过] [拒绝] │ ← 按角色显示不同按钮
└─────────────────────────────┘
┌─────────────────────────────┐
│ [日期范围 ▼] [类型 ▼] [部门 ▼] [查询] │ ← 筛选栏
├─────────────────────────────┤
│ ┌──────┐ ┌──────┐ │
│ │总金额 │ │总笔数 │ │ ← 汇总卡片
│ │¥12.8万│ │ 86 │ │
│ └──────┘ └──────┘ │
│ ┌─ 费用趋势 ─────────────┐ │
│ │ 📊 柱状图/折线图 │ │ ← fl_chart
│ └────────────────────────┘ │
│ ┌─ 明细列表 ─────────────┐ │
│ │ 差旅费 ¥35,200 28笔 │ │
│ │ 办公用品 ¥12,800 15笔 │ │
│ └────────────────────────┘ │
└─────────────────────────────┘
| 模型 | 字段数 | 状态 | 需补充 |
|---|---|---|---|
| ExpenseModel(报销单) | 22 | 缺3字段 | invoiceImages, paymentStatus, voucherNo |
| ExpenseDetailModel(报销明细) | 15 | ✅ 完善 | — |
| ExpenseApplicationModel(报销申请单) | 11 | 缺4字段 | estimatedStartDate, estimatedEndDate, urgency, projectId/Name, budgetSubjectId |
| ExpenseAppDetailModel(报销申请明细) | 5 | ✅ 基本够用 | — |
| OvertimeModel(加班申请单) | 16 | 缺3字段 | actualOtHours, clockInTime, clockOutTime, mealDeductHours |
| VehicleModel(用车申请单) | 19 | 缺4字段 | actualMileage, actualCost, startOdometer, endOdometer, returnTime, passengers[] |
| OutingLogModel(外出日志) | 30+ | ✅ 完善 | — |
| AnnouncementModel(公告) | 18 | ✅ 完善 | — |
共享模型:
ExpenseModel 补充:
List<String> invoiceImages; // 发票/附件图片URL列表
String paymentStatus; // 未付款/已付款/付款中
String voucherNo; // 财务凭证号
ExpenseApplicationModel 补充:
DateTime? estimatedStartDate; // 预计费用开始日期
DateTime? estimatedEndDate; // 预计费用结束日期
String urgency; // 普通/紧急/特急
String projectId; // 关联项目ID
String projectName; // 关联项目名称
String budgetSubjectId; // 预算科目ID
OvertimeModel 补充:
double actualOtHours; // 实际加班时长
DateTime? clockInTime; // 上班打卡时间
DateTime? clockOutTime; // 下班打卡时间
double mealDeductHours; // 用餐扣除时长
VehicleModel 补充:
double actualMileage; // 实际里程
double actualCost; // 实际费用
double startOdometer; // 起始里程表读数
double endOdometer; // 结束里程表读数
DateTime? returnTime; // 实际还车时间
List<String> passengers; // 同行人员姓名列表
| 角色 | 权限范围 | 标识 |
|---|---|---|
| 普通员工 | 发起申请、查看自己的数据、查看公告 | employee |
| 审批人(经理) | 审批下属申请 + 员工所有权限 | approver |
| 财务人员 | 全公司报销数据、确认付款、报表 | finance |
| 系统管理员 | 发布公告、全部数据、系统设置 | admin |
| 页面 | 员工 | 审批人 | 财务/管理员 |
|---|---|---|---|
| 工作台 | 我的申请统计 | +待我审批区块 | +全公司概览 |
| 列表页 | 自己的数据 | 下属+自己的 | 全部数据 |
| 详情页-按钮 | [编辑][撤回][删除] | [通过][拒绝] | [确认付款][关闭] |
| 报表 | 自己的统计 | 本部门 | 全公司 |
| 我的Tab | 我发起的+草稿 | +我审批的 | +我审批的 |
| 层级 | 实现方 | 机制 |
|---|---|---|
| 数据范围 | 后端 | API 根据 token 角色返回不同数据,前端不感知 |
| UI 可见性 | 前端 | 根据 currentUser.role 和单据状态条件渲染 |
| 报表筛选选项 | 混合 | 部门列表由后端返回可选范围,数据由后端按权限过滤 |
日期范围(起止日期)、部门、状态、申请人
| 报表 | 独有筛选维度 |
|---|---|
| 报销明细表 | 报销类型、项目、预算科目、发票类型 |
| 报销申请明细表 | 申请类型、紧急程度、项目 |
| 加班明细表 | 加班类型、补偿方式 |
| 用车明细表 | 车辆类型、驾驶员、自驾/配驾 |
重置筛选、应用筛选、数据导出(后端实现)
# pubspec.yaml 核心依赖
tdesign_flutter: ^0.2.7 # TDesign UI 组件库(新增)
flutter_riverpod: ^2.6.1 # 状态管理
go_router: ^14.8.1 # 路由
dio: ^5.7.0 # 网络请求
json_annotation: ^4.9.0 # JSON 序列化
intl: ^0.19.0 # 国际化/日期格式化
flutter_slidable: ^3.1.1 # 列表左滑操作
fl_chart: ^0.69.2 # 图表(报表用)
shimmer: ^3.0.0 # 骨架屏加载
lib/
├── main.dart
├── app.dart # App入口 + Provider初始化
├── core/
│ ├── auth/auth_service.dart # 认证(MethodChannel通信)
│ ├── network/
│ │ ├── api_client.dart # Dio封装
│ │ ├── api_exception.dart
│ │ ├── api_response.dart
│ │ ├── mock_data.dart # Mock数据
│ │ └── mock_interceptor.dart
│ ├── router/app_router.dart # GoRouter配置(含Shell路由)
│ ├── theme/
│ │ ├── app_colors.dart # 颜色常量
│ │ └── app_theme.dart # TDesign + Material3主题
│ └── utils/
│ ├── date_utils.dart
│ ├── responsive.dart # 横竖屏/宽屏适配
│ └── validators.dart
├── features/
│ ├── home/ # 工作台
│ ├── messages/ # 消息Tab(新增)
│ ├── profile/ # 我的Tab(新增)
│ ├── expense/ # 报销单
│ ├── expense_application/ # 报销申请单
│ ├── overtime/ # 加班申请单
│ ├── vehicle/ # 用车申请单
│ ├── outing_log/ # 外出日志
│ ├── announcement/ # 公告
│ └── report/ # 报表
└── shared/
├── models/
│ ├── approval_status.dart
│ └── pagination_model.dart
└── widgets/
├── app_card.dart
├── empty_state.dart
├── form_field_row.dart
├── form_section.dart
├── loading_widget.dart
└── status_tag.dart
iosBundleIdentifier: com.amtxts.tbossOaModule 已配置cd ios && pod install 后编译验证https://<host>/apiAuthorization: Bearer <token>){ "code": 0, "message": "ok", "data": ... }{ "list": [], "page": 1, "size": 20, "total": 100 }认证 | 方法 | 路径 | 说明 | |------|------|------| | POST | /auth/login | 登录获取token | | GET | /auth/current-user | 获取当前用户信息(含角色) |
工作台 | 方法 | 路径 | 说明 | |------|------|------| | GET | /home/summary | 首页统计数据 |
报销单 | 方法 | 路径 | 说明 | |------|------|------| | GET | /expense/list?status=&page=&size= | 报销单列表 | | GET | /expense/detail/:id | 报销单详情 | | POST | /expense/apply | 提交报销单 | | PUT | /expense/draft | 保存草稿 | | PUT | /expense/approve | 审批操作 |
报销申请单 | 方法 | 路径 | 说明 | |------|------|------| | GET | /expense-apply/list | 列表 | | GET | /expense-apply/detail/:id | 详情 | | POST | /expense-apply/submit | 提交 | | PUT | /expense-apply/draft | 草稿 | | PUT | /expense-apply/approve | 审批 |
加班申请单 | 方法 | 路径 | 说明 | |------|------|------| | GET | /overtime/list | 列表 | | GET | /overtime/detail/:id | 详情 | | POST | /overtime/apply | 提交 | | PUT | /overtime/draft | 草稿 | | PUT | /overtime/approve | 审批 |
用车申请单 | 方法 | 路径 | 说明 | |------|------|------| | GET | /vehicle/list | 列表 | | GET | /vehicle/detail/:id | 详情 | | POST | /vehicle/apply | 提交 | | PUT | /vehicle/draft | 草稿 | | PUT | /vehicle/approve | 审批 |
外出日志 | 方法 | 路径 | 说明 | |------|------|------| | GET | /outing-log/list | 列表 | | GET | /outing-log/detail/:id | 详情 | | POST | /outing-log/create | 创建 |
公告 | 方法 | 路径 | 说明 | |------|------|------| | GET | /announcement/list | 列表 | | GET | /announcement/detail/:id | 详情 | | POST | /announcement/publish | 发布(管理员) |
报表 | 方法 | 路径 | 说明 | |------|------|------| | GET | /report/expense-detail?startDate=&endDate=&... | 报销明细报表 | | GET | /report/expense-apply-detail?... | 报销申请明细报表 | | GET | /report/overtime-detail?... | 加班明细报表 | | GET | /report/vehicle-detail?... | 用车明细报表 |
消息 | 方法 | 路径 | 说明 | |------|------|------| | GET | /messages/list | 消息通知列表 | | PUT | /messages/:id/read | 标记已读 |
| 决策 | 选择 | 理由 |
|---|---|---|
| 导航模式 | 3 Tab(消息/工作台/我的) | 参考钉钉,职责清晰 |
| 列表样式 | 卡片式 + 状态筛选 | 钉钉/企业微信标准,现有代码兼容 |
| 表单样式 | 分组表单 + 底部操作栏 | OA 行业惯例,FormSection 已有 |
| 详情页 | 双角色同页 | 减少页面数,审批流程内嵌 |
| 报表 | 筛选+汇总卡+图表+列表 | fl_chart 已引入 |
| 权限 | 后端控数据 + 前端控 UI | 安全 + 灵活 |
| TDesign 集成 | 替换主题 + 逐步替换组件 | 保持现有架构,渐进增强 |