AutoRpa/docs/archive/一期开发任务清单_表结构_API草案.md

27 KiB
Raw Blame History

采购主链 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:项目初始化与基础设施

目标:把后端服务、数据库连接、配置管理、日志规范先搭起来。

任务清单:

  1. 创建 backend/app/main.py,跑通基础 HTTP 服务
  2. 创建 backend/app/config.py,统一读取数据库、OCR、企业微信、RPA 平台回调密钥配置
  3. 创建 backend/app/db.py,封装 MySQL 连接和事务入口
  4. 建立 backend/tests/ 目录,先接入最基础的接口测试框架
  5. 创建 deployment/env.example,列出所有必需环境变量
  6. 定义统一日志字段:trace_id、job_id、node_code、task_id

交付物:

  • 服务能启动
  • 健康检查接口可用
  • 数据库连接可用
  • 开发/测试环境变量模板可发给团队

Milestone 1:入池建单与判重

目标:把“共享目录文件 -> 状态中心建单 -> 判重 -> 可追踪 job”跑通。

任务清单:

  1. 建 job、job_artifact、job_event 三张核心表
  2. 开发 POST /api/jobs 建单接口
  3. 开发共享目录文件入池服务,读取文件基础元数据
  4. 实现文件哈希计算与 source_file_hash 去重逻辑
  5. 实现业务唯一键判重逻辑:合同编号 + 合同类型 + 供应商 + 发起来源
  6. 入池失败时生成事件记录和人工待处理状态
  7. 支持通过状态中心页面手工建单,作为共享目录监听的兜底入口

交付物:

  • 同一合同重复上传不会生成多条未完成流程
  • 文件命名异常可被识别并阻断
  • 每次建单都有 job_id

Milestone 2:OCR 与映射规则

目标:把扫描件变成结构化字段,并明确哪些能自动映射、哪些必须转人工。

任务清单:

  1. 创建 mapping_config 表和版本字段
  2. 建立 OCR 适配接口,统一输出 JSON
  3. 保存原始 OCR JSON 到 job_artifact
  4. 实现供应商、货品、结算方式、承付模式映射服务
  5. 实现置信度阈值判断和低置信度转待办逻辑
  6. 为每个 job 绑定 mapping_version
  7. 把字段识别结果、映射结果写入 job_event

交付物:

  • OCR 结果可追溯
  • 映射规则支持版本化
  • 低置信度不会自动猜测后继续执行

Milestone 3:流程编排与节点状态机

目标:把节点开始、成功、失败、待人工、重试这些规则稳定下来。

任务清单:

  1. 创建 job_node 表
  2. 定义节点状态枚举与状态迁移规则
  3. 定义节点尝试号 attempt_no
  4. 开发节点开始接口 POST /api/jobs/{jobId}/nodes/{nodeCode}/start
  5. 开发节点成功接口 POST /api/jobs/{jobId}/nodes/{nodeCode}/complete
  6. 开发节点失败接口 POST /api/jobs/{jobId}/nodes/{nodeCode}/fail
  7. 实现节点回调幂等控制
  8. 实现节点超时扫描与升级策略

交付物:

  • 节点不会重复推进
  • 同一节点重复回调时可安全去重
  • 失败与超时都能落事件

Milestone 4:RPA 执行适配层与统一契约

目标:让底层 RPA 平台只做执行,不做流程主状态判断,并具备可切换能力。

任务清单:

  1. 输出 agent-contract/node_callback_examples.json
  2. 定义统一的 base_adapter 接口
  3. 实现 yingdao_adapter 与 isearch_adapter 骨架
  4. 定义平台回调鉴权方式
  5. 约定统一回传字段:错误码、截图路径、日志路径、录屏路径、输出业务单号
  6. 约定节点编码字典,例如 OCR_EXTRACT、REBATE_IMPORT_ITEMS、M5_CREATE_ORDER
  7. 定义平台失败错误码分层:系统类、业务类、配置类、页面变化类、能力不满足类
  8. 为每个节点定义能力标签,例如 desktop_ui、file_upload、excel_template、http_callback
  9. 制作联调用的假回调脚本或 Postman 集合

交付物:

  • 不同平台都可以按统一 JSON 回调
  • 开发和平台实施同学对节点编码、错误码、能力标签理解一致

Milestone 5:手机待办、企业微信与 H5 页面

目标:让业务能在手机端收到通知、看上下文、补字段、继续或转人工。

任务清单:

  1. 创建 user_task 表
  2. 实现角色路由规则:计划员、采购、质管、运维
  3. 开发 GET /api/tasks/my
  4. 开发 POST /api/tasks/{taskId}/submit
  5. 开发 POST /api/jobs/{jobId}/handoff
  6. 开发企业微信消息发送与模版卡片更新
  7. 开发“人话状态”和“错误翻译”展示逻辑
  8. 开发 H5 处理页,展示关键字段、截图、待办动作
  9. 开发“为什么发给你”“修改前后对比”“提交后即时回执”
  10. 接入企业微信身份识别
  11. 为待办提交增加 submit_token,防止重复点击重复推进
  12. 为高风险动作增加短时间撤回设计

交付物:

  • 业务能在企业微信打开待办详情
  • 人工提交只能推进一次
  • 所有修改留痕
  • 用户能看懂待办原因、知道该怎么处理、处理后知道系统已受理

Milestone 6:查询页、审计与运维能力

