AutoRpa/rpa_yisaiqi/README.md

192 lines
7.7 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.

# 艺赛旗联调包
这个目录是 Windows 和 macOS 共用的 RPA 包。状态机在 `state_center`,这里只负责回调外壳和节点 runner。
Mac 上先用 mock runner 把契约跑通:
```bash
# 状态中心已启动、DEV_MODE=true
python -m rpa_yisaiqi --create --auto-human
```
Agent 只听状态中心的当前节点和 `next_node`,不写死顺序。人工节点默认停下;加 `--auto-human` 才会替你提交待办。
## CONTRACT_CREATE 联调骨架
第一版目标是先验证:
1. Windows 虚拟机能访问状态中心。
2. `CONTRACT_CREATE` 能按约定调用 `start`。
3. 合同系统动作完成后能调用 `complete`,并带 `businessRefs.contractSystemNo`。
4. 登录失败、页面改版、合同禁用等异常能调用 `fail`。
## 合同节点步骤点
来自 `state_center/给艺赛旗的开发交接.md`:
1. 打开合同测试系统:`http://contract-test.gzmpc.com:8080/`
2. 登录:`test002 / 1`
3. 左侧菜单进入 `合同管理 > 合同起草`
4. 在最近使用模板中选择 `templateName`,非格式默认 `非格式--采购协议`
5. 填签约方信息:客户编码、客户名称
6. 填基础信息:合同版本类型、合同类别、结算类型、合同背景概述、合同性质
7. 填金额和日期,合同签订日期和合同开始日期必须等于订单日期
8. 填货品明细
9. 填付款信息与特殊标志:是否重大合同、是否预付款、归属年份、付款方式、付款期限、合同状态、是否包含血液制品
10. 医药城 `YYC`:同供应商同日 PDF 先合并成一个再上传
11. 小药药 `XYY`:格式合同,跳过合同证文上传
12. 提交并读取合同编号
13. 调状态中心 `complete`,必传 `businessRefs.contractSystemNo`
## 先做联通验证
在项目根目录执行:
```powershell
python -m rpa_yisaiqi.contract_create_node `
--state-center-url http://127.0.0.1:8000 `
--token dev-agent-token `
--job-id YYC-联调测试供应商-20260811-a6e5df `
--supplier-name 联调测试供应商 `
--order-date 2026-08-11 `
--source-type YYC `
--contract-system-no HT-20260811-001
```
这条只验证回调链路,合同号由命令行传入。
## 真实合同起草运行
客商必须用合同测试系统里**真实存在**的操作码。`CUST-YYC-001` 这类占位符会在选客商时搜不到,入参校验会直接拒绝。
测试环境当前可用:
| 字段 | 值 |
| --- | --- |
| customerCode | `DW0100046361` |
| customerName | `重庆亿昊药业有限公司` |
联调入参用:
- `examples/contract_create_input_dry_run.json`:真客商 + `dry_run`,先校准页面
- `examples/contract_draft_yyc.json`:医药城,同上客商
- `examples/contract_draft_xyy.json`:小药药分支(不上传 PDF),客商仍用合同系统里能搜到的同一条
YYC 有多份平台 PDF 时需要合并,先安装:
```powershell
pip install -r rpa_yisaiqi/requirements.txt
```
然后运行:
```powershell
python -m rpa_yisaiqi.contract_create_node `
--state-center-url http://192.168.x.x:8000 `
--token dev-agent-token `
--job-id <状态中心job_id> `
--supplier-name 重庆亿昊药业有限公司 `
--order-date 2026-08-11 `
--source-type YYC `
--draft-path rpa_yisaiqi/examples/contract_draft_yyc.json `
--merged-pdf-output C:/rpa/jobs/<状态中心job_id>/contract-merged.pdf
```
这条会走真实起草流程:
1. 状态中心 `/start`
2. 打开合同系统并登录
3. 进入 `合同管理 > 合同起草`
4. 选择最近使用模板
5. 填签约方、基础信息、金额日期、货品明细、付款和特殊标志
6. YYC 合并并上传 PDF,XYY 跳过上传
7. 提交
8. 读取合同编号
9. 状态中心 `/complete`
### 先做 dry-run 预览
如果你只想先验证页面,不想真的提交,把输入里的 `submitMode` 设成 `dry_run`。这时流程会跑到提交前并输出 `contract-dry-run-ready` 截图,不会点提交,也不会读取真实合同号。
适合先校准 selector 的情况:
1. 进入 `合同管理 > 合同起草`
2. 选择最近使用模板
3. 填签约方、基础信息、金额日期、明细、付款和特殊标志
4. 停在提交前
如果状态中心部署在 macOS 主机,`--state-center-url` 换成 Windows 虚拟机能访问到的地址,例如:
```powershell
--state-center-url http://192.168.x.x:8000
```
## 艺赛旗画布怎么看
Studio 里「插入代码块」标题改不了,会一直显示「插入代码块#1」。步骤名写在节点**备注**里,画布上出现在代码块下方,例如 `S06 填写签约方`。
流程按四段换行,不要再排成一条长龙:
```
准备 开始 → S01 初始化 → S02 打开系统 → S03 登录
进入起草 S04 进入起草 → S05 选择模板
填写表单 S06 签约方 → S07 基础信息 → S08 金额日期 → S09 货品 → S10 付款
提交回写 S11 上传PDF → S12 提交 → S13 读合同号 → S14 回调
```
改步骤后先关掉 Studio,再生成画布:
```powershell
python rpa_yisaiqi/build_multinode_seq.py
```
然后重新打开 `rpa_yisaiqi/studio` 项目并编译。
## 接入真实页面自动化
真实艺赛旗页面操作按流程图拆在:
- `flows/contract_create_flow.json`:流程图节点清单
- `contract_flow_steps.py`:每个流程图节点对应的动作函数
- `yisaiqi_adapter_template.py`:艺赛旗浏览器活动适配模板
艺赛旗设计器里建议按这个顺序拖流程图:
1. `S01_CALLBACK_START`:HTTP 请求状态中心 `/start`
2. `S02_OPEN_CONTRACT_SYSTEM`:打开合同系统
3. `S03_LOGIN`:输入 `j_username`、`j_password`,点击 `btn_submit`
4. `S04_ENTER_CONTRACT_DRAFT`:进入 `合同管理 > 合同起草`
5. `S05_SELECT_RECENT_TEMPLATE`:选择最近使用模板
6. `S06_FILL_SIGNATORY_INFO`:填客户编码、客户名称
7. `S07_FILL_CONTRACT_BASIC_FORM`:填合同类别、结算类型、背景概述、合同性质
8. `S08_FILL_AMOUNT_AND_DATES`:填金额、签订日期、开始日期、结束日期
9. `S09_FILL_GOODS_LINES`:循环填货品明细
10. `S10_FILL_PAYMENT_AND_FLAGS`:填付款方式、付款期限、合同状态、是否包含血液制品等
11. `S11_MERGE_PDF_IF_YYC`:`sourceType=YYC` 时先合并同供应商同日 PDF;`XYY` 跳过
12. `S12_UPLOAD_PDF_IF_YYC`:`sourceType=YYC` 时上传合并 PDF;`XYY` 跳过
13. `S13_SUBMIT`:提交
14. `S14_READ_CONTRACT_NO`:读取合同编号到变量 `contractSystemNo`
15. `S15_CALLBACK_COMPLETE`:HTTP 请求状态中心 `/complete`
如果只做预览,把这条流程里的 `submitMode` 设成 `dry_run`,或者直接导入 `flows/contract_create_preview_flow.json`。
如果艺赛旗支持 Python 脚本块,直接把每个 `contract_flow_steps.py` 函数挂到对应流程图节点。
如果艺赛旗只支持原生活动,就按 `flows/contract_create_flow.json` 的节点顺序拖活动,用 `yisaiqi_adapter_template.py` 里的方法名做映射。
外层回调骨架仍然在 `contract_create_node.py`:
```python
create_contract_in_contract_system(spec)
```
这个函数最后返回合同编号字符串即可。状态中心回调、幂等键、错误码映射已经封在外层。后续接真页面时,可以在这里调用艺赛旗流程图,或让流程图最后把合同编号回传给这个函数。
## 异常映射
| 场景 | 异常类 | 回调错误码 | retryable | routeRole |
| --- | --- | --- | --- | --- |
| 登录失败 | `LoginFailed` | `SYS_LOGIN_FAIL` | true | OPS |
| 供应商合同被禁/失效 | `SupplierContractDisabled` | `BIZ_CONTRACT_DISABLED` | false | PURCHASER |
| PDF 合并能力不支持 | `PdfMergeUnsupported` | `CAP_PDF_MERGE_UNSUPPORTED` | false | OPS |
| 页面改版/元素找不到 | `ContractCreateError` | `UI_ELEMENT_NOT_FOUND` | false | OPS |