diff --git a/aliyun-sync/COMMANDS.md b/aliyun-sync/COMMANDS.md index 0979c21..2a21042 100644 --- a/aliyun-sync/COMMANDS.md +++ b/aliyun-sync/COMMANDS.md @@ -78,13 +78,31 @@ npm run bills npm run messages ``` -## 8. 从最新 checkpoint 继续抓账单 +## 8. 单独抓订单 + +```powershell +npm run orders +``` + +订单增量: + +```powershell +npm run orders -- --incremental +``` + +订单断点继续: + +```powershell +npm run orders -- --resume +``` + +## 9. 从最新 checkpoint 继续抓账单 ```powershell npm run bills -- --resume ``` -## 9. 定时任务 +## 10. 定时任务 ```powershell npm run schedule @@ -96,7 +114,7 @@ npm run schedule ALIYUN_APS_SCHEDULE_MODE=incremental ``` -## 10. 常用 `.env` 配置 +## 11. 常用 `.env` 配置 ```env ALIYUN_APS_BASE_URL=https://aps.aliyun.com @@ -159,7 +177,7 @@ ALIYUN_APS_BROWSER_MODE=cdp ALIYUN_APS_CDP_URL=http://127.0.0.1:9222 ``` -## 11. 推荐执行顺序 +## 12. 推荐执行顺序 ### 首次初始化 @@ -184,6 +202,13 @@ cd D:\project\python\aliyun-sync\aliyun-aps-sync npm run messages ``` +### 单独同步订单 + +```powershell +cd D:\project\python\aliyun-sync\aliyun-aps-sync +npm run orders +``` + ### 账单长任务恢复 ```powershell @@ -199,7 +224,7 @@ cd D:\project\python\aliyun-sync\aliyun-aps-sync npm run schedule ``` -## 12. 错误文件 +## 13. 错误文件 运行异常时会保存: @@ -207,7 +232,7 @@ npm run schedule data/errors// ``` -## 13. 运行时热键 +## 14. 运行时热键 | 按键 | 功能 | | --- | --- | @@ -215,7 +240,7 @@ data/errors// | F8 | 继续 | | F9 | 终止 | -## 14. 本地数据目录 +## 15. 本地数据目录 ```text data/current/ diff --git a/aliyun-sync/aliyun-aps-sync/README.md b/aliyun-sync/aliyun-aps-sync/README.md index e2ba4ef..be854f7 100644 --- a/aliyun-sync/aliyun-aps-sync/README.md +++ b/aliyun-sync/aliyun-aps-sync/README.md @@ -84,6 +84,26 @@ npm run bills npm run bills -- --resume ``` +## 订单 + +只同步订单: + +```bash +npm run orders +``` + +订单增量: + +```bash +npm run orders -- --incremental +``` + +订单从 checkpoint 继续: + +```bash +npm run orders -- --resume +``` + ## 消息 单独抓消息: diff --git a/aliyun-sync/aliyun-aps-sync/package.json b/aliyun-sync/aliyun-aps-sync/package.json index 92b7a9c..83e818d 100644 --- a/aliyun-sync/aliyun-aps-sync/package.json +++ b/aliyun-sync/aliyun-aps-sync/package.json @@ -8,6 +8,7 @@ "sync": "node src/index.js sync", "incremental": "node src/index.js incremental", "bills": "node src/index.js bills", + "orders": "node src/index.js orders", "messages": "node src/index.js messages", "schedule": "node src/index.js schedule" }, diff --git a/aliyun-sync/aliyun-aps-sync/src/index.js b/aliyun-sync/aliyun-aps-sync/src/index.js index 486e4f5..b2bb012 100644 --- a/aliyun-sync/aliyun-aps-sync/src/index.js +++ b/aliyun-sync/aliyun-aps-sync/src/index.js @@ -4,6 +4,7 @@ const args = process.argv.slice(2); const command = args[0] || 'sync'; const extraArgs = args.slice(1); const billsResume = extraArgs.includes('--resume'); +const ordersIncremental = extraArgs.includes('--incremental'); for (const arg of extraArgs) { if (arg.startsWith('--incremental-order-start-date=')) { @@ -11,7 +12,7 @@ for (const arg of extraArgs) { } } -const { login, scheduleSync, syncAll, syncAllIncremental, syncBillsOnly, syncMessagesOnly } = await import('./sync.js'); +const { login, scheduleSync, syncAll, syncAllIncremental, syncBillsOnly, syncMessagesOnly, syncOrdersOnly } = await import('./sync.js'); if (command === 'login') { await login(); @@ -36,6 +37,12 @@ if (command === 'bills') { process.exit(0); } +if (command === 'orders') { + const summary = await syncOrdersOnly({ resume: billsResume, incremental: ordersIncremental }); + console.log(JSON.stringify(summary, null, 2)); + process.exit(0); +} + if (command === 'messages') { const summary = await syncMessagesOnly({ incremental: config.scheduleMode === 'incremental' }); console.log(JSON.stringify(summary, null, 2)); diff --git a/aliyun-sync/aliyun-aps-sync/src/sync.js b/aliyun-sync/aliyun-aps-sync/src/sync.js index d383816..18cc1fd 100644 --- a/aliyun-sync/aliyun-aps-sync/src/sync.js +++ b/aliyun-sync/aliyun-aps-sync/src/sync.js @@ -543,6 +543,35 @@ export async function syncBillsOnly(options = {}) { } } +export async function syncOrdersOnly(options = {}) { + const runtimeController = getRuntimeController(); + runtimeController.bind(); + const context = await getContext(); + let page = null; + + try { + const summary = { startedAt: new Date().toISOString(), datasets: {} }; + page = await resolveActivePage(context, '/detail/order/~/costCenter/order'); + summary.datasets.orders = await syncOrders(page, options); + summary.finishedAt = new Date().toISOString(); + + const stamp = nowStamp(); + saveRunSummary(stamp, summary); + return summary; + } catch (error) { + await reportRuntimeError(error, page, { label: 'syncOrdersOnly', dataset: 'orders', mode: options.incremental ? 'incremental' : 'full' }); + throw error; + } finally { + if (config.closeBrowser) { + await closeContextIfNeeded(); + } else { + console.log('浏览器保持运行'); + } + await closeDbPool(); + runtimeController.unbind(); + } +} + export async function syncMessagesOnly(options = {}) { const runtimeController = getRuntimeController(); runtimeController.bind();