|
|
||
|---|---|---|
| .. | ||
| examples | ||
| flows | ||
| runners | ||
| runtime | ||
| selectors | ||
| studio | ||
| tests | ||
| README.md | ||
| __init__.py | ||
| __main__.py | ||
| agent.py | ||
| apa_browser_adapter.py | ||
| callback_client.py | ||
| contract_create_node.py | ||
| contract_draft.py | ||
| contract_flow_steps.py | ||
| pdf_utils.py | ||
| requirements.txt | ||
| yisaiqi_adapter_template.py | ||
README.md
艺赛旗联调包
这个目录是 Windows 和 macOS 共用的 RPA 包。状态机在 state_center,这里只负责回调外壳和节点 runner。
Mac 上先用 mock runner 把契约跑通:
# 状态中心已启动、DEV_MODE=true
python -m rpa_yisaiqi --create --auto-human
Agent 只听状态中心的当前节点和 next_node,不写死顺序。人工节点默认停下;加 --auto-human 才会替你提交待办。
CONTRACT_CREATE 联调骨架
第一版目标是先验证:
- Windows 虚拟机能访问状态中心。
CONTRACT_CREATE能按约定调用start。- 合同系统动作完成后能调用
complete,并带businessRefs.contractSystemNo。 - 登录失败、页面改版、合同禁用等异常能调用
fail。
合同节点步骤点
来自 state_center/给艺赛旗的开发交接.md:
- 打开合同测试系统:
http://contract-test.gzmpc.com:8080/ - 登录:
test002 / 1 - 左侧菜单进入
合同管理 > 合同起草 - 在最近使用模板中选择
templateName,非格式默认非格式--采购协议 - 填签约方信息:客户编码、客户名称
- 填基础信息:合同版本类型、合同类别、结算类型、合同背景概述、合同性质
- 填金额和日期,合同签订日期和合同开始日期必须等于订单日期
- 填货品明细
- 填付款信息与特殊标志:是否重大合同、是否预付款、归属年份、付款方式、付款期限、合同状态、是否包含血液制品
- 医药城
YYC:同供应商同日 PDF 先合并成一个再上传 - 小药药
XYY:格式合同,跳过合同证文上传 - 提交并读取合同编号
- 调状态中心
complete,必传businessRefs.contractSystemNo
先做联通验证
在项目根目录执行:
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
这条只验证回调链路,合同号由命令行传入。
真实合同起草运行
先准备合同起草输入 JSON,参考:
examples/contract_draft_yyc.jsonexamples/contract_draft_xyy.json
YYC 有多份平台 PDF 时需要合并,先安装:
pip install -r rpa_yisaiqi/requirements.txt
然后运行:
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
这条会走真实起草流程:
- 状态中心
/start - 打开合同系统并登录
- 进入
合同管理 > 合同起草 - 选择最近使用模板
- 填签约方、基础信息、金额日期、货品明细、付款和特殊标志
- YYC 合并并上传 PDF,XYY 跳过上传
- 提交
- 读取合同编号
- 状态中心
/complete
先做 dry-run 预览
如果你只想先验证页面,不想真的提交,把输入里的 submitMode 设成 dry_run。这时流程会跑到提交前并输出 contract-dry-run-ready 截图,不会点提交,也不会读取真实合同号。
适合先校准 selector 的情况:
- 进入
合同管理 > 合同起草 - 选择最近使用模板
- 填签约方、基础信息、金额日期、明细、付款和特殊标志
- 停在提交前
如果状态中心部署在 macOS 主机,--state-center-url 换成 Windows 虚拟机能访问到的地址,例如:
--state-center-url http://192.168.x.x:8000
接入真实页面自动化
真实艺赛旗页面操作按流程图拆在:
flows/contract_create_flow.json:流程图节点清单contract_flow_steps.py:每个流程图节点对应的动作函数yisaiqi_adapter_template.py:艺赛旗浏览器活动适配模板
艺赛旗设计器里建议按这个顺序拖流程图:
S01_CALLBACK_START:HTTP 请求状态中心/startS02_OPEN_CONTRACT_SYSTEM:打开合同系统S03_LOGIN:输入j_username、j_password,点击btn_submitS04_ENTER_CONTRACT_DRAFT:进入合同管理 > 合同起草S05_SELECT_RECENT_TEMPLATE:选择最近使用模板S06_FILL_SIGNATORY_INFO:填客户编码、客户名称S07_FILL_CONTRACT_BASIC_FORM:填合同类别、结算类型、背景概述、合同性质S08_FILL_AMOUNT_AND_DATES:填金额、签订日期、开始日期、结束日期S09_FILL_GOODS_LINES:循环填货品明细S10_FILL_PAYMENT_AND_FLAGS:填付款方式、付款期限、合同状态、是否包含血液制品等S11_MERGE_PDF_IF_YYC:sourceType=YYC时先合并同供应商同日 PDF;XYY跳过S12_UPLOAD_PDF_IF_YYC:sourceType=YYC时上传合并 PDF;XYY跳过S13_SUBMIT:提交S14_READ_CONTRACT_NO:读取合同编号到变量contractSystemNoS15_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:
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 |