receipt-lifecycle.sh
靶子 BASE=http://localhost:20098 clone=h8 container=wt_h8_tp8
== A) 限频两档必须分离 ==
✓ A1 首次放行(ok=1,reason 空)
✓ A2 立刻再来 = too_fast(不是 lifetime_cap)
✓ A3 造够 10 条
✓ A4 撞上限 = lifetime_cap(且不是 too_fast)
✓ A5 清掉间隔缓存后仍是 lifetime_cap
== 主链夹具:动态发现一条 eligible 订单 ==
eligible: ddnum=202609070018324482121240 uid=990863 真金=6000 MYR
✓ mint member Bearer
== C+D) 驳回 → 站内信 + 预填 ==
✓ apply→receipt_id
✓ C1 驳回 info=1
✓ C1 status→3
✓ C2 站内信落库(本次新增 1 行)
✓ C3 站内信用**收件人**的语言(简体)
✓ C3 守卫:没跟着操作者落成繁体
✓ C4 站内信是纯文本,没有字面 <br/>
✓ D1 prefill.title_name 解密正确
✓ D2 prefill.title_type
✓ D3 prefill.remark
✓ D4 驳回不占名额,可重新申请
== B) 手动作废已开具凭证 ==
✓ 重新申请→新 receipt_id
✓ 夹具:issue→status 2
✓ B1 空理由被拒(info=0)
✓ B1 守卫:status 仍是 2
✓ B2 作废 info=1
✓ B2 status→4
✓ B3 作废理由落 reject_reason 列
✓ B4 建了 1 条 receipt_void 红冲工单
✓ B4 工单正文带票号(ops 据此红冲)
✓ B5 重复作废被 CAS 拒(info=0)
✓ B5 工单仍只有 1 条(没建出第二条)
✓ B5 理由未被第二次覆盖
✓ C5 站内信本次共 3 行(驳回+开具+作废)
✓ C5 三种通知各 1 行(未通过|已开具|已作废)
✓ B6 作废后 can_apply=1(用户能重新申请)
✓ B7 作废后不再下发凭证文件签名 URL
✓ D5 作废也进 prefill(抬头通常没变,错的是票)
✓ D5 prefill.title_type=company
✓ D5 prefill.tax_no
== A6) HTTP 层:两档文案真的不同 ==
✓ A6 status=lifetime_cap
✓ A6 文案告诉他去找客服
✓ A6 🔴 不再说「稍后再试」(那是错误引导,再等也没用)
==== e2e-receipt-lifecycle: PASS=39 FAIL=0 ====