该方案典型业务场景与总体架构
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 形态间同步审批上下文(例如半填的表单草稿)。





浙公网安备 33010602009829号