领取 UPDATE 按 500 个 fid 分段,同一事务,任一段失败整单回滚。选品一行一落并续租,系统故障改回待领。页面和商城调用期间归还连接。坏连接丢弃后再借一次,未提交语句只重试一次。 加购登录或查询失败放回待领。传入购物车读数且已够量则不再加车。合同按「我的合同」三态:没有则起草,唯一则复用合同号,多条保持处理中。返利送审前按合同号查已有总单,读到则补写不再新建;读号失败保持处理中。 同一次提交带上本分支尚未入库的 Oracle 连接层(rpa_oracle / rpa_browser)及各班次改接。 |
||
|---|---|---|
| .. | ||
| tests | ||
| .env.example | ||
| README.md | ||
| accept.py | ||
| apa_browser_adapter.py | ||
| errors.py | ||
| job.py | ||
| persist.py | ||
| pyproject.toml | ||
| rebate_common.py | ||
| rebate_find.py | ||
| rebate_finder.py | ||
| rebate_flow_steps.py | ||
| rebate_header.py | ||
| rebate_import.py | ||
| rebate_submit.py | ||
| repo.py | ||
| run_batch.py | ||
| run_find.py | ||
| run_header.py | ||
| run_import.py | ||
| run_submit.py | ||
| uv.lock | ||
| 现行模式.md | ||
| 返利流程(1).md | ||
| 返利流程.md | ||
README.md
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 节。
运行
内存替身(不连库、不开浏览器):
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:
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):
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):
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):
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):
cd rpa_oms
uv run pytest tests/test_contract_agreement_outbound.py::test_assembles_unpushed_rows_as_document_envelope -q
运维
怎么跑
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 分钟租约。同一合同号一起改回:
UPDATE rpa_contract_agreement_result
SET process_status = 0
WHERE process_status = 3
AND TRIM(contract_no) = :contract_no;
表 3 只录协议行停在 3 且未过 30 分钟租约:
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。
点名命令
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 仍是对外入口。