Files
AIOA/README.md
T
2026-07-18 19:20:07 +08:00

90 lines
3.3 KiB
Markdown

# AIOA
AI 原生移动办公系统。项目采用“纵向业务闭环优先”的实施方式,首个里程碑是请假审批闭环。
## 当前范围
首期只实现:
- OIDC 登录与当前用户
- 基础组织、岗位和角色
- 请假申请、审批、驳回、撤回和流程时间线
- 附件、站内通知和审计
- AI 辅助填写请假单、查询流程进度
不在首期实现:全面微服务、多 Agent、自主审批、复杂知识库、生产级 Kubernetes 集群。
## 仓库结构
```text
backend/ Kotlin + Spring Boot 模块化单体
mobile/ Flutter 移动客户端
ai-service/ Python AI 服务
contracts/ OpenAPI 与事件契约
deploy/ 本地与部署配置
docs/ 产品、架构和开发文档
scripts/ 开发辅助脚本
```
## 开发环境
- JDK 21
- Docker 28+
- Docker Compose v2
- Flutter stable(与当前主机架构一致)
- Python 3.11+
复制 `.env.example``.env` 后,可使用 `docker compose --env-file .env -f deploy/compose/compose.yaml up -d` 启动基础依赖。
本地 PostgreSQL 暴露在 `127.0.0.1:15432`,避免与系统或其他项目常用的 `5432` 端口冲突。
千问 AI 服务通过 `QWEN_API_KEY` 环境变量读取密钥。密钥只能放在被 Git 忽略的本地 `.env` 或部署密钥系统中,不得写入 `.env.example`、代码、镜像或 Flutter 客户端。启动 AI 服务:
```bash
docker compose --env-file .env -f deploy/compose/compose.yaml up -d ai-service
```
Android 模拟器登录前运行 `scripts/dev-android-reverse.sh`,使 Keycloak 的固定开发 Issuer `http://localhost:8081/realms/aioa` 与 Android 回调环境保持一致,并允许访问 MinIO 预签名地址。iOS Simulator 可直接使用默认本机地址。
后端测试:
```bash
cd backend
export JAVA_HOME=/usr/local/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home
export GRADLE_USER_HOME=/tmp/aioa-gradle-home
./gradlew --no-daemon test
```
当前实施范围和验收标准见 [docs/product/mvp.md](docs/product/mvp.md)。
一键执行本地提交前验证:
```bash
./scripts/verify-all.sh
```
需要同时生成 Android 和 iOS Simulator 构建产物时:
```bash
AIOA_FULL_BUILD=1 ./scripts/verify-all.sh
```
Flutter 已实现 Schema 驱动的请假表单卡片演示,详见 [docs/engineering/mobile-schema-forms.md](docs/engineering/mobile-schema-forms.md)。
## 持续集成
仓库根目录的 `.gitlab-ci.yml` 默认执行:
- JDK 21 后端测试,并上传 JUnit 报告;
- Python 3.12 AI 服务编译检查与测试;
- Flutter 格式检查、静态分析和测试;
- Android Debug APK 构建与产物归档。
流水线不需要数据库、Keycloak 或千问密钥。iOS 构建需要带 Xcode 的 macOS GitLab Runner,配置 Runner 后按流水线文件末尾的说明启用。
## 移动推送
移动端使用 Firebase Cloud Messaging,同时承载 Android FCM 与 iOS APNs。生产构建需要分别提供 Firebase 项目的 `google-services.json``GoogleService-Info.plist`,后端通过 `FIREBASE_CREDENTIALS_FILE` 指向 Firebase Admin 服务账号 JSON。凭证文件必须由部署密钥系统挂载,不得提交到仓库。
未配置 Firebase 时,Flutter 会自动降级,站内通知仍然可用;后端推送 outbox 会保留并延迟重试。FlutterFire 当前最低支持 iOS 15,因此项目部署目标已统一调整为 iOS 15。