Files
break 5e552d99bc 收口审计治理与套餐任务进展
Constraint: 在线热修前必须保存当前迭代分支全部有效代码进展
Confidence: medium
Scope-risk: broad
Directive: 后续修改需保持审计事件与业务事务边界一致
Tested: git diff --cached --check
Not-tested: 未运行全量测试,提交用于切换分支前保存既有工作
2026-08-05 14:30:54 +08:00

118 lines
4.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 批量购买套餐脚本
该脚本读取只有一列的 CSV逐条调用 `POST /api/admin/orders`,为一批资产购买同一个套餐。
脚本仅使用 Python 标准库,不需要安装依赖。默认只预演,必须增加 `--execute` 才会真实下单。
## CSV 格式
首行表头可选,每行填写一个 ICCID 或虚拟号:
```csv
identifier
89860000000000000001
VIRTUAL000001
```
脚本会在请求前检查空文件、多列和重复资产。发现重复资产时整批终止,避免同一资产被重复购买。
## 预演
```bash
python3 scripts/batch_package_purchase/batch_purchase.py \
--base-url https://cmp-api.example.com \
--csv scripts/batch_package_purchase/assets.example.csv \
--package-id 123
```
预演只校验 CSV 并展示请求示例,不需要 Token也不会调用接口。
## 使用已有 Token 执行
推荐通过环境变量传递 Token避免进入命令历史
```bash
JUNHONG_ADMIN_TOKEN='<后台Access Token>' \
python3 scripts/batch_package_purchase/batch_purchase.py \
--base-url https://cmp-api.example.com \
--csv /path/to/assets.csv \
--package-id 123 \
--execute
```
## 使用账号自动登录后执行
未提供 Token 时,可以使用后台账号调用 `/api/admin/login` 自动获取 Token
```bash
JUNHONG_ADMIN_USERNAME='<后台账号>' \
JUNHONG_ADMIN_PASSWORD='<后台密码>' \
python3 scripts/batch_package_purchase/batch_purchase.py \
--base-url https://cmp-api.example.com \
--csv /path/to/assets.csv \
--package-id 123 \
--execute
```
也可以使用 `--token``--username``--password` 参数。密码优先通过环境变量或交互输入,避免保存在 Shell 历史中。
## 结果文件
默认在输入 CSV 同目录生成:
```text
原文件名_购买结果_YYYYMMDD_HHMMSS.csv
```
结果包含资产标识、成功或失败状态、HTTP 状态码、业务错误码、错误消息、订单 ID、订单号和订单金额。每处理一条都会立即刷新文件中途中断时已完成的结果不会丢失。
为避免覆盖历史结果,`--output` 指定的文件已经存在时脚本会直接报错。
可通过 `--output` 指定结果路径:
```bash
python3 scripts/batch_package_purchase/batch_purchase.py \
--base-url https://cmp-api.example.com \
--csv /path/to/assets.csv \
--package-id 123 \
--output /path/to/result.csv \
--execute
```
## 其他参数
- `--timeout`:单次请求超时秒数,默认 `30`
- `--interval`:每次下单后的等待秒数,默认 `0.2`
- `--execute`:显式开启真实下单。
脚本固定使用 `wallet` 钱包支付,每个资产单独创建一个订单。脚本不会自动重试 POST 请求,避免服务端已成功但客户端未收到响应时重复下单。失败项可根据结果 CSV 人工确认后单独重跑。
## 生成批量失效订单号
`generate_invalidate_orders.py` 读取单列 ICCID CSV调用现有资产套餐查询接口筛选待生效、生效中和已用完状态 `0/1/2`)的套餐,并按订单号去重生成 `order_no` 单列 CSV。已过期和已失效套餐不会进入结果。
```bash
JUNHONG_ADMIN_TOKEN='<后台Access Token>' \
python3 scripts/batch_package_purchase/generate_invalidate_orders.py \
--base-url https://cmp-api.example.com \
--csv scripts/batch_package_purchase/assets.example.csv
```
默认输出文件名为 `原文件名_待失效订单_YYYYMMDD_HHMMSS.csv`,可以通过 `--output` 指定。脚本只查询和生成文件,不会直接执行套餐失效;生成的 CSV 可上传到现有“订单套餐批量失效”功能。
## 批量修改生效中套餐过期时间
`batch_update_package_expiry.py` 读取单列资产标识 CSV查询每个资产全部生效中状态 `1`)的套餐,并将它们统一修改为 `--expires-at` 指定的时间。支持 ICCID、设备虚拟号、IMEI、SN 或 MSISDN。
默认只预演:
```bash
JUNHONG_ADMIN_TOKEN='<后台Access Token>' \
python3 scripts/batch_package_purchase/batch_update_package_expiry.py \
--base-url https://cmp-api.example.com \
--csv scripts/batch_package_purchase/assets.example.csv \
--expires-at '2026-12-31 23:59:59'
```
确认预演结果后增加 `--execute` 才会真实修改。真实执行会逐套餐生成 `原文件名_过期时间修改结果_YYYYMMDD_HHMMSS.csv`,记录原过期时间、新过期时间及接口结果。接口当前只允许后台账号 ID `41``127` 调用。