AutoRpa/docs/superpowers/plans/2026-10-24-batch-runtime-ch...

6.1 KiB
Raw Permalink Blame History

班次大批量收口(打勾用)

改完把 - [ ] 改成 - [x],勾上日期。一次只开一条。说「做 BATCH-01」再动代码。

建议顺序:BATCH-01 → 02 → 03 → 04 → 05 → 06 → 07 → 08 → 09 → 10。

目标:一个班次可以安全地重复跑,对方系统里的单据不因重跑而多出一份。

口径不变:接口 1 不跑选品;接口 3 不录合同;选品拆量规则不动;合同 S02–S13 填表步骤不动;接口 2、4 这轮不接推送。

已定,不要再讨论:

  • 领取 UPDATE 的 IN 每段 500 个 fid,同一事务,任一段失败整笔回滚。调用方 limit 仍管这一班做多少。
  • 班次池保持 min=1, max=1。还没 commit 的失败:drop 坏连接,再借一次,只重试这一笔。已提交的不重做。ping_interval=60。
  • 序列保持 NOCACHE。这轮不改 DDL,不加注释。
  • rpa_oms_inbound_audit、rpa_selection_query_audit、rpa_shift_error_audit 这轮不清理。
  • 合同查重三态:0 条才起草,恰好 1 条才复用合同号,多条停在 process_status=3。标题是客商名 + 「采购协议」 + 签订日,不含货主和起止日,标题 + 客商不是合单键。

注释门禁(每条收工都查): 本条改过或新建的模块、类、每一个函数/方法(含 _ 私有、测试函数)都要有 docstring。第一句写做什么,随后只补签名里看不出的规则。不用 Args/Returns/Raises 小标题。缺一条不算完成。


1. 领取分段,入口封顶

BATCH-01 领取 UPDATE 分段

  • 2026-10-24
  • 落点:rpa_oracle 放共用分段更新。rpa_selection/repo.py、rpa_cart/cart_repo.py、rpa_contract/repo.py、rpa_rebate/repo.py 的领取 UPDATE 改走它。
  • 改成:每段 500 个 fid,同一事务,任一段失败整笔回滚。rpa_rebate/repo.py 的 _take_draft_groups 第一组仍整组领,只把更新拆段。
  • 验收:领取 1001 条时第一段能领走,不报「数据库不可用」。返利一个合同号超过 1000 行仍能整组领走。点名加在各自 test_oracle_repo.py / test_cart_repo.py。

BATCH-02 入口默认上限

  • 2026-10-24
  • 落点:rpa_selection/main.py、rpa_cart/main.py、rpa_rebate/run_batch.py、rpa_contract/run_batch.py。
  • 改成:不传 --limit 用默认值,不再表示全部领走。选品 50,加购 20,合同和返利按行 10。合同入口补上 --limit。
  • 验收:四个入口不传参时领取条数不超过默认值。

2. 按单落库,页面期间不占连接

BATCH-03 选品一行一落,续租,重领不重插

  • 2026-10-24
  • 落点:rpa_selection/job.py 的 run_batch,rpa_selection/repo.py 的 save_results。
  • 改成:一行搜完就 save_results 这一行。搜索过程中刷新 deal_time。落库前再读:仍是本进程领的 deal_flag=3,并且表 2 还没有该 oms_id 的加购行,才插入。
  • 验收:rpa_selection/tests/test_job.py 点名。租约过期后第二个进程不再插入第二套表 2。

BATCH-04 页面期间归还连接

  • 2026-10-24
  • 落点:rpa_contract/job.py、rpa_rebate/job.py、rpa_cart/cart_job.py 的 session()。
  • 改成:session() 只包住领取和落库,不包住页面或商城调用。一组做完就提交。
  • 验收:对应 test_job.py / test_cart_job.py。页面执行期间连接已归还。

BATCH-05 坏连接丢弃后再借一次

  • 2026-10-24
  • 落点:rpa_oracle/pool.py。
  • 改成:create_pool 写 ping_interval=60。未提交失败时 drop 坏连接,再借一次,只重试这一笔。注释写明班次池只有一条,靠探活和丢弃换连接。班次池保持 min=1, max=1。
  • 验收:rpa_oracle/tests/test_pool.py。探活失败或执行前连接已死时,下一次借到新连接。已提交的语句不重做。

3. 瞬时故障保持可再领

BATCH-06 选品系统故障改回待领

  • 2026-10-24
  • 落点:rpa_selection/persist.py。
  • 改成:LOGIN_FAILED / QUERY_FAILED 且凑不齐时,deal_flag 改回 0,不写表 2。库存不足、毛利、效期仍写 deal_flag=2。
  • 验收:rpa_selection/tests/test_job.py 里系统故障用例改断言。业务失败用例仍是终态。

BATCH-07 加购登录和查询失败放回队列

  • 2026-10-24
  • 落点:rpa_cart/cart_job.py。
  • 改成:登录失败和查询失败把戳改回「系统管理员」,status 保持 1。对不上仓、库存不足仍写 status=2。
  • 验收:rpa_cart/tests/test_cart_job.py。登录失败的行下一班还能领。

4. 重跑不产生第二份外部单据

BATCH-08 加购前查车

  • 2026-10-24
  • 落点:rpa_cart/cart_job.py 的 _add_one。
  • 改成:加车前按条形码和供应商查购物车。数量已经不少于本行,直接 mark_success。多出来的数量不当成另一张单。
  • 验收:rpa_cart/tests/test_cart_job.py。对方购物车已有本行数量、本地仍是「加购中」时,重跑不加第二份。

BATCH-09 合同查重三态

  • 2026-10-24
  • 落点:rpa_contract/run_batch.py 的 production_runner。每个合单组开始前把浏览器拉回起草页。
  • 改成:进起草前查「我的合同」。0 条才走 S06–S12;恰好 1 条只落表 4;多条停在 process_status=3,不新建,也不取最新一条。提交后读不到号也停在 3,下一班只查号。注释写明三态,以及标题不含货主和起止日。
  • 验收:rpa_contract/tests/test_job.py。对方已有唯一合同号、本地没写上时,重跑不起草第二份。命中多条时停在处理中。

BATCH-10 返利按合同号查重

  • 2026-10-24
  • 落点:rpa_rebate/job.py 的 recorder,rpa_rebate/persist.py 的 build_found。
  • 改成:送审前按合同号查已有协议。已有总单号就补写 action_code=2,不再新建。只在确认对方没有单据时,才把起草行改回 process_status=0。读号失败保持处理中。
  • 验收:rpa_rebate/tests/test_job.py。对方已有协议、本地没写上时,重跑不产生第二份。