# 洁达商城选品 班次作业:从表 1 捞 `deal_flag=0`,按**条形码**搜 1 号药城 / 药帮忙,规则选出仓,结果写入表 2。不加购,不推订单中心。 口径:`docs/RPA订单中心接口开发口径_20260930.md` 第 3 节。 ## 数据流 ```text rpa_sales_goods_mapping_data (deal_flag=0) → 领取并置 3 → 登录一次 / 平台 → 按条形码搜索(批准文号只落表,不拿去搜) → 选品规则(两平台合并,按仓序拆量) → rpa_cart_settlement_goods_data(operate_type=1, push_status=0) → 表 1 deal_flag=1 成功 / 2 失败 ``` 两平台搜完后**合并统一判定**。凑齐计划量才落成功行;凑不齐不落部分成功。一边故障、另一边单独能凑齐:按成功落。一边故障且剩下的凑不齐:系统故障(可把 `deal_flag` 改回 0 重跑)。两边都搜到但合计不够:业务失败「库存不足」,该 `omsId` 不重跑。 ## 规则 硬过滤三项,再按仓序拆量(同一平台同一仓的多个 sku 都参与,低价先吃): 1. 自营仓(商家名去 `[自营]` 后必须等于四级名单全称) 2. 毛利 `(销售价格 - 平台价) / 销售价格 >= 4%` 3. 效期 ≥ 12 个月 4. 仓序(级内由近到远):药帮忙杭州/长沙/湖北小药药 → 1 药城广东/昆山/湖北亿昊 → 济南小药药、天津壹号、重庆亿昊 → 辽宁亿昊、陕西壹号、河南壹号、重庆壹号、重庆小药药 5. 按序贪心拆量。凑齐则每条拆量一行,`purchase_qty` 为该条件数;凑不齐整单失败 `multi_platform_flag=1` 仅当成功行出现两个 `platform_type`。湖南壹号、甘肃壹号云不在自营集合。口径见 `docs/superpowers/specs/2026-10-02-selection-split-allocation-design.md`。 ## 环境 ```bash cd rpa_selection uv sync --python 3.12 uv run playwright install chromium ``` Oracle 与 `rpa_oms` 同一套变量:`RPA_ORACLE_HOST` / `PORT` / `SERVICE` / `USER` / `PASSWORD`,11.2 用 thick。Windows 还要 `RPA_ORACLE_CLIENT_LIB`。选品 `.env` 里 Oracle 密码留空时,会补 `rpa_oms/.env` 里已有的值。连接从 `rpa_oracle` 池取,班次默认池大小 1。 商城账号只认环境变量(不要提交真实密码):复制 `.env.example` 为 `.env`,填 `YAOEX_USERNAME` / `YAOEX_PASSWORD` / `YBM_USERNAME` / `YBM_PASSWORD`。 已有登录态可跳过浏览器:`--yaoex-auth auth.json`、`--ybm-cookies cookies.json`。 ## 运行 ```bash cd rpa_selection uv run pytest tests/test_pipeline.py::test_split_across_malls_is_success tests/test_job.py::test_job_searches_barcode_not_approval_no -q uv run python main.py --limit 5 uv run python main.py --platform yaoex ``` Windows: ```powershell cd rpa_selection uv sync --python 3.12 Copy-Item -LiteralPath .env.example -Destination .env # 商城账号写本机 .env;Oracle 也可只留在 rpa_oms/.env .\start.ps1 --limit 5 ``` `--limit` 只领取本班前 N 条。跑的过程中新进入的留给下一班。 中途崩溃会停在 `deal_flag=3`。`deal_time` 超过 30 分钟的 3 下一班会再领;未过期的 3 不领。系统故障不能靠订单中心重推同一 `oms_id`(接口 1 幂等),把 `deal_flag` 改回 `0` 或等租约到期。 ## 模块 | 文件 | 职责 | | --- | --- | | `main.py` | 登录编排 | | `job.py` | 班次:领取 → 按行判定 → 落表 | | `persist.py` | 判定结果 → 表 2 行 + 表 1 处理标志 | | `repo.py` | Oracle / 内存仓库 | | `rules.py` | 选品规则,两平台共用 | | `pipeline.py` | 单行两平台统一判定 | | `search_yaoex.py` / `search_ybm.py` | 搜索接口;查询键是条形码 | | `auth_login.py` | Playwright 登录 | ## 运维 ### 怎么跑 ```bash cd rpa_selection uv sync --python 3.12 uv run python main.py --limit 5 ``` Windows 把商城账号写本机 `.env`,Oracle 也可只留在 `rpa_oms/.env`,然后 `.\start.ps1 --limit 5`。缺 `RPA_ORACLE_HOST` / 用户 / 密码时入口失败,文案「数据库不可用」。 ### 看哪张表哪几列 - 表 1 `rpa_sales_goods_mapping_data`:`oms_id`、`deal_flag`(0 待领,3 处理中,1 成功,2 失败)、`deal_time`、`deal_result`、`bar_code` - 表 2 `rpa_cart_settlement_goods_data`:`oms_id`、`status`(1 成功,2 失败)、`fail_reason`、`push_status=0`、`purchase_qty` ### 崩溃改回 SQL 停在 3 且未过 30 分钟租约: ```sql UPDATE rpa_sales_goods_mapping_data SET deal_flag = 0 WHERE deal_flag = 3 AND oms_id = :oms_id; ``` 过期的 3 下一班会再领,不必改。系统故障也是 `deal_flag=2`,要重跑同样改回 0。 ### 原因列 vs 日志原文 表 1 `deal_result` / 表 2 `fail_reason` 写短码(`QUERY_FAILED`、`LOGIN_FAILED`)。查询失败原文写入 `rpa_selection_query_audit`,不进这两列。 ### 点名命令 ```bash cd rpa_selection uv run pytest tests/test_pipeline.py::test_split_across_malls_is_success -q uv run pytest tests/test_job.py::test_job_searches_barcode_not_approval_no -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_flag_3 tests/test_job.py::test_claim_skips_fresh_flag_3 -q ``` ## 本期不做 加购、接口 2 推送、支付回传、批准文号搜索、商家名模糊匹配。