该方案典型业务场景与总体架构
1. 场景
1)移动审批:待办、已办、抄送;流程查看、意见填写、附件上传。
2)智能助手:结合 O2OA 的 AI/ML 能力(如会议纪要、表单填写建议)在端侧唤起。
3)通知触达:任务提醒、流程超时、公告播报。
4)资产/档案:移动端文件定位、在线预览、扫码入库。
2. 架构展示(文字版)
[O2OA 网关/API] ——(HTTPS/OIDC)—— [HarmonyOS App(ArkTS)] | |-- 原子化服务/卡片(待办数) | |-- WebView(表单H5 + JSBridge) | |-- WebSocket/SSE(实时提醒) [AI/搜索/文件] |-- Push/通知/深链(deeplink) | [信创数据库/操作系统/芯片栈]
端侧工程拆解(ArkTS / Stage 模型)
1. 推荐工程结构
/entry // 主 HAP /src/main/ets /entryability // 主 Ability(Stage) /pages // ArkUI 页面(待办/审批/设置) /components // 组件(列表卡片、状态视图) /common // 常量/工具/网络封装/存储 /services // 业务服务(auth、workflow、file) /resources // 字体/图标/多语言 module.json5 // 权限与元数据(INTERNET、NOTIFICATIONS…) /widget // 卡片 HAP(可选) /feature-x // 业务子模块(按需拆分)
2. 基础权限建议:按需最小化
统一认证:OIDC/OAuth2(PKCE)+ JWT
1. ArkTS:最小可用网络封装
// common/net.tsimport http from '@ohos.net.http';export async function request(url: string, options: { method?: string; headers?: Record<string,string>; body?: string } = {}) { const httpReq = http.createHttp(); try { const resp = await httpReq.request(url, { method: options.method ?? 'GET', header: options.headers ?? {}, extraData: options.body ?? '', expectDataType: http.HttpDataType.STRING, }); if (resp.responseCode >= 200 && resp.responseCode < 300) { return JSON.parse(resp.result ?? '{}'); } throw new Error(`HTTP ${resp.responseCode}: ${resp.result}`); } finally { httpReq.destroy(); } }
2. 带 Token 调用 O2OA
// services/workflow.ts import { request } from '../common/net'; import { tokenStore } from '../common/tokenStore'; const API_BASE = ' export async function fetchTodoList(page = 1, size = 20) { const token = await tokenStore.getAccessToken(); return request(`${API_BASE}/workflow/todo?page=${page}&size=${size}`, { headers: { 'Authorization': `Bearer ${token}` } }); }
H5 混合:ArkUI Web 组件 + JSBridge(推荐保留)
对于复杂表单/流程设计,用 O2OA 的 H5 能力更高效。原生负责导航、鉴权、系统能力(通知/文件/分布式),H5 负责表单与可视化。
1. 关键点
1)使用 Web
组件加载表单页:https://o2.example.com/h5/form?id=xxx
2)通过 注入 JS 或 URL Scheme 把 Token/用户信息安全传入(仅限同源 HTTPS)。
3)监听 H5 返回事件,在原生层做文件选取/拍照、扫码等。
2. ArkTS:Web 注入示例
// pages/FormPage.ets (片段)Web({ src: `https://o2.example.com/h5/form?id=${this.formId}`, controller: this.webCtrl }) .onPageEnd(async () => { const token = await tokenStore.getAccessToken(); // 仅在可信页面注入,与后端约定window.O2OA.setToken this.webCtrl.runJavaScript(`window.O2OA && window.O2OA.setToken(${JSON.stringify(token)})`); })
安全提示:只对受信域名白名单页面注入;生产启用 内容安全策略(CSP),并对 WebView 开启 HTTPS 强制与证书校验。
原子化服务/服务卡片(Form/Widget)
1. 用于「待办数量」「今日审批」「公告摘要」等 glance 信息。
2. 使用卡片的 FormProvider 定时/事件刷新;点击深链到对应页面(deeplink)。
卡片数据推送思路:
1. App 启动或收到推送 → 拉取 /workflow/todo/count
→ 更新卡片。
2. 设定 WorkScheduler 周期(后台受限场景尽量以推送事件触发)。
消息触达:系统通知 + 推送通道
1. 系统通知:到达即显,适合本地与实时提醒。
2. 云推送:后端(O2OA 或网关)与推送服务对接,按用户/角色推送消息,点击深链参数(如 taskId
)直达详情页。
3. 实时连接:在 App 前台可使用 WebSocket(或 SSE)同步待办数、在线消息。
4. 本地通知(示意):
// services/notify.tsimport notification from '@ohos.notificationManager'; export async function notify(text: string, deeplink?: string) { await notification.publish({ content: { notificationContentType: notification.ContentType.TEXT, normal: { text } }, label: 'o2oa', wantAgent: deeplink ? /* 构造 deep link */ undefined : undefined }); }
文件与拍照上传
1. ArkTS 端使用 文件选择/相机 能力获取 File
/uri
,通过表单上传到 /file/upload
。
2. 建议后端支持 分片/断点续传,大文件直传对象存储(后端签名换直传,端侧仅 PUT 到存储)。
3. 上传(简化示意)
// services/file.ts import http from '@ohos.net.http'; import { tokenStore } from '../common/tokenStore'; export async function upload(uri: string) { const token = await tokenStore.getAccessToken(); const httpReq = http.createHttp(); try { const resp = await httpReq.request('https://o2.example.com/api/file/upload', { method: http.RequestMethod.POST, header: {'Authorization': `Bearer ${token}`}, files: [{ name: 'file', filename: 'upload.bin', filePath: uri }] }); if (resp.responseCode !== 200) throw new Error('upload failed'); return JSON.parse(resp.result ?? '{}'); } finally { httpReq.destroy(); } }
分布式能力(可选)
1. 设备协同:在平板/手机/PC 形态间同步审批上下文(例如半填的表单草稿)。