凑齐的新行先标成加购中并取回 fid,同一班加车。表 2 已有该 omsId 时不加第二份。加购失败不回滚表 1。补偿班只补仍是系统管理员或过期加购中的行。 |
||
|---|---|---|
| .. | ||
| tests | ||
| README.md | ||
| cart_add.py | ||
| cart_job.py | ||
| cart_match.py | ||
| cart_repo.py | ||
| cart_search.py | ||
| cart_yaoex.py | ||
| cart_ybm.py | ||
| job.py | ||
| main.py | ||
| parse_xls.py | ||
| pyproject.toml | ||
| repo.py | ||
| selection_path.py | ||
| settle.py | ||
| uv.lock | ||
| yaoex_client.py | ||
| yaoex_login.py | ||
README.md
rpa_cart
加购与支付回传。两个班次,同一个包。
| 班次 | 状态 |
|---|---|
加购 operateType=1 |
领表 2 选品成功行,按仓加进购物车。成功盖章,失败改 status=2 |
支付回传 operateType=2 |
1 号药城已做落表。不推接口 2 |
加购
选品凑齐的行在选品班里按本次拆定的 sku 直接加车,不经过这里。本命令只补还停在 update_user_name=系统管理员、或租约过期的「加购中」的行。那些行表 2 里没有 sku,仍按条形码再搜,对上 supplier_name 再加。同一 omsId 拆两仓、两平台要加齐。
成功不插新行,只把 update_user_name 改成 加购班。加不进去(登录挂、库存没了、中包装加不进、对不上仓)改该行 status=2,写失败原因。领取时先盖 加购中;中途崩溃停在这一戳。update_time 超过 30 分钟的「加购中」下一班会再领;未过期的需改回 系统管理员 再跑。
不推订单中心,不清空购物车,不碰合同。表 2 没有 sku_id,加购必须再搜条形码。选完到加购之间库存可能变,已知。
cd rpa_cart
uv sync --python 3.12
uv run python main.py cart
uv run python main.py cart --limit 20
uv run python main.py cart --platform yaoex
账号用 rpa_selection/.env 的 YAOEX_* / YBM_*,库用 RPA_ORACLE_*。
验收(内存、不连库):
uv run pytest tests/test_cart_job.py::test_job_adds_split_rows_without_insert -q
杭州 3 + 广东 7 两行都加车,表 2 仍两行。失败点名 test_job_marks_out_of_stock、test_job_marks_login_fail_as_system_error。
接口 2 仍捞全部 push_status=0。加购班跑完之前不要组装推送。
运维
怎么跑
cd rpa_cart
uv sync --python 3.12
uv run python main.py cart --limit 20
账号用 rpa_selection/.env 的 YAOEX_* / YBM_*,Oracle 空缺时补 rpa_oms/.env。连接从 rpa_oracle 池取,班次默认池大小 1。缺 RPA_ORACLE_HOST / 用户 / 密码时入口失败,文案「数据库不可用」。未捕获异常原文进 rpa_shift_error_audit,Windows 上先执行 docs/ddl/rpa_oms_staging_tables.sql 里这张表。
看哪张表哪几列
- 表 2
rpa_cart_settlement_goods_data:operate_type=1、status(1 成功,2 失败)、push_status=0、update_user_name(系统管理员待领,加购中处理中,加购班本班已盖)、fail_reason、update_time、oms_id、supplier_name、purchase_qty
崩溃改回 SQL
停在「加购中」且未过 30 分钟租约:
UPDATE rpa_cart_settlement_goods_data
SET update_user_name = '系统管理员'
WHERE update_user_name = '加购中' AND fid = :fid;
过期的「加购中」下一班会再领,不必改。
原因列 vs 日志原文
表 2 fail_reason:登录挂写 系统故障:LOGIN_FAILED,查询抛错写 系统故障:QUERY_FAILED,加车抛错写 系统故障:ADD_FAILED。异常原文打本机日志,不进这一列。库存不足 / 中包装 / 对不上仓仍写业务中文。
点名命令
cd rpa_cart
uv run pytest tests/test_cart_job.py::test_job_adds_split_rows_without_insert -q
uv run pytest tests/test_cart_job.py::test_job_marks_out_of_stock -q
uv run pytest tests/test_cart_repo.py::test_from_env_without_user_raises -q
uv run pytest tests/test_cart_repo.py::test_claim_reclaims_expired_claiming_stamp tests/test_cart_repo.py::test_claim_skips_fresh_claiming_stamp -q
1 号药城支付落表
从买家中心导出已付订单,按导出行字段写入表 2 operate_type=2。不对加购行。购物车和支付单没有强关联,oms_id 表上 NOT NULL,先填 0,等人后选。
cd rpa_cart
uv sync --python 3.12
# 账号用 rpa_selection/.env 的 YAOEX_*,库用 RPA_ORACLE_*
uv run python main.py
过滤:只落 待发货 / 待收货 / 已完成。单价用折后单价,总价 round(折后单价×数量, 4)。pay_order_no 用商城订单号。pay_order_dtl_id 落库时自生成(UUID hex),不是平台数据,给订单中心防重传。
幂等:同一 pay_order_no 不重复插入。Excel 没有细单 ID,不再打详情接口。
uv run pytest -v
Windows 真库
Mac 打不到 192.168.12.244,改表 2 在 Windows 上测。支付导出/解析在 Mac 已经跑过;Win 上要测登录、导出、落表,以及加购登录和对仓加车。
Python 3.12 + Instant Client(位数一致)+ Chrome。密码不要写进仓库。把本包和 rpa_selection/.env 一起带过去。
PowerShell:
cd rpa_cart
uv sync --python 3.12
uv run playwright install chrome
$env:RPA_ORACLE_HOST = "192.168.12.244"
$env:RPA_ORACLE_PORT = "1521"
$env:RPA_ORACLE_SERVICE = "rpa"
$env:RPA_ORACLE_USER = "rpainit"
$env:RPA_ORACLE_PASSWORD = "这里填密码"
$env:RPA_ORACLE_THICK = "1"
$env:RPA_ORACLE_CLIENT_LIB = "C:\oracle\instantclient"
uv run pytest tests/test_cart_job.py::test_job_adds_split_rows_without_insert -q
uv run python main.py cart
uv run python main.py
看控制台 inserted / skipped_dup / unmatched。同一订单号再跑应 skipped_dup 上升。
查库:
SELECT operate_type, oms_id, platform_type, supplier_name, bar_code,
purchase_price, purchase_qty, purchase_total,
pay_order_no, pay_order_dtl_id, push_status
FROM rpa_cart_settlement_goods_data
WHERE operate_type = 2 AND platform_type = 66
ORDER BY fid DESC;
再跑一遍同一天,skipped_dup 应上升,行数不再增加。
不要在页面点「确认收货」。脚本自己导出,过滤待发货/待收货/已完成。
本期不做
清空购物车、药帮忙支付、接口 2 推送。