AutoRpa/rpa_contract
Yuuuu 586db4be90 feat: 班次可重跑,避免对方单据重复
领取 UPDATE 按 500 个 fid 分段,同一事务,任一段失败整单回滚。选品一行一落并续租,系统故障改回待领。页面和商城调用期间归还连接。坏连接丢弃后再借一次,未提交语句只重试一次。

加购登录或查询失败放回待领。传入购物车读数且已够量则不再加车。合同按「我的合同」三态:没有则起草,唯一则复用合同号,多条保持处理中。返利送审前按合同号查已有总单,读到则补写不再新建;读号失败保持处理中。

同一次提交带上本分支尚未入库的 Oracle 连接层(rpa_oracle / rpa_browser)及各班次改接。
2026-10-24 02:41:13 +08:00
..
examples feat: 合同页按 MDM 搜货并按 fdId 读号 2026-10-09 11:24:54 +08:00
selectors chore: 根目录改成 oms + 四个英文作业包 2026-10-02 21:24:46 +08:00
tests feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
README.md feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +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-24 02:41:13 +08:00
contract_create_node.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
contract_draft.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
contract_flow_steps.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
contract_form.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +08:00
contract_goods.py feat: 班次可重跑,避免对方单据重复 2026-10-24 02:41:13 +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-24 02:41:13 +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):

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/。点击顺序和选择器本段不改。