diff --git a/AGENTS.md b/AGENTS.md index 48c0947..412d4b4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # AutoRpa -洁达 RPA。当前主线是**订单中心入站**(`rpa_oms`)、**选品班次**(`rpa_selection/`)和**加购班次**(`rpa_cart/`):收件落 Oracle,请求里不跑选品;选品作业另起进程捞 `deal_flag=0`;加购另起进程领表 2 成功行。合同页面在 `rpa_contract/`;返利 `rpa_rebate/` 仍是占位。根上不再有 `选品流程/`、`state_center/`、`rpa_yisaiqi/`。 +洁达 RPA。当前主线是**订单中心入站**(`rpa_oms`)、**选品班次**(`rpa_selection/`)、**加购班次**(`rpa_cart/`)和**合同班次**(`rpa_contract/`):收件落 Oracle,请求里不跑选品、不录合同;选品另起进程捞 `deal_flag=0`;加购另起进程领表 2 成功行;合同另起进程领表 3。返利 `rpa_rebate/` 仍是占位。根上不再有 `选品流程/`、`state_center/`、`rpa_yisaiqi/`。 智力用在**定落点、想清楚对错**;速度和 token 靠下面这张地图定点打开,禁止用扫仓代替思考。改对应了,反工和消耗都会少。 @@ -22,10 +22,12 @@ | 接口1 Oracle 落表 | `rpa_oms/app/inbound/oracle_repo.py` | `rpa_oms/tests/test_oracle_repo.py::点名` | | 接口1 入口 / 鉴权 | `rpa_oms/app/main.py`、`auth.py` | 同上;真库见 `rpa_oms/README.md` Windows 段 | | 接口2 取数组装 | `rpa_oms/app/outbound/cart_settlement.py` | `rpa_oms/tests/test_cart_settlement_outbound.py::test_assembles_unpushed_rows_as_document_envelope` | +| 接口4 取数组装 | `rpa_oms/app/outbound/contract_agreement.py` | `rpa_oms/tests/test_contract_agreement_outbound.py::test_assembles_unpushed_rows_as_document_envelope` | | 接口3 收件契约 | `rpa_oms/app/inbound/purchase_contract.py` | `rpa_oms/tests/test_purchase_contract_receive.py::点名` | | 接口3 Oracle 落表 | `rpa_oms/app/inbound/oracle_contract_repo.py` | `rpa_oms/tests/test_oracle_contract_repo.py::点名` | | 选品规则 / 拆量 | `rpa_selection/rules.py`、`pipeline.py` | `rpa_selection/tests/test_pipeline.py::test_split_across_malls_is_success` | | 选品班次落表 | `rpa_selection/job.py`、`persist.py`、`repo.py` | `rpa_selection/tests/test_job.py::test_job_searches_barcode_not_approval_no` | +| 合同班合单落表 | `rpa_contract/job.py`、`group.py`、`persist.py`、`repo.py` | `rpa_contract/tests/test_job.py::test_job_merges_same_supplier_and_writes_table4` | | 合同页面步骤 | `rpa_contract/contract_flow_steps.py` 里对应函数 | `ACCEPT SUMMARY` 或 `rpa_contract/screenshots/` 下 `ACCEPT.txt` | | 合同入参 / 客商草稿 | `rpa_contract/contract_draft.py` | `rpa_contract` 点名用例 | | 节点入口 | `rpa_contract/contract_create_node.py`、`main.py` | 读到正式合同号 | @@ -64,7 +66,7 @@ 验收(内存、不连库):`cd rpa_oms` → `uv run pytest tests/test_sales_goods_receive.py::点名 -q`。真库:`GET /health` 后把 `examples/sales_goods_batch.json` POST 两次(第一次两条 `ACCEPTED`,第二次两条 `DUPLICATE`)。接口 3 点名 `tests/test_purchase_contract_receive.py`;真库 POST `examples/purchase_contract_batch.json` 两次。接口 2 点名 `tests/test_cart_settlement_outbound.py::test_assembles_unpushed_rows_as_document_envelope`。 -修接口1不要顺手改 `rpa_selection/`、`rpa_cart/`、`rpa_contract/`、`rpa_rebate/`。接口 4 未开放;接口 2 只组装不推送。 +修接口1不要顺手改 `rpa_selection/`、`rpa_cart/`、`rpa_contract/`、`rpa_rebate/`。接口 2、4 只组装不推送。 ## 选品落点 @@ -102,7 +104,7 @@ ## CONTRACT_CREATE 落点 -页面脚本在 `rpa_contract/`。`run_contract_create_flow` 串起来;修一步只打开对应函数。从表 3 合单、写表 4 尚未接。 +班次作业在 `rpa_contract/`,不在接口 3 请求里跑。领表 3 `process_status=0`(跳过协议重录行),按 `supplierId` 合单,调页面流,写表 4。`run_contract_create_flow` 串页面;修一步只打开对应函数。 | 步 | 函数 | 要点 | | --- | --- | --- | @@ -110,8 +112,9 @@ | S03 登录 | `login_contract_system` | `test002` / `1` | | S04–S05 起草 | `enter_contract_create`、`select_contract_template` | 直达 `FORM_PAGE_URL`,不要点 SPA 菜单 | | S06 签约方 | `fill_contract_signatory_info` | 客商 `DW0100046361` / `重庆亿昊药业有限公司` | +| 尽调 | `check_customer_diligence` | 正文含「未尽调」则失败,不提交 | | S07 基础 | `fill_contract_basic_info` | 标题 `_expected_title` | -| S08 金额日期 | `fill_contract_amount_and_dates` | 签约日=订单日 | +| S08 金额日期 | `fill_contract_amount_and_dates` | 签订日/开始日用接口 3 三日期,缺则回退 `order_date` | | S09 货品 | `fill_contract_goods_lines` | 弹窗按操作码搜 | | S10 付款 | `fill_contract_payment_info` | | | S11 PDF | `upload_contract_document_if_needed` | 仅 YYC 传合并 PDF | @@ -142,6 +145,8 @@ - 接口3:点名 `rpa_oms/tests/test_purchase_contract_receive.py` 或 `test_oracle_contract_repo.py`。 - 选品:点名 `rpa_selection/tests/test_pipeline.py::test_split_across_malls_is_success` 或 `test_rules.py::test_margin_exactly_4_percent_passes`。 - 加购:点名 `rpa_cart/tests/test_cart_job.py::test_job_adds_split_rows_without_insert` 或 `test_job_marks_out_of_stock`。 +- 合同班:点名 `rpa_contract/tests/test_job.py::test_job_merges_same_supplier_and_writes_table4` 或 `test_job_marks_diligence_fail`。 +- 接口4:点名 `rpa_oms/tests/test_contract_agreement_outbound.py::test_assembles_unpushed_rows_as_document_envelope`。 - 合同页:只读控制台 `ACCEPT` 或 `rpa_contract/screenshots/` 下 `ACCEPT.txt`。 - 单测只跑点名用例。禁止跑整份带页面等待的套件当回归。 diff --git a/README.md b/README.md index 9411b57..136b0d4 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ | 1 | 订单中心 → 本方 | `rpa_sales_goods_mapping_data` | `POST /api/oms/v1/sales-goods` | | 2 | 本方 → 订单中心 | `rpa_cart_settlement_goods_data` | 取 `push_status=0` 组装报文;路径仍空,不发 HTTP | | 3 | 订单中心 → 本方 | `rpa_purchase_contract_data` | `POST /api/oms/v1/purchase-contracts` | -| 4 | 本方 → 订单中心 | `rpa_contract_agreement_result` | 路径空,先造数 | +| 4 | 本方 → 订单中心 | `rpa_contract_agreement_result` | 取 `push_status=0` 组装报文;路径仍空,不发 HTTP | 作业互不串联:选品读表 1,合同/返利读表 3。HTTP 收件不同步跑 RPA。 @@ -19,10 +19,10 @@ | 目录 | 身份 | | --- | --- | -| `rpa_oms/` | 四个 HTTP 口,一个 FastAPI。接口 1、3 收件;接口 2 组装报文 | +| `rpa_oms/` | 四个 HTTP 口,一个 FastAPI。接口 1、3 收件;接口 2、4 组装报文 | | `rpa_selection/` | 选品班。读表 1 `deal_flag=0`,双平台选品,写表 2 | | `rpa_cart/` | 加购(未做)+ 1 号药城支付落表。表 2 → 口 2 仍未推 | -| `rpa_contract/` | 合同班。页面录入在本包;表 3 合单、接口 4 尚未接 | +| `rpa_contract/` | 合同班。表 3 合单录入 → 表 4;接口 4 组包在 oms,path 空 | | `rpa_rebate/` | 返利班(占位)。查号、录协议 → 表 4 | | 包 | 读 | 写 | 口 | diff --git a/rpa_contract/README.md b/rpa_contract/README.md index 24fcb44..62710f9 100644 --- a/rpa_contract/README.md +++ b/rpa_contract/README.md @@ -1,14 +1,14 @@ # rpa_contract -合同班。页面录入脚本在本包;从表 3 合单、写表 4、推接口 4 尚未接。 +合同班。从表 3 领取、按 `supplierId` 合单、调页面录入、写表 4。接口 4 组包在 `rpa_oms`,本班不推、不改 `push_status`。 | | | | --- | --- | -| 读 | 表 3 `rpa_purchase_contract_data`(`process_status=0`) | -| 写 | 表 4 `rpa_contract_agreement_result`(接口 4 `actionCode=1`,`contractStatus=1` 起草) | -| 口 | 口 3 收件在 `rpa_oms`;口 4 回写做到时由本班调用 | +| 读 | 表 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 空 | -一天两班(中午、下午)。启动瞬间冻结本班名单。按 `supplierId` 合单;头字段取该班该供应商第一行。下午同一供应商另开一份。 +一天两班(中午、下午)。启动瞬间冻结本班名单(`process_status` 0→3)。按 `supplierId` 合单;头字段取该班该供应商第一行。下午同一供应商另开一份。 口径:`docs/RPA订单中心接口开发口径_20260930.md` 第 4 节;合单细节见 `docs/合同系统录入流程.md`。 @@ -25,25 +25,33 @@ 1. 打开合同系统并登录 2. 进起草,套非格式采购协议模板 3. 签约方:客户编码、客户名称 -4. 基础信息:合同版本类型、合同类别、结算类型、合同背景概述、合同性质=主合同 -5. 金额与日期:签订日 / 开始日 / 结束日 -6. 货品明细 -7. 付款与标志:这期一律账期,不勾预付款;页面「账期支付」对应选项「电汇」 -8. 尽调:口径有,脚本尚未加这一闸 +4. 尽调:页面正文含「未尽调」则本单失败,不提交 +5. 基础信息:合同版本类型、合同类别、结算类型、合同背景概述、合同性质=主合同 +6. 金额与日期:签订日 / 开始日 / 结束日用接口 3 第一行三日期(JSON 干跑未给则回退 `orderDate`) +7. 货品明细 +8. 付款与标志:这期一律账期,不勾预付款;页面「账期支付」对应选项「电汇」 9. 点提交,不要点暂存 10. 从「我的合同」读正式合同号 ## 运行 +JSON 干跑(不领表): + ```bash cd rpa_contract uv sync --python 3.12 -uv run pytest -v +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`。 ## 本期不做 -从表 3 按班次合单、尽调闸、接口 4 回写。 +返利班、向订单中心发 HTTP、改 `push_status`。 diff --git a/rpa_contract/pyproject.toml b/rpa_contract/pyproject.toml index d21d009..397cfbc 100644 --- a/rpa_contract/pyproject.toml +++ b/rpa_contract/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "rpa-contract" version = "0.1.0" -description = "洁达合同班。表 3 合单录入 → 表 4。页面脚本已在本包;合单与接口 4 尚未接。" +description = "洁达合同班。表 3 合单录入 → 表 4。接口 4 组包在 rpa_oms。" readme = "README.md" requires-python = ">=3.12" dependencies = [