AutoRpa/rpa_contract
34BFF76918A9449ABAB323149DDCEA73 7d258ce62f feat: 联调后收口选品加购合同返利
选品 cookie 只留 HTTP 可发项;11.2 按 fid IN 锁基表,避免 ORA-02014。
加购走现行口:1 号药城 /api/cart/add,药帮忙 change-cart。
合同吃接口 3 信封合单,页面缺省不猜。
返利计划员、账期、货源细单ID 读表 3,空则整组停。
2026-10-26 01:15:05 +08:00
..
examples feat: 联调后收口选品加购合同返利 2026-10-26 01:15:05 +08:00
selectors chore: 根目录改成 oms + 四个英文作业包 2026-10-02 21:24:46 +08:00
tests feat: 联调后收口选品加购合同返利 2026-10-26 01:15:05 +08:00
README.md feat: 联调后收口选品加购合同返利 2026-10-26 01:15:05 +08:00
accept.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
apa_browser_adapter.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
contract_common.py feat: 联调后收口选品加购合同返利 2026-10-26 01:15:05 +08:00
contract_create_node.py feat: 联调后收口选品加购合同返利 2026-10-26 01:15:05 +08:00
contract_draft.py feat: 联调后收口选品加购合同返利 2026-10-26 01:15:05 +08:00
contract_flow_steps.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
contract_form.py feat: 联调后收口选品加购合同返利 2026-10-26 01:15:05 +08:00
contract_goods.py feat: 联调后收口选品加购合同返利 2026-10-26 01:15:05 +08:00
contract_login.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
contract_number.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
contract_submit.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
contract_upload.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
errors.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
group.py feat: 联调后收口选品加购合同返利 2026-10-26 01:15:05 +08:00
job.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
main.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
pdf_utils.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
persist.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
pyproject.toml feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
repo.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
run_batch.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
uv.lock feat: 合同班 Oracle 领取与班次入口 2026-10-05 23:05:02 +08:00

README.md

rpa_contract

合同班。从表 3 领取、按 supplierId 合单、调页面录入、写表 4。接口 4 组包在 rpa_oms,本班不推、不改 push_status。

读 表 3 rpa_purchase_contract_data(process_status=0;跳过 contractEntryStatus=0 且已有 contractNo 的协议重录行)
写 表 4 rpa_contract_agreement_result(actionCode=1,提交成功 contractStatus=1 起草)
口 口 3 收件在 rpa_oms;口 4 组包在 oms,path 空

一天两班(中午、下午)。启动瞬间冻结本班名单(process_status 0→3)。按 supplierId 合单;头字段取该班该供应商第一行。下午同一供应商另开一份。

口径:docs/RPA订单中心接口开发口径_20260930.md 第 4 节;合单细节见 docs/合同系统录入流程.md。

测试环境

地址:http://contract-test.gzmpc.com:8080/
账密只认环境变量 CONTRACT_USERNAME / CONTRACT_PASSWORD,缺则入口失败。不要把密码写进仓库。
客商必须是合同系统里真实存在的操作码,占位符搜不到。例如 DW0100046361 / 重庆亿昊药业有限公司。

页面步骤

脚本直达起草/模板 URL。修一步只打开对应文件;contract_flow_steps.py 是对外入口。

  1. 打开合同系统并登录(contract_login.py S02–S05)
  2. 进起草,套非格式采购协议模板(直达 FORM_PAGE_URL)
  3. 签约方:客户编码、客户名称(contract_form.py S06)
  4. 尽调:页面正文含「未尽调」则本单失败,不提交
  5. 基础信息:合同版本类型、合同类别、结算类型、合同背景概述、合同性质=主合同(S07)
  6. 金额与日期:签订日 / 开始日 / 结束日用接口 3 第一行三日期(JSON 干跑未给则回退 orderDate)(S08)
  7. 货品明细:弹窗按操作码搜,找不到则本单失败(contract_goods.py S09)
  8. 付款与标志:这期一律账期,不勾预付款;页面「账期支付」对应选项「电汇」(S10)
  9. 挂合同正文(contract_upload.py S11);点提交(contract_submit.py S12),不要只点暂存
  10. 按 fdId 从详情读正式合同号(contract_number.py S13)

选择器、工具栏、fdId 在 contract_common.py。

运行

JSON 干跑(不领表):

cd rpa_contract
uv sync --python 3.12
uv run pytest tests/test_job.py::test_job_merges_same_supplier_and_writes_table4 -q
uv run python main.py --input-json examples/contract_create_input_dry_run.json

接口 3 形态 JSON(不领表,合单规则与班次相同;客商/货品/日期/金额都从报文来):

uv run python main.py --input-json examples/oms_purchase_contract.json

班次(领表 3):

uv run python run_batch.py

submitMode=dry_run 跑到提交前,不点提交。真起草用 examples/contract_draft_yyc.json / examples/contract_draft_xyy.json。

运维

怎么跑

cd rpa_contract
uv sync --python 3.12
uv run python run_batch.py

Oracle 空缺时补 rpa_oms/.env。连接从 rpa_oracle 池取,班次默认池大小 1。缺 RPA_ORACLE_HOST / 用户 / 密码时入口失败,文案「数据库不可用」。合同系统账密用 CONTRACT_USERNAME / CONTRACT_PASSWORD。未捕获异常原文进 rpa_shift_error_audit,Windows 上先执行 docs/ddl/rpa_oms_staging_tables.sql 里这张表。

JSON 干跑(不领表):

uv run python main.py --input-json examples/contract_create_input_dry_run.json

看哪张表哪几列

  • 表 3 rpa_purchase_contract_data:process_status(0 待领,3 处理中,1 成功,2 失败)、process_time、process_result、supplier_id、contract_entry_status、contract_no
  • 表 4 rpa_contract_agreement_result:action_code=1、contract_status(1 起草成功,3 失败)、contract_no、contract_fail_reason、push_status=0

崩溃改回 SQL

停在 3 且未过 30 分钟租约:

UPDATE rpa_purchase_contract_data
SET process_status = 0
WHERE process_status = 3 AND fid = :fid;

过期的 3 下一班会再领,不必改。协议重录行(contract_entry_status=0 且已有 contract_no)本班不领。

原因列 vs 日志原文

表 3 process_result / 表 4 contract_fail_reason:尽调写「客户未尽调」,页面 NodeError 写业务文案,未捕获异常写 PAGE_FAILED。异常原文打本机日志,不进这两列。

点名命令

cd rpa_contract
uv run pytest tests/test_job.py::test_job_merges_same_supplier_and_writes_table4 -q
uv run pytest tests/test_job.py::test_job_marks_diligence_fail -q
uv run pytest tests/test_oracle_repo.py::test_from_env_without_user_raises -q
uv run pytest tests/test_job.py::test_claim_reclaims_expired_status_3 tests/test_job.py::test_claim_skips_fresh_status_3 -q
uv run pytest tests/test_flow_gates.py -q

页面验收只看控制台 ACCEPT SUMMARY 或 screenshots/ 下 ACCEPT.txt,禁止读 png。

本期不做

向订单中心发 HTTP、改 push_status。返利在 rpa_rebate/。点击顺序和选择器本段不改。