# rpa_rebate 返利班。领表 4 起草行、表 3 只录协议行,按合同号查返利中心。搜到后同一班走总单 → 细单新增 → 送审;送审成功才写表 4。接口 4 组包在 `rpa_oms`,本班不推、不改 `push_status`。细单不做 Excel 导入。现行字段见 `现行模式.md`、`返利流程.md`。 | | | | --- | --- | | 读 | 表 4 `action_code=1 AND contract_status=1`(已有合同号、尚未回成功);表 3 `contract_entry_status=0` 且已有 `contractNo` | | 写 | 表 4:搜到则起草行 `contractStatus=2`;送审成功插 `actionCode=2`、`agreementStatus=1`,带总单/细单号 | | 口 | 口 4(组包在 oms,path 空) | 与合同同一天两班,建议合同班跑完再跑。查号挂在本班,不单开查状态任务。搜不到不重录合同,表 4 `process_status` 改回 `0`,留给下一班再搜。 口径:`docs/RPA订单中心接口开发口径_20260930.md` 第 5 节。 ## 运行 内存替身(不连库、不开浏览器): ```bash cd rpa_rebate uv sync --python 3.12 uv run pytest tests/test_job.py::test_job_finds_contract_and_writes_agreement -q uv run pytest tests/test_finder.py::test_find_flow_writes_accept_for_missing_number -q uv run pytest tests/test_header.py::test_header_flow_writes_accept_with_order_no -q uv run pytest tests/test_import.py::test_import_flow_writes_accept_with_success_fail -q uv run pytest tests/test_submit.py::test_submit_flow_writes_accept_with_order_nos -q ``` 页面查号(不开录协议、不连 Oracle)。账号放本机 `.env`: ```bash cd rpa_rebate uv run python run_find.py ``` 验收看控制台 `ACCEPT SUMMARY REBATE_FIND` 或 `screenshots/REBATE_FIND/ACCEPT.txt`。默认搜哨兵号,期望 `found=no`。要搜真号:`REBATE_ACCEPT_CONTRACT_NO=合同号`。 页面总单(复用查号已登录 Chrome,不送审、不连 Oracle): ```bash cd rpa_rebate uv run python run_header.py ``` 验收看控制台 `ACCEPT SUMMARY REBATE_HEADER` 或 `screenshots/REBATE_HEADER/ACCEPT.txt`。需要 `REBATE_ACCEPT_CONTRACT_NO`。优先表 3:供应商 MDM、货品行。计划员「廖建琦」,联系人「苏文辉」,承付「下月N号结」,承付参数 `25`,结算「电汇」,协议开始/结束当天。卡片仍在「编辑」时点总单工具栏保存。 页面细单新增(复用查号已登录 Chrome,不送审、不写 `actionCode=2`、不连 Oracle,不做 Excel): ```bash cd rpa_rebate uv run python run_import.py ``` 验收看控制台 `ACCEPT SUMMARY REBATE_IMPORT` 或 `screenshots/REBATE_IMPORT/ACCEPT.txt`,须货品表有行。需要 `REBATE_ACCEPT_CONTRACT_NO`。表 3 有货品则按行新增;空缺再用 `REBATE_GOODS_ID` / `REBATE_QTY` / `REBATE_TAX_PRICE` / `REBATE_ORDER_NO`(或 `REBATE_IMPORT_LINES` JSON,字段 `goodsId`)。货品编码三个点按货品ID搜。细单备注=订单号,特定补偿=0,承付参数=25。不要用操作码或 MDM 码去搜。 页面送审(复用查号已登录 Chrome,不写 `actionCode=2`、不连 Oracle、不推口 4): ```bash cd rpa_rebate uv run python run_submit.py ``` 验收看控制台 `ACCEPT SUMMARY REBATE_SUBMIT` 或 `screenshots/REBATE_SUBMIT/ACCEPT.txt`,须带总单号/细单号。需要 `REBATE_ACCEPT_CONTRACT_NO`。点完马上能看见号才回成功。 接口 4 组包(`rpa_oms`,不发 HTTP): ```bash cd rpa_oms uv run pytest tests/test_contract_agreement_outbound.py::test_assembles_unpushed_rows_as_document_envelope -q ``` ## 运维 ### 怎么跑 ```bash cd rpa_rebate uv sync --python 3.12 uv run python run_batch.py ``` Oracle 空缺时补 `rpa_oms/.env`。连接从 `rpa_oracle` 池取,班次默认池大小 1。缺 `RPA_ORACLE_HOST` / 用户 / 密码时入口失败,文案「数据库不可用」。返利中心账密放本包 `.env`。未捕获异常原文进 `rpa_shift_error_audit`,Windows 上先执行 `docs/ddl/rpa_oms_staging_tables.sql` 里这张表。 ### 看哪张表哪几列 - 表 4 `rpa_contract_agreement_result`:`action_code=1` 且 `contract_status=1` 的起草行;`process_status`(0 待查号,3 查号中,1 已回写,2 合同失败不进返利);`update_time`;`create_user_name` / `update_user_name` 固定「系统管理员」;送审成功另插 `action_code=2`、`agreement_status=1`、`agreement_id` / `agreement_dtl_id`;`push_status=0` - 表 3 `rpa_purchase_contract_data`:只录协议行 `contract_entry_status=0` 且已有 `contract_no`;`process_status`(0 待领,3 处理中,1 成功,2 失败)、`process_time`、`process_result` ### 崩溃改回 SQL 表 4 停在 `process_status=3` 且未过 30 分钟租约。同一合同号一起改回: ```sql UPDATE rpa_contract_agreement_result SET process_status = 0 WHERE process_status = 3 AND TRIM(contract_no) = :contract_no; ``` 表 3 只录协议行停在 3 且未过 30 分钟租约: ```sql UPDATE rpa_purchase_contract_data SET process_status = 0 WHERE process_status = 3 AND fid = :fid AND NVL(contract_entry_status, -1) = 0 AND contract_no IS NOT NULL; ``` 过期的 3 下一班会再领,不必改。搜不到会自动把表 4 改回 0、表 3 改回 0。 ### 原因列 vs 日志原文 表 3 `process_result`:业务失败写页面文案(总单未拿到号、细单失败原因、送审失败);未捕获异常写 `HEADER_FAILED` / `IMPORT_FAILED` / `SUBMIT_FAILED` / `PAGE_FAILED`。异常原文打本机日志,不进这一列。表 4 搜不到不写失败原因,`process_status` 改回 0。 ### 点名命令 ```bash cd rpa_rebate uv run pytest tests/test_job.py::test_job_finds_contract_and_writes_agreement -q uv run pytest tests/test_job.py::test_job_leaves_not_found_for_next_shift -q uv run pytest tests/test_job.py::test_claim_reclaims_expired_claiming_stamp tests/test_job.py::test_claim_skips_fresh_claiming_stamp -q uv run pytest tests/test_oracle_repo.py::test_from_env_without_user_raises -q ``` ## 本期不做 货源细单ID、计划员改回订单中心、向订单中心发 HTTP、改 `push_status`。货源弹层按联系人「苏文辉」过滤,见 `返利流程.md`。页面步骤按节点拆在 `rebate_find.py` / `rebate_header.py` / `rebate_import.py` / `rebate_submit.py`,共用登录/查号/勾行/弹层在 `rebate_common.py`;`rebate_flow_steps.py` 仍是对外入口。