AutoRpa/资料/PLAN.md

588 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 采购主链 RPA 编排与手机待办一期方案
## Summary
一期按 `RPA执行平台 + Python/MySQL 轻量状态中心 + 企业微信正式应用 + 本地 OCR` 落地,覆盖主链 `合同扫描件/合同系统 -> 返利中心采购协议 -> M5 采购订单`。
目标不是只做一个机器人脚本,而是做成一套**业务可见、异常可处理、手机可协同**的流程编排系统:
- 主流程默认尽量全自动运行
- OCR/映射不确定项转为企业微信手机待办
- 每个节点状态、耗时、错误原因、处理人都写入状态中心
- 业务可在手机端完成 `查看上下文 / 补录字段 / 继续 / 重试 / 转人工`
- RPA 执行平台只负责系统操作与节点执行,不承载核心状态和业务协同
## Key Changes
### 0. 入池触发与文件规范
一期默认以“**共享文件夹入池 + 状态中心建单**”作为统一触发方式,不接受 RPA 平台内部自行起单。
- 合同扫描件、年度协议、批次协议、返利中心导入模板都必须先进入约定共享目录
- 状态中心负责监听入池目录,或由人工在状态中心页面选择文件后建单
- RPA 平台只能消费已经建好的 `job`,不能绕过状态中心直接执行
入池对象至少区分以下几类:
- 年度协议
- 批次合同
- 合同附件/补充页
- 返利中心细单导入模板
文件命名规则一期建议固定为:
- `日期_供应商名称_计划员_合同类型`
- 允许补充流水号或附件序号,例如 `20260625_国药控股_张三_批次合同_01.pdf`
入池校验至少包括:
- 文件类型是否在允许范围内(PDF/图片/Excel)
- 是否命中命名规范
- 是否能识别供应商名称与计划员
- 同一合同编号/同一业务键是否已存在未完成实例
- 是否存在多页缺失、重复上传、同名覆盖
入池失败时不得直接丢给 RPA 平台,应由状态中心生成待处理记录:
- 命名不规范 -> 计划员待办
- 关键文件缺失 -> 计划员待办
- 疑似重复入池 -> 提示并阻止新建,必要时转运维或项目负责人确认
### 1. 总体架构与职责边界
- **RPA 执行平台(影刀 / 艺赛旗 / 其他)**
- 负责登录系统、页面检索、字段填充、模板导入、截图、日志/录屏采集、执行结果回传
- 每完成一个节点,调用状态中心接口上报节点结果
- 不直接保存业务主状态,不直接承载人工审批逻辑
- **轻量状态中心(Python + MySQL)**
- 负责流程实例、节点状态、待办、角色路由、重试控制、日志归档、配置映射、执行平台路由
- 提供给 RPA 平台的流程启动、节点回调、异常上报、人工处理、继续执行接口
- 提供给企业微信的消息卡片、待办链接、处理回调接口
- **本地 OCR 服务**
- 一期默认本地部署,优先按 PaddleOCR 设计
- 负责从扫描件/PDF 中提取文本和结构化字段
- 输出带置信度的 JSON,不直接写业务系统
- **企业微信正式应用**
- 负责个人待办、异常告警、处理入口、节点进度消息
- 不做主流程编排,只作为移动交互层
#### 1.1 我方自有能力边界
以下能力必须沉淀在“我们自己的状态中心”中,而不是绑定在某一家 RPA 平台内部:
- 流程主状态与节点状态机
- 合同入池、判重与幂等控制
- OCR 结果存档、映射配置、规则版本
- 手机待办、角色路由、人工处理留痕
- 成功判定口径、错误码体系、证据归档
- 多 RPA 平台的统一查询、统一审计和统一对外口径
换句话说,RPA 平台是可替换的“执行手”,状态中心才是我们的“流程主控”和“业务资产沉淀层”。
#### 1.2 执行平台可替换边界
一期支持将底层执行器设计为可切换,但边界要先写死:
- 可切换的是“执行平台”,不可切换的是状态中心、企业微信协同、业务规则和成功判定口径
- 允许“按新单切换平台”,也允许“按节点配置平台”
- 不做“单个节点执行到一半跨平台接力”
- 老单默认沿用建单时选定的平台,不在执行过程中强行迁移
- 新平台接入前必须通过统一 POC 验证清单
#### 1.3 候选平台能力判断原则
当前候选执行平台可包括影刀、艺赛旗等,但是否可用于本项目,不能只看厂商宣传页,要按本项目关键动作验证:
- 目标系统登录与稳定检索
- 表单填写、弹窗处理、模板导入
- 文件上传/下载与本地目录交互
- 截图、日志、录屏留证
- 自定义 HTTP 回调状态中心
满足上述能力后,才能认为该平台可替代现有执行器。
### 2. 一期业务主链与节点定义
一期只做以下主链,其他如订单中心分货、招采子系统不纳入一期:
1. 合同文件入池
2. OCR 识别与字段抽取
3. 字段映射与业务校验
4. 合同系统信息补齐/确认
5. 返利中心采购协议检索与总单录入
6. 返利中心细单模板生成与导入
7. 返利中心结果校验
8. M5 采购订单创建
9. M5 保存与收货通知单生成
10. 流程完成归档
#### 2.1 合同系统前置条件
返利中心与 M5 的自动执行,必须建立在“合同系统已达到可执行状态”的前提上。
一期要明确区分以下几个动作:
- 合同系统信息补齐
- 合同系统送审
- 合同系统审核通过
- 审核驳回/需补充资料
建议一期按以下边界落地:
- 机器人可协助录入合同系统字段,并回写录入结果
- “送审”动作是否由机器人执行,需要业务确认后写死
- 只有合同处于“已审核/审核通过”状态,才能进入返利中心节点
- 审核未通过或缺资料,不得继续推进,直接转计划员或采购待办
状态中心中必须记录:
- 合同系统单号
- 合同系统当前审核状态
- 审核通过时间
- 驳回原因摘要
#### 2.2 一期明确不纳入范围
以下内容虽然在原始资料中提到,但不纳入一期实施:
- 订单中心分货与销售订单联动
- 招采子系统医院计划抓取与回传
- 发货后的一票/二票自动上传
- 渠道价管理与维护
如后续要做,应单独建二期/三期方案,不在一期需求、排期和验收中混入。
每个节点统一有以下状态:
- `PENDING`
- `RUNNING`
- `WAITING_USER`
- `SUCCESS`
- `FAILED_RETRYABLE`
- `FAILED_MANUAL`
- `CANCELLED`
#### 2.3 状态流转规则
节点状态不仅要有枚举,还要有明确迁移规则,避免同一单被重复推进:
- `PENDING -> RUNNING`
- `RUNNING -> SUCCESS`
- `RUNNING -> WAITING_USER`
- `RUNNING -> FAILED_RETRYABLE`
- `RUNNING -> FAILED_MANUAL`
- `WAITING_USER -> RUNNING`
- `WAITING_USER -> CANCELLED`
- `WAITING_USER -> FAILED_MANUAL`
- `FAILED_RETRYABLE -> RUNNING`
补充约束:
- 同一节点同一时刻只能有一个有效执行上下文
- 手机端“确认并继续”只能成功推进一次,后续重复提交必须返回幂等结果
- 节点超时后不能静默停留,必须升级为催办或异常状态
- `CANCELLED` 和 `FAILED_MANUAL` 默认不可自动恢复,只能人工明确重开
每个节点必须记录:
- 流程单号
- 合同编号
- 供应商
- 当前节点编码
- 节点开始/结束时间
- 执行结果
- 错误码
- 错误摘要
- 截图/日志路径
- 当前处理角色
- 当前处理人
- 重试次数
### 3. 手机待办与角色路由
手机待办默认按**角色路由**,不是固定发给某个人。
一期角色至少包括:
- 计划员
- 采购
- 质管
- 运维/机器人管理员
路由规则:
- OCR/映射不确定 -> 计划员
- 返利中心录入失败且需业务判断 -> 采购
- M5 保存失败且提示质管基础数据问题 -> 质管
- 机器人登录失败、页面结构变化、系统超时 -> 运维
- 多次重试仍失败 -> 运维 + 当前业务角色
#### 3.1 企业微信一期落地方式
一期建议将企业微信能力落成:
- 消息通知
- 模版卡片消息更新
- H5 处理页/详情页
- 用户身份识别与回调处理
即:企业微信负责“通知 + 打开处理入口 + 提交处理动作”,状态推进仍由状态中心完成。
说明:
- 一期文档中的“手机待办”默认指“企业微信消息卡片 + H5 待处理页”的组合能力
- 不把企业微信原生待办体系作为一期已确认前提,若后续验证可接,再单独扩展
- 所有按钮动作最终都必须调用状态中心接口,并以状态中心结果为准
企业微信待办支持的动作固定为:
- `查看详情`
- `补录/修改字段`
- `确认并继续`
- `重新执行当前节点`
- `转人工处理`
- `终止本单`
消息内容必须包含:
- 合同编号
- 供应商名称
- 当前节点
- 错误摘要或待确认原因
- 已识别关键字段摘要
- 最近一张错误截图
- 处理入口链接
#### 3.2 人工处理字段边界
手机端“补录/修改字段”不能放成无限编辑,必须收敛为白名单字段。
一期建议按角色控制:
- 计划员:合同编号、承付模式、承付参数、计划员归属、合同有效期、OCR 识别结果修正
- 采购:供应商映射、货品映射、协议单价、返利中心导入模板相关字段
- 质管:仅处理基础资料维护完成确认,不直接改合同业务字段
- 运维:只能做重试、转派、失败归档,不修改业务字段值
以下字段若涉及修改,必须记录修改前后值、修改人、修改时间、修改原因:
- 合同编号
- 供应商名称/编码
- 结算方式
- 承付模式与承付参数
- 货品编码/数量/单价
- M5 货源选择
#### 3.3 人性化待办体验
为了提升业务接受度,一期建议把以下体验项明确纳入需求,而不是留到后期“有空再优化”:
- **人话状态**
- 不只显示节点编码,要显示“系统正在做什么、通常还要多久、下一步会怎样”
- **错误翻译**
- 除错误码外,必须给出业务能看懂的错误原因和建议动作
- **为什么发给你**
- 每条待办都说明“当前归你处理的原因”和“本次需要你确认什么”
- **修改前后对比**
- 补录字段时同时展示 OCR 原值、系统建议值、用户当前填写值
- **提交后即时回执**
- 用户点击继续/重试后,立即反馈“已受理、预计多久再次执行、不要重复提交”
- **一屏看完最近证据**
- 待办详情首页直接展示合同编号、供应商、关键字段、最近错误截图、错误摘要
- **预计耗时提示**
- 关键节点给出大概执行时长,降低业务等待焦虑
- **高风险动作撤回窗口**
- 对“终止本单”“转人工处理”等动作,建议提供短时间撤回能力
### 4. OCR 与规则映射策略
一期默认**本地 OCR**,并预留适配层,后续可切云 OCR,但一期不依赖云能力。
OCR 输出必须是结构化 JSON,至少包含:
- `supplier_name`
- `planner_name`
- `contract_no`
- `settlement_text`
- `payment_term_text`
- `contract_validity`
- `items[]`
- `field_confidence{}`
映射与校验不在 RPA 平台里硬编码,统一放在状态中心配置表中。配置表至少包括:
- 供应商映射表
- 货品映射表
- 结算方式映射表
- 承付模式映射表
- 合同编号规则表
- 角色路由规则表
- 执行平台路由规则表
配置治理还需补充:
- 所有映射配置必须带版本号、生效时间、维护人
- 每个 `job` 在开始执行时要绑定一份映射版本快照
- 重试默认沿用原映射版本,除非人工明确选择“按最新配置重跑”
- 配置表变更要保留审计记录,不能直接覆盖无痕修改
承付模式映射规则一期采用“**规则优先 + 人工兜底**”:
- 精确命中字典表达,直接转系统编码
- 能识别 `N天` 的标准表达,拆成 `模式代码 + N`
- 无法稳定命中或置信度低于阈值,转 `WAITING_USER`
- 禁止在低置信度情况下自动猜测继续录入
### 5. 状态中心接口与数据实体
重要接口/公共契约如下:
- `POST /api/jobs`
- 创建流程实例,入参为合同文件元数据和发起来源
- `POST /api/jobs/{jobId}/nodes/{nodeCode}/start`
- RPA 平台或调度器上报节点开始
- `POST /api/jobs/{jobId}/nodes/{nodeCode}/complete`
- 上报节点成功,附输出数据
- `POST /api/jobs/{jobId}/nodes/{nodeCode}/fail`
- 上报失败,附错误码、截图、日志、是否可重试
- `POST /api/tasks/{taskId}/submit`
- 手机端提交人工处理结果
- `POST /api/jobs/{jobId}/retry`
- 人工或系统触发重试
- `POST /api/jobs/{jobId}/handoff`
- 转人工或转其他角色
- `GET /api/jobs/{jobId}`
- 查询整单状态与节点轨迹
- `GET /api/tasks/my`
- 查询当前用户手机待办
#### 5.1 幂等与唯一键
状态中心必须承担幂等控制,不能把“是否重复执行”交给具体 RPA 平台临时判断。
至少要定义以下唯一键/幂等键:
- `job` 业务唯一键:建议由 `合同编号 + 合同类型 + 供应商 + 发起来源` 组合生成
- 入池幂等键:建议由 `文件哈希 + 文件名 + 上传时间窗` 组合生成
- 节点回调幂等键:`jobId + nodeCode + attemptNo + callbackType`
- 手机待办提交幂等键:`taskId + action + submitToken`
系统行为建议固定为:
- 未完成实例存在时,同业务键默认禁止重复建单
- 允许“重跑当前节点”,但不得覆盖历史节点记录
- 如需整单重跑,应新建新的 `job`,并关联原 `jobId`
- 历史 `job` 的 OCR 结果、截图、日志必须可追溯,不得被新单覆盖
核心实体至少包括:
- `job`:一份合同的一次全流程实例
- `job_node`:流程实例下的节点执行记录
- `user_task`:手机待办/人工处理单
- `mapping_config`:业务映射配置
- `executor_binding_config`:节点与执行平台绑定配置
- `job_artifact`:截图、OCR JSON、导入模板、日志文件
- `job_event`:状态变更事件流
建议增加的关键字段:
- `job.parent_job_id`:整单重跑或克隆来源
- `job.mapping_version`:执行时绑定的配置版本
- `job.executor_platform`:本单默认执行平台
- `job.source_file_hash`:源文件去重标识
- `job_node.attempt_no`:节点第几次尝试
- `job_node.executor_platform`:本次节点尝试由哪个平台执行
- `job_node.executor_run_id`:平台侧任务号/运行号
- `user_task.submit_token`:防重复提交令牌
- `job_artifact.artifact_type`:OCR JSON、截图、模板、日志等分类
### 6. 节点执行与重试策略
重试分三类:
- **系统型自动重试**
- 页面超时、偶发网络异常、系统短暂不可用
- 默认自动重试 1 到 2 次
- **业务型人工确认后重试**
- 字段识别不确定、映射缺失、返利中心校验不通过
- 手机待办确认后重试当前节点
- **人工接管**
- 连续失败、逻辑分支超出机器人能力、系统规则变化
- 标记为 `FAILED_MANUAL`,由人工线下处理,流程保留上下文
必须明确的失败分流:
- OCR 失败 -> 待办给计划员
- 合同编号无法匹配 -> 待办给计划员
- 返利中心模板导入失败 -> 待办给采购
- M5 因质管基础数据不全无法保存 -> 待办给质管
- 登录失败/控件定位失败/页面结构变化 -> 待办给运维
- 平台能力不满足当前节点要求 -> 待办给运维/项目负责人评估是否切换执行平台
#### 6.1 超时与升级策略
除失败分流外,还需要定义“长时间没人处理”与“节点卡住”的升级规则。
建议一期先定简单规则:
- OCR/映射类待办超过 30 分钟未处理 -> 再次通知当前角色
- 超过 2 小时未处理 -> 升级通知项目负责人/备岗人员
- 返利中心/M5 运行中节点超过阈值未回调 -> 标记超时异常并通知运维
- 夜间非工作时段是否升级,需按业务班次另行配置
所有升级动作都必须进入 `job_event` 留痕。
### 7. 业务可见性设计
一期不单独建设复杂 BI 看板,但状态中心必须支持后续扩展。当前可见性分两层:
- **企业微信消息流**
- 面向业务个人,解决“手机知道发生了什么”
- **状态中心查询页**
- 面向运维/项目负责人,按合同编号查看节点轨迹、截图、当前责任方、重试记录
查询页至少支持:
- 按日期/供应商/合同编号/状态筛选
- 查看当前卡点节点
- 查看待办归属角色与处理记录
- 查看 OCR 结果和映射结果
- 查看返利中心/M5 错误截图与日志摘要
#### 7.1 成功判定与结果回写口径
一期必须明确“节点成功”不是页面点完就算成功,而是拿到对应业务对象与校验结果。
至少要求:
- 合同系统成功:返回合同系统单号,且能查询到对应状态
- 返利中心总单成功:返回总单编号,且关键字段与输入一致
- 返利中心细单导入成功:返回导入行数、失败行数、失败原因摘要
- M5 成功:返回采购订单号
- 收货通知单生成成功:返回通知单号
建议状态中心在节点成功回调中强制要求携带:
- 业务单号
- 关键字段摘要
- 成功截图
- 校验结果
如仅有“操作已提交”但未取得业务编号,应落为中间态或待校验态,不能直接记 `SUCCESS`。
#### 7.3 多 RPA 切换策略
为了形成长期竞争力,一期方案支持“执行平台可替换”,但切换策略必须保守可控:
- 切换单位以“新单”或“节点配置”优先,不以“运行中半节点切换”为目标
- 每个节点先声明所需能力标签,例如 `desktop_ui`、`file_upload`、`excel_template`、`http_callback`
- 每个执行平台声明自己支持的能力标签
- 状态中心根据节点所需能力和平台可用能力决定路由
- 平台切换前必须通过统一验证清单:登录、检索、模板导入、截图/日志、HTTP 回调
这样做的目的不是追求脚本 100% 通用,而是确保:
- 业务流程不被单一厂商绑定
- 状态、待办、规则、证据统一留在我方系统
- 当成本、授权或稳定性发生变化时,可平滑更换底层执行平台
#### 7.4 面向业务方的竞争价值
多 RPA 可切换的价值,不只是技术选型灵活,更要落实到业务能感受到的收益:
- 不因单一工具变化而中断业务流程
- 同一套手机待办、同一套状态查询,不需要业务重新学一套系统
- 平台替换时,合同轨迹、截图、历史处理记录不会丢
- 某个平台不稳定时,可逐步把新单切到更稳的平台,业务侧感知更平滑
- 后续新增流程时,优先复用既有状态中心和手机协同能力,减少重复建设
#### 7.2 证据留存与权限控制
一期虽然不做复杂平台,但必须先把资料、日志和截图的留存规则定下来。
至少要明确:
- 合同原件、OCR JSON、返利模板、执行截图、运行日志分别存放在哪里
- 文件目录命名是否按 `jobId/节点/时间` 归档
- 保留时长与清理策略
- 哪些角色可查看合同原件,哪些只能看摘要/脱敏截图
- 企业微信消息中是否只放缩略图和链接,不直接下发完整合同文件
涉及合同和供应商信息时,建议默认:
- 手机端只展示必要摘要
- 完整附件放状态中心受控页面查看
- 所有下载和查看动作记录审计日志
## Test Plan
### 核心流程场景
1. 合同文件命名规范、字段完整、OCR 置信度高
- 预期:全自动跑通到 M5 完成,无人工介入
2. OCR 成功但承付模式未命中字典
- 预期:转计划员手机待办,补录后继续执行
3. 返利中心细单导入模板格式错误
- 预期:节点失败,通知采购,可修正后重试当前节点
4. M5 保存时报质管未维护
- 预期:转质管手机待办,修复后重试
5. 当前执行平台登录返利中心失败
- 预期:自动重试后仍失败,转运维待办
6. 业务在手机端点击“转人工处理”
- 预期:流程进入 `FAILED_MANUAL`,保留完整上下文
7. 同一合同重复发起
- 预期:状态中心拦截或提示重复实例,避免重复录单
8. 合同系统未审核通过
- 预期:流程停在审核前置节点,不进入返利中心
9. 企业微信待办重复点击提交
- 预期:只推进一次,其余请求返回幂等结果
10. 返利中心细单部分导入成功、部分失败
- 预期:记录成功/失败行明细,转采购判断是否修正后续跑
11. 入池文件命名不规范或缺页
- 预期:不启动任何 RPA 平台,直接转计划员待办
12. 待办长时间未处理
- 预期:按升级规则再次通知并记录事件
13. 新单切换到另一执行平台
- 预期:状态中心仍可统一建单、回调、留痕与查询
14. 用户提交待办后立即收到受理回执
- 预期:用户知道系统已接单、无需重复点击
15. 用户查看待办详情时可直接看懂错误原因
- 预期:无需再去群里追问“这条待办要我干嘛”
### 接口与状态场景
1. 节点开始、成功、失败回调顺序正确
2. 同一节点重复回调具备幂等处理
3. 手机待办提交后只能推进一次,避免重复操作
4. 重试后产生新的节点执行记录,但保留历史失败记录
5. 企业微信消息与状态中心中的责任人、状态一致
6. 整单重跑会创建新的 `job`,并保留原 `job` 关联
7. 节点超时后会触发升级通知,不会无限停留在 `RUNNING`
8. 不同执行平台回调到状态中心时,状态口径与证据口径保持一致
### 验收标准
- 业务能在手机端知道每单当前跑到哪一步
- 关键不确定项不会被机器人“猜着填”
- 任何失败都能定位到具体节点、原因、截图和责任角色
- 一份合同从入池到 M5 完成的轨迹可完整追溯
- 能区分“本次只是操作提交”与“业务单号已真正生成”
- 同一合同不会因重复上传或重复点击而生成重复业务结果
- 不依赖 OpenClaw,也不依赖单一 RPA 厂商内置 OCR 即可完成一期
## Assumptions
- 一期默认只接入一个主执行平台上线,但架构上不与单一平台绑定
- 影刀、艺赛旗等候选平台是否正式接入,需以项目 POC 验证结果为准
- OpenClaw 一期不使用
- 企业微信可申请正式企业应用并支持消息、回调和待办入口
- 轻量服务技术栈固定为 Python + MySQL
- OCR 一期默认本地部署,优先按 PaddleOCR 设计
- 一期范围只覆盖 `合同 -> 返利中心 -> M5`
- 映射规则不再依赖 Excel,统一进入状态中心配置表
- 企业微信一期至少可提供消息卡片、H5 处理入口、身份识别与回调能力
- 合同扫描件默认来自共享目录或状态中心手工入池,不考虑邮件自动收件作为一期入口
- 业务目标是“尽量全自动”,但 OCR/映射不确定项必须转手机待办,不做自动猜测