27 KiB
采购主链 RPA 一期 Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: 建成采购主链一期的轻量状态中心、统一 RPA 执行适配层、企业微信手机协同入口,以及支撑 OCR、返利中心、M5 流程追踪的最小可用中台。
Architecture: 采用“RPA 执行平台 + Python/MySQL 状态中心 + 本地 OCR + 企业微信 H5 协同”的分层方案。状态中心负责建单、节点状态机、幂等、待办、日志、审计和执行平台路由,底层 RPA 平台只负责外部系统操作与结果回传,企业微信只负责通知与手机端操作入口。
Tech Stack: Python、MySQL、HTTP API、RPA 执行平台(影刀 / 艺赛旗等)、企业微信应用、本地 OCR(PaddleOCR 优先)
0. 使用说明
本文件既可作为技术实施底稿,也可作为后续拆更细执行计划的母稿。
1. 文档定位
本文面向开发、测试、实施和项目负责人,目标是把 PLAN.md 进一步落成“可排期、可拆人、可建库、可对接口”的实施稿。
默认前提:
- 一期范围只覆盖
合同扫描件/合同系统 -> 返利中心采购协议 -> M5 采购订单 - RPA 执行平台负责页面操作
- Python + MySQL 负责状态中心
- 企业微信负责消息通知和 H5 处理入口
- OCR 一期采用本地部署方案
如果后续要正式开工,建议以本文件作为技术排期底稿,再补充具体工期、负责人和环境信息。
2. 推荐项目结构
当前仓库还没有正式代码结构,一期建议直接按下面的边界建工程,避免把流程编排、RPA 平台回调、企业微信回调、查询页混在一起。
AutoRpa/
├── 资料/
│ ├── PLAN.md
│ ├── 一期开发任务清单_表结构_API草案.md
│ └── 一期需求简版说明_业务版.md
├── backend/
│ ├── app/
│ │ ├── main.py
│ │ ├── config.py
│ │ ├── db.py
│ │ ├── models/
│ │ │ ├── job.py
│ │ │ ├── job_node.py
│ │ │ ├── user_task.py
│ │ │ ├── mapping_config.py
│ │ │ ├── job_artifact.py
│ │ │ └── job_event.py
│ │ ├── schemas/
│ │ │ ├── job.py
│ │ │ ├── task.py
│ │ │ ├── node_callback.py
│ │ │ └── wecom.py
│ │ ├── api/
│ │ │ ├── jobs.py
│ │ │ ├── tasks.py
│ │ │ ├── admin.py
│ │ │ └── wecom.py
│ │ ├── services/
│ │ │ ├── intake_service.py
│ │ │ ├── workflow_service.py
│ │ │ ├── retry_service.py
│ │ │ ├── task_service.py
│ │ │ ├── executor_router.py
│ │ │ ├── ocr_service.py
│ │ │ ├── mapping_service.py
│ │ │ ├── artifact_service.py
│ │ │ └── wecom_service.py
│ │ ├── integrations/
│ │ │ ├── rpa/
│ │ │ │ ├── base_adapter.py
│ │ │ │ ├── yingdao_adapter.py
│ │ │ │ └── isearch_adapter.py
│ │ │ ├── paddle_ocr_client.py
│ │ │ └── wecom_client.py
│ │ └── views/
│ │ └── h5_task_page.py
│ ├── migrations/
│ └── tests/
│ ├── api/
│ ├── services/
│ └── integration/
├── agent-contract/
│ ├── node_callback_examples.json
│ └── error_codes.md
└── deployment/
├── env.example
├── nginx.conf
└── systemd/
边界原则:
api/只收发请求,不放业务流程判断services/负责状态迁移、幂等、路由、重试、消息发送integrations/只封装外部系统调用executor_router.py统一决定节点该交给哪个平台执行models/和schemas/分开,避免数据库对象和接口对象互相污染
3. 自有能力边界与多平台策略
我们自己的能力必须沉淀在状态中心中:
- 流程主状态
- 合同入池、判重、幂等
- OCR 归档和映射配置
- 手机待办、人工协同、角色路由
- 成功判定、错误码体系、证据归档
- 多平台统一查询和统一审计
RPA 平台提供的是底层执行能力:
- 桌面/UI 自动化
- 文件上传下载
- 表单填写与模板导入
- 截图、日志、录屏
- 对状态中心发起回调
多平台切换边界必须明确:
- 支持“按新单切换平台”
- 支持“按节点配置平台”
- 不支持“半节点执行过程中跨平台接力”
- 平台切换前先跑统一 POC 用例
4. 里程碑与开发任务清单
Milestone 0:项目初始化与基础设施
目标:把后端服务、数据库连接、配置管理、日志规范先搭起来。
任务清单:
- 创建
backend/app/main.py,跑通基础 HTTP 服务 - 创建
backend/app/config.py,统一读取数据库、OCR、企业微信、RPA 平台回调密钥配置 - 创建
backend/app/db.py,封装 MySQL 连接和事务入口 - 建立
backend/tests/目录,先接入最基础的接口测试框架 - 创建
deployment/env.example,列出所有必需环境变量 - 定义统一日志字段:
trace_id、job_id、node_code、task_id
交付物:
- 服务能启动
- 健康检查接口可用
- 数据库连接可用
- 开发/测试环境变量模板可发给团队
Milestone 1:入池建单与判重
目标:把“共享目录文件 -> 状态中心建单 -> 判重 -> 可追踪 job”跑通。
任务清单:
- 建
job、job_artifact、job_event三张核心表 - 开发
POST /api/jobs建单接口 - 开发共享目录文件入池服务,读取文件基础元数据
- 实现文件哈希计算与
source_file_hash去重逻辑 - 实现业务唯一键判重逻辑:
合同编号 + 合同类型 + 供应商 + 发起来源 - 入池失败时生成事件记录和人工待处理状态
- 支持通过状态中心页面手工建单,作为共享目录监听的兜底入口
交付物:
- 同一合同重复上传不会生成多条未完成流程
- 文件命名异常可被识别并阻断
- 每次建单都有
job_id
Milestone 2:OCR 与映射规则
目标:把扫描件变成结构化字段,并明确哪些能自动映射、哪些必须转人工。
任务清单:
- 创建
mapping_config表和版本字段 - 建立 OCR 适配接口,统一输出 JSON
- 保存原始 OCR JSON 到
job_artifact - 实现供应商、货品、结算方式、承付模式映射服务
- 实现置信度阈值判断和低置信度转待办逻辑
- 为每个
job绑定mapping_version - 把字段识别结果、映射结果写入
job_event
交付物:
- OCR 结果可追溯
- 映射规则支持版本化
- 低置信度不会自动猜测后继续执行
Milestone 3:流程编排与节点状态机
目标:把节点开始、成功、失败、待人工、重试这些规则稳定下来。
任务清单:
- 创建
job_node表 - 定义节点状态枚举与状态迁移规则
- 定义节点尝试号
attempt_no - 开发节点开始接口
POST /api/jobs/{jobId}/nodes/{nodeCode}/start - 开发节点成功接口
POST /api/jobs/{jobId}/nodes/{nodeCode}/complete - 开发节点失败接口
POST /api/jobs/{jobId}/nodes/{nodeCode}/fail - 实现节点回调幂等控制
- 实现节点超时扫描与升级策略
交付物:
- 节点不会重复推进
- 同一节点重复回调时可安全去重
- 失败与超时都能落事件
Milestone 4:RPA 执行适配层与统一契约
目标:让底层 RPA 平台只做执行,不做流程主状态判断,并具备可切换能力。
任务清单:
- 输出
agent-contract/node_callback_examples.json - 定义统一的
base_adapter接口 - 实现
yingdao_adapter与isearch_adapter骨架 - 定义平台回调鉴权方式
- 约定统一回传字段:错误码、截图路径、日志路径、录屏路径、输出业务单号
- 约定节点编码字典,例如
OCR_EXTRACT、REBATE_IMPORT_ITEMS、M5_CREATE_ORDER - 定义平台失败错误码分层:系统类、业务类、配置类、页面变化类、能力不满足类
- 为每个节点定义能力标签,例如
desktop_ui、file_upload、excel_template、http_callback - 制作联调用的假回调脚本或 Postman 集合
交付物:
- 不同平台都可以按统一 JSON 回调
- 开发和平台实施同学对节点编码、错误码、能力标签理解一致
Milestone 5:手机待办、企业微信与 H5 页面
目标:让业务能在手机端收到通知、看上下文、补字段、继续或转人工。
任务清单:
- 创建
user_task表 - 实现角色路由规则:计划员、采购、质管、运维
- 开发
GET /api/tasks/my - 开发
POST /api/tasks/{taskId}/submit - 开发
POST /api/jobs/{jobId}/handoff - 开发企业微信消息发送与模版卡片更新
- 开发“人话状态”和“错误翻译”展示逻辑
- 开发 H5 处理页,展示关键字段、截图、待办动作
- 开发“为什么发给你”“修改前后对比”“提交后即时回执”
- 接入企业微信身份识别
- 为待办提交增加
submit_token,防止重复点击重复推进 - 为高风险动作增加短时间撤回设计
交付物:
- 业务能在企业微信打开待办详情
- 人工提交只能推进一次
- 所有修改留痕
- 用户能看懂待办原因、知道该怎么处理、处理后知道系统已受理
Milestone 6:查询页、审计与运维能力
目标:让项目负责人和运维能查问题、追流程、看证据。
任务清单:
- 开发
GET /api/jobs/{jobId} - 开发按合同编号、供应商、日期、状态筛选列表接口
- 展示节点轨迹、责任角色、重试记录
- 展示 OCR 结果、映射结果、截图和日志摘要
- 增加人工重试接口
POST /api/jobs/{jobId}/retry - 增加“整单重跑”能力,生成新的
job - 增加查看/下载审计日志
交付物:
- 出问题时能快速看出卡在哪一层
- 能区分当前实例和历史重跑实例
Milestone 7:测试、联调与上线准备
目标:把关键链路和关键失败场景都压一遍。
任务清单:
- 覆盖全自动正向场景
- 覆盖 OCR 低置信度转计划员场景
- 覆盖返利中心模板部分失败场景
- 覆盖 M5 质管基础资料不全场景
- 覆盖不同平台回调重复提交场景
- 覆盖企业微信待办重复提交场景
- 覆盖共享目录重复上传场景
- 覆盖节点超时升级场景
- 覆盖新单切换执行平台场景
- 输出上线切换清单、回滚清单、账号权限清单
交付物:
- 联调报告
- UAT 场景清单
- 上线/回滚 checklist
5. 表结构草案
说明:下面是一期最低可用表结构,不追求一次做成大而全平台,先满足幂等、留痕、查询和待办协同。
4.1 job
一份合同的一次流程实例。
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint PK | 主键 |
| job_id | varchar(64) unique | 对外流程单号 |
| business_key | varchar(128) | 业务唯一键 |
| parent_job_id | varchar(64) null | 重跑来源 |
| source_type | varchar(32) | shared_folder/manual_upload |
| source_file_name | varchar(255) | 原始文件名 |
| source_file_hash | varchar(64) | 原始文件哈希 |
| contract_type | varchar(32) | 年度协议/批次合同 |
| contract_no | varchar(64) null | 合同编号 |
| supplier_name | varchar(128) null | 供应商名称 |
| planner_name | varchar(64) null | 计划员 |
| current_node_code | varchar(64) | 当前节点 |
| status | varchar(32) | PENDING/RUNNING/WAITING_USER/... |
| mapping_version | varchar(64) null | 映射配置版本 |
| executor_platform | varchar(32) null | 默认执行平台 |
| contract_system_no | varchar(64) null | 合同系统单号 |
| rebate_order_no | varchar(64) null | 返利中心总单号 |
| m5_order_no | varchar(64) null | M5 采购订单号 |
| receipt_notice_no | varchar(64) null | 收货通知单号 |
| current_role | varchar(32) null | 当前责任角色 |
| current_assignee | varchar(64) null | 当前责任人 |
| created_by | varchar(64) | 发起人或系统 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
| finished_at | datetime null | 完成时间 |
索引建议:
uniq_job_business_open:business_key + statusidx_job_contract_noidx_job_supplier_statusidx_job_created_at
4.2 job_node
记录每个节点每次尝试。
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint PK | 主键 |
| job_id | varchar(64) | 流程单号 |
| node_code | varchar(64) | 节点编码 |
| attempt_no | int | 第几次执行 |
| status | varchar(32) | 节点状态 |
| executor_platform | varchar(32) null | 实际执行平台 |
| executor_run_id | varchar(64) null | 平台侧任务号 |
| started_at | datetime null | 开始时间 |
| ended_at | datetime null | 结束时间 |
| duration_ms | bigint null | 耗时 |
| error_code | varchar(64) null | 错误码 |
| error_summary | varchar(500) null | 错误摘要 |
| role_at_failure | varchar(32) null | 失败时责任角色 |
| assignee_at_failure | varchar(64) null | 失败时责任人 |
| output_json | json null | 节点输出 |
| callback_idempotency_key | varchar(128) null | 回调幂等键 |
| created_at | datetime | 创建时间 |
索引建议:
uniq_job_node_attemptidx_job_node_status
4.3 user_task
企业微信/H5 里的人工处理单。
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint PK | 主键 |
| task_id | varchar(64) unique | 待办编号 |
| job_id | varchar(64) | 所属流程 |
| node_code | varchar(64) | 对应节点 |
| role_code | varchar(32) | 目标角色 |
| assignee_user_id | varchar(64) null | 当前处理人 |
| title | varchar(255) | 待办标题 |
| reason_type | varchar(32) | OCR_LOW_CONF/REBATE_FAIL/... |
| reason_summary | varchar(500) | 待办原因 |
| reason_user_friendly | varchar(500) | 面向业务的人话说明 |
| why_me_text | varchar(255) | 为什么发给当前角色/当前人 |
| editable_fields_json | json | 白名单字段 |
| action_schema_json | json | 允许动作 |
| comparison_snapshot_json | json null | 原值/建议值/当前值对比 |
| status | varchar(32) | OPEN/SUBMITTED/CANCELLED/EXPIRED |
| submit_token | varchar(64) | 防重复令牌 |
| submitted_action | varchar(32) null | 继续/重试/转人工/终止 |
| submitted_payload_json | json null | 人工提交内容 |
| submitted_by | varchar(64) null | 提交人 |
| submitted_at | datetime null | 提交时间 |
| due_at | datetime null | 超时升级时间 |
| created_at | datetime | 创建时间 |
4.4 mapping_config
映射规则表,一期可以先做统一表,后续再拆子表。
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint PK | 主键 |
| config_key | varchar(128) | 业务键 |
| config_type | varchar(32) | supplier/item/settlement/payment_term/route |
| source_value | varchar(255) | 来源值 |
| target_value | varchar(255) | 目标值 |
| extra_json | json null | 扩展参数 |
| version_no | varchar(64) | 版本号 |
| is_active | tinyint | 是否生效 |
| effective_from | datetime | 生效时间 |
| effective_to | datetime null | 失效时间 |
| updated_by | varchar(64) | 更新人 |
| updated_at | datetime | 更新时间 |
4.5 executor_binding_config
节点与执行平台路由配置。
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint PK | 主键 |
| node_code | varchar(64) | 节点编码 |
| preferred_platform | varchar(32) | 首选平台 |
| fallback_platform | varchar(32) null | 备用平台 |
| required_capabilities_json | json | 所需能力标签 |
| route_policy | varchar(32) | FIXED / PREFERRED / FALLBACK |
| is_active | tinyint | 是否生效 |
| updated_by | varchar(64) | 更新人 |
| updated_at | datetime | 更新时间 |
4.6 job_artifact
存证表。
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint PK | 主键 |
| job_id | varchar(64) | 流程单号 |
| node_code | varchar(64) null | 所属节点 |
| artifact_type | varchar(32) | SOURCE_FILE/OCR_JSON/SCREENSHOT/TEMPLATE/LOG |
| storage_path | varchar(500) | 存储路径 |
| file_name | varchar(255) | 文件名 |
| file_hash | varchar(64) null | 文件哈希 |
| is_masked | tinyint | 是否脱敏 |
| visible_roles_json | json | 可见角色 |
| created_at | datetime | 创建时间 |
4.7 job_event
事件流表,用来查轨迹。
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint PK | 主键 |
| job_id | varchar(64) | 流程单号 |
| node_code | varchar(64) null | 节点 |
| event_type | varchar(64) | JOB_CREATED/NODE_FAILED/TASK_CREATED/... |
| event_summary | varchar(500) | 事件摘要 |
| event_payload_json | json null | 事件详情 |
| operator_type | varchar(32) | SYSTEM/ROBOT/USER |
| operator_id | varchar(64) | 操作人 |
| created_at | datetime | 创建时间 |
5. MySQL DDL 示例
以下 DDL 不是最终生产版,但足够作为建库初稿。
CREATE TABLE job (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
job_id VARCHAR(64) NOT NULL UNIQUE,
business_key VARCHAR(128) NOT NULL,
parent_job_id VARCHAR(64) NULL,
source_type VARCHAR(32) NOT NULL,
source_file_name VARCHAR(255) NOT NULL,
source_file_hash VARCHAR(64) NOT NULL,
contract_type VARCHAR(32) NOT NULL,
contract_no VARCHAR(64) NULL,
supplier_name VARCHAR(128) NULL,
planner_name VARCHAR(64) NULL,
current_node_code VARCHAR(64) NOT NULL,
status VARCHAR(32) NOT NULL,
mapping_version VARCHAR(64) NULL,
executor_platform VARCHAR(32) NULL,
contract_system_no VARCHAR(64) NULL,
rebate_order_no VARCHAR(64) NULL,
m5_order_no VARCHAR(64) NULL,
receipt_notice_no VARCHAR(64) NULL,
current_role VARCHAR(32) NULL,
current_assignee VARCHAR(64) NULL,
created_by VARCHAR(64) NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
finished_at DATETIME NULL,
KEY idx_job_contract_no (contract_no),
KEY idx_job_supplier_status (supplier_name, status),
KEY idx_job_created_at (created_at)
);
CREATE TABLE job_node (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
job_id VARCHAR(64) NOT NULL,
node_code VARCHAR(64) NOT NULL,
attempt_no INT NOT NULL,
status VARCHAR(32) NOT NULL,
executor_platform VARCHAR(32) NULL,
executor_run_id VARCHAR(64) NULL,
started_at DATETIME NULL,
ended_at DATETIME NULL,
duration_ms BIGINT NULL,
error_code VARCHAR(64) NULL,
error_summary VARCHAR(500) NULL,
role_at_failure VARCHAR(32) NULL,
assignee_at_failure VARCHAR(64) NULL,
output_json JSON NULL,
callback_idempotency_key VARCHAR(128) NULL,
created_at DATETIME NOT NULL,
UNIQUE KEY uniq_job_node_attempt (job_id, node_code, attempt_no)
);
CREATE TABLE user_task (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
task_id VARCHAR(64) NOT NULL UNIQUE,
job_id VARCHAR(64) NOT NULL,
node_code VARCHAR(64) NOT NULL,
role_code VARCHAR(32) NOT NULL,
assignee_user_id VARCHAR(64) NULL,
title VARCHAR(255) NOT NULL,
reason_type VARCHAR(32) NOT NULL,
reason_summary VARCHAR(500) NOT NULL,
editable_fields_json JSON NOT NULL,
action_schema_json JSON NOT NULL,
status VARCHAR(32) NOT NULL,
submit_token VARCHAR(64) NOT NULL,
submitted_action VARCHAR(32) NULL,
submitted_payload_json JSON NULL,
submitted_by VARCHAR(64) NULL,
submitted_at DATETIME NULL,
due_at DATETIME NULL,
created_at DATETIME NOT NULL
);
6. API 草案
说明:接口统一由状态中心对外提供,RPA 平台、H5 页面、企业微信回调都走状态中心,不允许直接改数据库。
鉴权建议:
- 内部服务接口:
Authorization: Bearer <service-token> - RPA 平台回调接口:
X-Agent-Token - H5 用户接口:企业微信身份换取后端 session 或 JWT
- 幂等写接口:增加
X-Idempotency-Key
6.1 建单接口
POST /api/jobs
用途:
- 共享目录监听器建单
- 状态中心手工上传建单
请求示例:
{
"sourceType": "shared_folder",
"sourceFileName": "20260625_国药控股_张三_批次合同_01.pdf",
"sourceFileHash": "6f6f5d8c...",
"contractType": "BATCH",
"supplierName": "国药控股",
"plannerName": "张三",
"executorPlatform": "YINGDAO",
"createdBy": "system-folder-watcher",
"artifacts": [
{
"artifactType": "SOURCE_FILE",
"storagePath": "/data/jobs/inbox/20260625_国药控股_张三_批次合同_01.pdf"
}
]
}
响应示例:
{
"jobId": "JOB202606260001",
"status": "PENDING",
"currentNodeCode": "FILE_INTAKE"
}
6.2 节点开始
POST /api/jobs/{jobId}/nodes/{nodeCode}/start
请求示例:
{
"attemptNo": 1,
"executorPlatform": "YINGDAO",
"operator": "yingdao-agent-01",
"startedAt": "2026-06-26T10:00:00+08:00"
}
6.3 节点成功
POST /api/jobs/{jobId}/nodes/{nodeCode}/complete
请求示例:
{
"attemptNo": 1,
"executorPlatform": "YINGDAO",
"executorRunId": "YD-RUN-20260626-001",
"endedAt": "2026-06-26T10:03:25+08:00",
"businessRefs": {
"contractSystemNo": "HT20260626018",
"rebateOrderNo": "FL20260626009",
"m5OrderNo": null,
"receiptNoticeNo": null
},
"summary": {
"importedItemCount": 18,
"failedItemCount": 0
},
"artifacts": [
{
"artifactType": "SCREENSHOT",
"storagePath": "/data/jobs/JOB202606260001/REBATE_IMPORT_ITEMS/success.png"
}
]
}
约束:
- 如果没有业务编号且节点本身要求有编号,则不能直接记
SUCCESS
6.4 节点失败
POST /api/jobs/{jobId}/nodes/{nodeCode}/fail
请求示例:
{
"attemptNo": 1,
"executorPlatform": "YINGDAO",
"executorRunId": "YD-RUN-20260626-001",
"endedAt": "2026-06-26T10:05:01+08:00",
"errorCode": "REBATE_TEMPLATE_PARTIAL_FAIL",
"errorSummary": "18 行中有 3 行校验失败",
"retryable": false,
"routeRole": "PURCHASER",
"artifacts": [
{
"artifactType": "SCREENSHOT",
"storagePath": "/data/jobs/JOB202606260001/REBATE_IMPORT_ITEMS/error.png"
},
{
"artifactType": "LOG",
"storagePath": "/data/jobs/JOB202606260001/REBATE_IMPORT_ITEMS/agent.log"
}
]
}
6.5 我的待办
GET /api/tasks/my
查询参数建议:
status=openroleCode=PLANNERpageNo=1pageSize=20
响应字段建议:
taskIdjobIdtitlereasonSummaryreasonUserFriendlywhyMeTextnodeCodesupplierNamecontractNodueAtdetailUrl
6.6 待办提交
POST /api/tasks/{taskId}/submit
请求示例:
{
"submitToken": "9f5f2c1d",
"action": "CONFIRM_AND_CONTINUE",
"payload": {
"paymentModeCode": "2",
"paymentModeDays": 30,
"settlementCode": "3"
},
"comment": "已根据合同正文修正承付模式"
}
动作枚举建议:
CONFIRM_AND_CONTINUERETRY_CURRENT_NODETRANSFER_MANUALTERMINATE_JOB
提交成功后的响应,建议额外返回:
accepted: 是否已受理receiptMessage: 给用户看的即时回执nextExpectedAction: 系统接下来会做什么estimatedWaitMinutes: 预计多久有下一次结果
6.7 重试当前节点
POST /api/jobs/{jobId}/retry
请求示例:
{
"scope": "CURRENT_NODE",
"operatorId": "zhangsan",
"reason": "计划员已修正承付模式,允许重试"
}
6.8 转派/转人工
POST /api/jobs/{jobId}/handoff
请求示例:
{
"targetRole": "OPS",
"targetUserId": "wangwu",
"reason": "返利中心页面结构变化,需要机器人管理员处理"
}
6.9 查询整单
GET /api/jobs/{jobId}
返回建议包含:
job基础信息- 当前状态
- 节点轨迹数组
- 当前待办数组
- 关键业务编号
- OCR 摘要
- 映射摘要
- 证据文件列表
- 执行平台与平台侧运行号
6.10 企业微信回调
POST /api/wecom/callback
用途:
- 卡片动作回调
- 身份事件回调
注意:
- 回调只负责接收动作和身份,不直接写业务结果
- 必须先换成状态中心标准动作,再调用内部任务提交逻辑
7. H5 页面草案
页面最低能力建议:
- 显示合同基础信息:合同编号、供应商、计划员、当前节点
- 显示“当前系统正在做什么”的人话状态
- 显示 OCR 关键字段和置信度
- 显示最近错误截图和业务可读错误说明
- 显示“为什么发给你”
- 显示允许修改的字段和修改前后对比
- 显示操作按钮:继续、重试、转人工、终止
- 显示处理历史和最近一次失败原因
- 提交动作后显示即时回执,避免重复点击
页面路由建议:
/h5/tasks/{taskId}/h5/jobs/{jobId}
8. 平台接入 POC 清单
任何新 RPA 平台接入前,先做下面的最小验证:
- 登录目标系统并打开指定页面
- 读取一份合同字段并调用一次外部 HTTP API
- 在返利中心完成一次模板导入
- 失败时自动截图并回调到状态中心
- 验证平台日志、录屏和运行号能被统一采集
通过后,才允许接入正式流程路由。
9. 联调顺序建议
建议不要一上来就四方一起联调,按下面顺序推进更稳:
- 状态中心单独完成建单、节点流转、待办流转
- 先用假 OCR 和假 RPA 回调,把流程跑通
- 接入真实 OCR
- 接入真实企业微信消息和 H5 身份
- 最后接入真实 RPA 流程
- 再做返利中心/M5 端到端联调
10. 测试重点
接口测试重点:
- 重复建单
- 重复回调
- 重复待办提交
- 非法状态迁移
- 低置信度转待办
- 整单重跑
集成测试重点:
- OCR 返回空字段
- 返利中心部分导入失败
- M5 保存失败
- 企业微信回调延迟或重复
- 节点长时间未回调
UAT 重点:
- 计划员在手机端补录后能继续执行
- 采购能看到失败明细和截图
- 质管收到问题后只做基础资料确认
- 运维能定位页面变化或登录失效
- 待办文案是否足够人话,业务无需培训也能理解主要动作
- 用户提交后是否明确感知“系统已受理”
11. 上线前必补清单
以下内容现在还没落在代码里,但上线前必须补齐:
- 企业微信应用信息、回调域名、可信域名
- 共享目录所在服务器、权限和目录清理规则
- 合同附件的访问权限与脱敏策略
- 执行平台运行节点、账号和截图/录屏落盘路径
- 返利中心与 M5 的测试账号、生产账号隔离
- 错误码清单和责任角色映射表
- 环境监控:服务存活、数据库连接、磁盘容量、回调异常告警
12. 建议下一步
如果要继续推进,建议按下面顺序立刻开工:
- 先定表结构和节点编码
- 再定统一 RPA 回调 JSON 契约和能力标签
- 再做企业微信“H5 待办页”原型和人性化文案
- 然后并行开发:状态中心后端、RPA 平台适配器、企业微信消息联调
这份文档适合作为技术 kickoff 和任务拆分底稿。