目标:让项目负责人和运维能查问题、追流程、看证据。

任务清单:

  1. 开发 GET /api/jobs/{jobId}
  2. 开发按合同编号、供应商、日期、状态筛选列表接口
  3. 展示节点轨迹、责任角色、重试记录
  4. 展示 OCR 结果、映射结果、截图和日志摘要
  5. 增加人工重试接口 POST /api/jobs/{jobId}/retry
  6. 增加“整单重跑”能力,生成新的 job
  7. 增加查看/下载审计日志

交付物:

  • 出问题时能快速看出卡在哪一层
  • 能区分当前实例和历史重跑实例

Milestone 7:测试、联调与上线准备

目标:把关键链路和关键失败场景都压一遍。

任务清单:

  1. 覆盖全自动正向场景
  2. 覆盖 OCR 低置信度转计划员场景
  3. 覆盖返利中心模板部分失败场景
  4. 覆盖 M5 质管基础资料不全场景
  5. 覆盖不同平台回调重复提交场景
  6. 覆盖企业微信待办重复提交场景
  7. 覆盖共享目录重复上传场景
  8. 覆盖节点超时升级场景
  9. 覆盖新单切换执行平台场景
  10. 输出上线切换清单、回滚清单、账号权限清单

交付物:

  • 联调报告
  • 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 + status
  • idx_job_contract_no
  • idx_job_supplier_status
  • idx_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_attempt
  • idx_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=open
  • roleCode=PLANNER
  • pageNo=1
  • pageSize=20

响应字段建议:

  • taskId
  • jobId
  • title
  • reasonSummary
  • reasonUserFriendly
  • whyMeText
  • nodeCode
  • supplierName
  • contractNo
  • dueAt
  • detailUrl

6.6 待办提交

POST /api/tasks/{taskId}/submit

请求示例:

{
  "submitToken": "9f5f2c1d",
  "action": "CONFIRM_AND_CONTINUE",
  "payload": {
    "paymentModeCode": "2",
    "paymentModeDays": 30,
    "settlementCode": "3"
  },
  "comment": "已根据合同正文修正承付模式"
}

动作枚举建议:

  • CONFIRM_AND_CONTINUE
  • RETRY_CURRENT_NODE
  • TRANSFER_MANUAL
  • TERMINATE_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 页面草案

页面最低能力建议:

  1. 显示合同基础信息:合同编号、供应商、计划员、当前节点
  2. 显示“当前系统正在做什么”的人话状态
  3. 显示 OCR 关键字段和置信度
  4. 显示最近错误截图和业务可读错误说明
  5. 显示“为什么发给你”
  6. 显示允许修改的字段和修改前后对比
  7. 显示操作按钮:继续、重试、转人工、终止
  8. 显示处理历史和最近一次失败原因
  9. 提交动作后显示即时回执,避免重复点击

页面路由建议:

  • /h5/tasks/{taskId}
  • /h5/jobs/{jobId}

8. 平台接入 POC 清单

任何新 RPA 平台接入前,先做下面的最小验证:

  1. 登录目标系统并打开指定页面
  2. 读取一份合同字段并调用一次外部 HTTP API
  3. 在返利中心完成一次模板导入
  4. 失败时自动截图并回调到状态中心
  5. 验证平台日志、录屏和运行号能被统一采集

通过后,才允许接入正式流程路由。

9. 联调顺序建议

建议不要一上来就四方一起联调,按下面顺序推进更稳:

  1. 状态中心单独完成建单、节点流转、待办流转
  2. 先用假 OCR 和假 RPA 回调,把流程跑通
  3. 接入真实 OCR
  4. 接入真实企业微信消息和 H5 身份
  5. 最后接入真实 RPA 流程
  6. 再做返利中心/M5 端到端联调

10. 测试重点

接口测试重点:

  • 重复建单
  • 重复回调
  • 重复待办提交
  • 非法状态迁移
  • 低置信度转待办
  • 整单重跑

集成测试重点:

  • OCR 返回空字段
  • 返利中心部分导入失败
  • M5 保存失败
  • 企业微信回调延迟或重复
  • 节点长时间未回调

UAT 重点:

  • 计划员在手机端补录后能继续执行
  • 采购能看到失败明细和截图
  • 质管收到问题后只做基础资料确认
  • 运维能定位页面变化或登录失效
  • 待办文案是否足够人话,业务无需培训也能理解主要动作
  • 用户提交后是否明确感知“系统已受理”

11. 上线前必补清单

以下内容现在还没落在代码里,但上线前必须补齐:

  1. 企业微信应用信息、回调域名、可信域名
  2. 共享目录所在服务器、权限和目录清理规则
  3. 合同附件的访问权限与脱敏策略
  4. 执行平台运行节点、账号和截图/录屏落盘路径
  5. 返利中心与 M5 的测试账号、生产账号隔离
  6. 错误码清单和责任角色映射表
  7. 环境监控:服务存活、数据库连接、磁盘容量、回调异常告警

12. 建议下一步

如果要继续推进,建议按下面顺序立刻开工:

  1. 先定表结构和节点编码
  2. 再定统一 RPA 回调 JSON 契约和能力标签
  3. 再做企业微信“H5 待办页”原型和人性化文案
  4. 然后并行开发:状态中心后端、RPA 平台适配器、企业微信消息联调

这份文档适合作为技术 kickoff 和任务拆分底稿。