Constraint: 在线热修前必须保存当前迭代分支全部有效代码进展 Confidence: medium Scope-risk: broad Directive: 后续修改需保持审计事件与业务事务边界一致 Tested: git diff --cached --check Not-tested: 未运行全量测试,提交用于切换分支前保存既有工作
118 lines
4.4 KiB
Markdown
118 lines
4.4 KiB
Markdown
# 批量购买套餐脚本
|
||
|
||
该脚本读取只有一列的 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` 调用。
|