通过浏览器自动化登录泛微OA系统,根据用户指令匹配流程ID,填写并提交流程表单。
支持两种操作模式:
oa-email-apply/
├── SKILL.md # 本文件(主技能)
├── _meta.json # 版本元数据
├── scripts/
│ └── check_deps.sh # 依赖检查+模式判定
└── references/
├── workflow_ids.md # 流程ID速查表(129个)
├── emailapplysop.md # 邮箱申请详细SOP
├── fixedassetsop.md # 固定资产申购详细SOP
├── expensereportsop.md # 费用报销详细SOP
└── retractsop.md # 流程撤回/删除SOP
扩展方式: 新增流程只需在「已支持流程」加条目 + references/ 加SOP文件。
流程ID完整列表见 references/workflow_ids.md,每次执行前必须读取该文件匹配workflowid。
匹配优先级:
常用匹配示例:
| 用户说的 | 匹配结果 | workflowid |
|---|---|---|
| --- | --- | --- |
| "走一个邮箱流程" | 企业邮箱账号新增/调整/关闭申请 | 1012 |
| "差旅费报销" | 差旅费报销流程 | 1549 |
| "费用报销" | 费用报销流程(差旅费和招待费除外) | 1547 |
| "员工离职" | 员工离职审批流程 | 1010 |
| "付款申请" | 提示选择:1454/1455/1456或代总部1607/1608 | |
| "合同审批" | 提示选择:1287供应商类/1288客户及其他 | |
| "请假" | 提示选择:1055 FBHR/1056 JTHR |
⚠️ 多结果时必须询问:关键词匹配到多个结果时,列出所有候选项供用户确认。
| workflowid | 流程名称 | 详细SOP |
|---|---|---|
| --- | --- | --- |
| 1012 | 企业邮箱账号新增/调整/关闭申请 | 邮箱申请SOP |
| 667 | SQ-固定资产申购流程 | 固定资产申购SOP |
| 1547 | 费用报销流程(差旅费和招待费除外) | 费用报销SOP |
| 其他126个 | 见 流程ID速查表 | 待补充SOP |
当用户要求撤回或删除已提交的流程时,参考 流程撤回/删除SOP。
bash scripts/check_deps.sh
脚本输出操作模式:
MODE=hybrid → bua+browser混合模式(推荐)MODE=browser → 仅browser降级模式MODE=unavailable → 不可用,需联系管理员根据模式选择后续操作方式。
从长期记忆(memory_recall)中检索OA账号信息,搜索关键词:OA账号 或 OA系统账号。
如果记忆中存在: 直接使用,跳过询问。
如果不存在,必须询问:
> 📋 首次使用OA流程技能,请提供以下信息:
> - OA 登录账号:
> - OA 登录密码:
>
> 账号密码将长期保存,后续无需重复提供。
用户回复后保存到长期记忆(memory_store),category: entity, importance: 0.95。
从长期记忆检索OA地址,默认为 http://oa.lcang.com:8080/。其他环境需用户确认。
bua snapshot能看到表单值和详细DOM标签,browser act/evaluate做交互更稳定。两者结合最佳。
登录OA:
bua open --url "<OA系统地址>"
sleep 2
bua snapshot --interactive
# 填写账号密码 → bua click @<登录按钮ref>
打开表单:
bua open --url "<OA系统地址>workflow/request/AddRequest.jsp?workflowid=<workflowid>&isagent=0"
sleep 3
bua snapshot --interactive
填写+提交: bua snapshot → bua fill/click → 重新snapshot确认 → bua click @提交
bua断连恢复:
bua tabs list
bua focus <Tn> # 切到活跃tab
bua snapshot --interactive # 重试
如果恢复失败,切换到模式B继续。
当bua不可用(未安装/服务未启动/持续断连)时,使用OpenClaw内置browser工具。
核心差异: browser snapshot只能看到交互元素(按钮、输入框),看不到表单字段标签和值。必须配合JS evaluate获取字段信息。
登录OA:
browser action=open url=<OA系统地址>
browser action=snapshot interactive=true
browser action=act request.kind=type ref=<账号输入框ref> request.text=账号
browser action=act request.kind=type ref=<密码输入框ref> request.text=密码
browser action=act request.kind=click ref=<登录按钮ref>
打开表单:
browser action=navigate url=<OA系统地址>workflow/request/AddRequest.jsp?workflowid=<workflowid>&isagent=0
填写表单(关键:用JS获取字段,用browser act做交互):
步骤1:JS获取字段列表和值
// browser action=act request.kind=evaluate
() => {
const inputs = document.querySelectorAll('input[type=text], input:not([type]), textarea');
const result = [];
inputs.forEach((inp, i) => {
const val = inp.value || '';
const name = inp.name || '';
if(name || val) result.push('idx=' + i + ' name=' + name.substring(0,20) + ' val=[' + val.substring(0,30) + ']');
});
return result.join('\n');
}
步骤2:JS获取字段标签映射
() => {
const browsers = document.querySelectorAll('.wea-browser, .wea-associative-search');
const result = [];
browsers.forEach((b, i) => {
const parent = b.closest('td');
const prevTd = parent ? parent.previousElementSibling : null;
const label = prevTd ? prevTd.textContent.trim() : '';
const val = b.textContent.trim().substring(0,30);
result.push('idx=' + i + ' label=' + label.substring(0,15) + ' val=[' + val + ']');
});
return result.join('\n');
}
步骤3:根据获取的信息,用browser snapshot+act填写
提交验证(JS方式):
() => {
const url = window.location.href;
const hasRequestId = url.includes('requestid=');
const title = document.title;
return 'url_has_requestid=' + hasRequestId + ' title=' + title;
}
隐藏菜单操作(撤回等,JS方式):
() => {
const items = document.querySelectorAll('.ant-menu-item');
for(const item of items) {
if(item.textContent.trim() === '强制收回') {
item.click();
return 'clicked 强制收回';
}
}
return 'not found';
}
根据用户指令,读取 references/workflow_ids.md 匹配 workflowid。多结果时询问。
根据检测到的模式选择操作方式(见上方双模式指南)。
校验: 页面标题包含公司名称或跳转到门户页。
⚠️ 不要通过菜单导航,直接用 AddRequest.jsp 直链
URL格式:
校验: 页面标题包含"创建"和流程名称。
⚠️ 提交前必须逐项与用户确认所有必填字段! 列出清单让用户确认,不要遗漏。
根据流程类型参考对应SOP,按当前模式操作。
通用填写规则:
提交成功标志:
iscreate=1 变为包含 requestid=数字截图保存到 /root/.openclaw/workspace/arkdrive_user_uploads/oa_<流程简称>_<日期>.png
推送流程信息:requestid、流程名称、关键字段。
| 问题 | 解决方案 |
|---|---|
| --- | --- |
bua报--session required | bua tabs list → bua focus → 重试;恢复失败则切换browser模式 |
| bua完全不可用 | 切换到browser降级模式,用snapshot+act+evaluate操作 |
| OA session超时 | 在重新登录对话框内填写账号密码,点击"登 录" |
| AddRequest.jsp页面空白 | Session已失效,重新登录 |
| 人员搜索无候选 | 多输几个字或确认姓名是否在OA通讯录中 |
| 提交后页面未跳转 | 检查必填字段是否已填写 |
| iframe显示about:blank | 不要用菜单导航,用AddRequest.jsp直链 |
| 下拉菜单项snapshot看不到 | OA隐藏菜单必须用JS document.querySelectorAll 遍历查找并click |
| browser snapshot看不到字段标签 | 用JS evaluate获取字段映射(见模式B步骤1-2) |
| combobox下拉选项snapshot后消失 | click combobox后立即snapshot,不要sleep |
| 收款人等浏览器字段无法填写 | 需通过OA人员浏览器组件交互,click搜索框→输入→选择候选 |
| Chrome调试端口未开启 | 执行 bash /opt/browser-vnc/start-chromium.sh 或联系管理员 |
requestid=数字+标题变化--session required后立即切换到browser工具操作| 版本 | 日期 | 变更 |
|---|---|---|
| --- | --- | --- |
| 1.0.1 | 2026-05-27 | 去掉bua硬依赖,增加browser降级模式;依赖检查改为模式判定;增加JS evaluate操作模板 |
| 1.0.0 | 2026-05-27 | 增加固定资产申购SOP、流程撤回SOP、核心规则 |
| 0.0.4 | 2026-05-26 | 重构为通用流程技能,129个workflowid,可扩展架构 |
共 2 个版本