# 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 干跑(不领表): ```bash 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): ```bash uv run python run_batch.py ``` `submitMode=dry_run` 跑到提交前,不点提交。真起草用 `examples/contract_draft_yyc.json` / `examples/contract_draft_xyy.json`。 ## 运维 ### 怎么跑 ```bash 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 干跑(不领表): ```bash 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 分钟租约: ```sql 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`。异常原文打本机日志,不进这两列。 ### 点名命令 ```bash 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/`。点击顺序和选择器本段不改。