@plolink/sdk 0.0.10 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -0
- package/dist/modules/billing/index.cjs +23 -0
- package/dist/modules/billing/index.cjs.map +1 -1
- package/dist/modules/billing/index.d.cts +45 -1
- package/dist/modules/billing/index.d.ts +45 -1
- package/dist/modules/billing/index.js +23 -0
- package/dist/modules/billing/index.js.map +1 -1
- package/dist/modules/llm/index.cjs +105 -0
- package/dist/modules/llm/index.cjs.map +1 -0
- package/dist/modules/llm/index.d.cts +179 -0
- package/dist/modules/llm/index.d.ts +179 -0
- package/dist/modules/llm/index.js +103 -0
- package/dist/modules/llm/index.js.map +1 -0
- package/dist/modules/preset-agent-task/index.cjs +360 -0
- package/dist/modules/preset-agent-task/index.cjs.map +1 -0
- package/dist/modules/preset-agent-task/index.d.cts +736 -0
- package/dist/modules/preset-agent-task/index.d.ts +736 -0
- package/dist/modules/preset-agent-task/index.js +358 -0
- package/dist/modules/preset-agent-task/index.js.map +1 -0
- package/package.json +11 -1
package/README.md
CHANGED
|
@@ -65,6 +65,40 @@ const client = new PlolinkClient({
|
|
|
65
65
|
|
|
66
66
|
SDK 提供多个业务模块,支持按需导入。
|
|
67
67
|
|
|
68
|
+
### LLM 通用接口模块 (LLM)
|
|
69
|
+
|
|
70
|
+
LLM 模块提供通用的大语言模型调用能力,兼容 OpenAI API 格式:
|
|
71
|
+
|
|
72
|
+
- **聊天完成** (`chat`): 调用 LLM 模型进行对话,支持多轮对话
|
|
73
|
+
- **模型列表** (`getModels`): 获取所有可用模型及价格信息
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
import { PlolinkClient } from '@plolink/sdk';
|
|
77
|
+
import { LLM } from '@plolink/sdk/llm';
|
|
78
|
+
|
|
79
|
+
const client = new PlolinkClient({ token: 'sk-your-api-key' });
|
|
80
|
+
const llm = new LLM(client);
|
|
81
|
+
|
|
82
|
+
// 获取可用模型
|
|
83
|
+
const models = await llm.getModels();
|
|
84
|
+
console.log('可用模型:', models.map(m => m.name));
|
|
85
|
+
|
|
86
|
+
// 调用聊天完成
|
|
87
|
+
const response = await llm.chat({
|
|
88
|
+
model: 'deepseek-v3-1-terminus',
|
|
89
|
+
messages: [
|
|
90
|
+
{ role: 'system', content: '你是一个专业的编程助手' },
|
|
91
|
+
{ role: 'user', content: '如何用 TypeScript 实现单例模式?' }
|
|
92
|
+
],
|
|
93
|
+
temperature: 0.7
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
console.log('回复:', response.choices[0].message.content);
|
|
97
|
+
console.log('消耗 tokens:', response.usage.total_tokens);
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
详细文档请参考 [docs/modules/llm.md](./docs/modules/llm.md)
|
|
101
|
+
|
|
68
102
|
### 心理评测模块 (PsychologyTest)
|
|
69
103
|
|
|
70
104
|
心理评测模块提供完整的心理评测能力,包括:
|
|
@@ -163,6 +197,54 @@ if (detail.status === 'COMPLETED') {
|
|
|
163
197
|
|
|
164
198
|
详细文档请参考 [docs/modules/report-writer.md](./docs/modules/report-writer.md)
|
|
165
199
|
|
|
200
|
+
### 预设Agent任务模块 (PresetAgentTask)
|
|
201
|
+
|
|
202
|
+
预设Agent任务模块提供开箱即用的业务能力,完全隐藏底层Agent Task实现细节:
|
|
203
|
+
|
|
204
|
+
- **预设管理** (`create`, `list`, `getById`, `update`, `delete`): 创建和管理预设配置
|
|
205
|
+
- **预设执行** (`execute`): 通过code快速执行预设任务
|
|
206
|
+
- **执行管理** (`listExecutions`, `getExecutionById`, `cancelExecution`, `retryExecution`): 查询和管理执行记录
|
|
207
|
+
- **配置迁移** (`export`, `import`): 导出/导入预设配置,支持跨团队迁移
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
import { PlolinkClient } from '@plolink/sdk';
|
|
211
|
+
import { PresetAgentTask } from '@plolink/sdk/preset-agent-task';
|
|
212
|
+
|
|
213
|
+
const client = new PlolinkClient({ token: 'your-token' });
|
|
214
|
+
const presetAgentTask = new PresetAgentTask(client);
|
|
215
|
+
|
|
216
|
+
// 执行预设任务
|
|
217
|
+
const result = await presetAgentTask.execute({
|
|
218
|
+
code: 'talent-resume-parse',
|
|
219
|
+
additionalPrompt: '请特别关注技能匹配度',
|
|
220
|
+
inputFileId: 'file-resume-123'
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
console.log('执行ID:', result.executionId);
|
|
224
|
+
|
|
225
|
+
// 轮询查询结果
|
|
226
|
+
let execution;
|
|
227
|
+
do {
|
|
228
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
229
|
+
execution = await presetAgentTask.getExecutionById(result.executionId);
|
|
230
|
+
console.log('状态:', execution.status);
|
|
231
|
+
} while (execution.status === 'INITIALIZING' || execution.status === 'RUNNING');
|
|
232
|
+
|
|
233
|
+
// 获取结果
|
|
234
|
+
if (execution.status === 'COMPLETED') {
|
|
235
|
+
console.log('输出文件:', execution.outputFileId);
|
|
236
|
+
console.log('费用:', execution.metrics.totalCost, 'USD');
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// 或者通过Webhook接收结果通知
|
|
240
|
+
// 在系统中配置Webhook订阅 "preset-agent-task" 模块
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
**注意事项:**
|
|
244
|
+
- ✅ 完全隐藏Agent Task细节,不暴露 `agentTaskId`、`runId`
|
|
245
|
+
- ✅ 支持轮询和Webhook两种方式获取执行结果
|
|
246
|
+
- ✅ 支持配置导出/导入,方便跨团队迁移
|
|
247
|
+
|
|
166
248
|
### 其他模块
|
|
167
249
|
|
|
168
250
|
其他业务模块的详细文档请参考 docs/modules/ 目录
|
|
@@ -406,6 +406,29 @@ var Billing = class {
|
|
|
406
406
|
}
|
|
407
407
|
});
|
|
408
408
|
}
|
|
409
|
+
/**
|
|
410
|
+
* 获取跨团队充值消费统计汇总
|
|
411
|
+
*
|
|
412
|
+
* @description
|
|
413
|
+
* 获取用户拥有财务权限的所有团队的充值和消费统计汇总。
|
|
414
|
+
* 包括今日、近7天、近30天以及总额的充值和消费数据,以及统计的团队数量。
|
|
415
|
+
*
|
|
416
|
+
* @returns 跨团队充值消费统计汇总
|
|
417
|
+
* @throws {PlolinkError} 当请求失败时抛出
|
|
418
|
+
*
|
|
419
|
+
* @example
|
|
420
|
+
* ```typescript
|
|
421
|
+
* const stats = await billing.getRechargeConsumptionStatsCrossTeam();
|
|
422
|
+
* console.log(`全部团队今日消费: ${stats.consumptionToday}`);
|
|
423
|
+
* console.log(`全部团队今日充值: ${stats.rechargeToday}`);
|
|
424
|
+
* console.log(`全部团队消费总额: ${stats.consumptionTotal}`);
|
|
425
|
+
* console.log(`全部团队充值总额: ${stats.rechargeTotal}`);
|
|
426
|
+
* console.log(`统计团队数: ${stats.teamCount}`);
|
|
427
|
+
* ```
|
|
428
|
+
*/
|
|
429
|
+
async getRechargeConsumptionStatsCrossTeam() {
|
|
430
|
+
return this.client.axiosInstance.get("/api/v1/payments/stats:cross-team");
|
|
431
|
+
}
|
|
409
432
|
};
|
|
410
433
|
|
|
411
434
|
exports.Billing = Billing;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/modules/billing/index.ts"],"names":["PlolinkError","Poller"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 充值消费模块\n * \n * @description\n * 提供完整的充值消费相关功能,包括:\n * - 余额查询\n * - 微信扫码充值(支持可选生成二维码图片)\n * - 订单状态查询和轮询\n * - 消费/充值/开票/退费记录查询\n * - 消耗统计\n * - 对公账户信息\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { Billing } from '@plolink/sdk/billing';\n * \n * const client = new PlolinkClient({\n * mode: 'apiKey',\n * apiKey: 'your-api-key'\n * });\n * \n * const billing = new Billing(client);\n * \n * // 查询余额\n * const balance = await billing.getBalance();\n * console.log(`当前余额: ${balance.balance}`);\n * \n * // 发起充值(含二维码图片)\n * const result = await billing.createRecharge({\n * amount: 100,\n * needQrCodeImage: true\n * });\n * console.log(`请扫码支付: ${result.qrCodeImageUrl}`);\n * \n * // 轮询订单状态\n * const poller = billing.watchOrderStatus(result.orderNo, (status) => {\n * console.log(`订单状态: ${status.status}`);\n * if (status.status === 'success') {\n * console.log('支付成功!');\n * }\n * });\n * ```\n * \n * @module billing\n */\n\nimport { PlolinkClient } from '../../core/client';\nimport { Poller } from '../../common/poller';\nimport { PlolinkError } from '../../core/error';\nimport type {\n BalanceInfo,\n CreateRechargeParams,\n WechatRechargeResult,\n OrderStatusResult,\n ConsumptionStats,\n PaginationParams,\n PaginatedResult,\n ConsumptionRecord,\n RechargeRecord,\n InvoiceRecord,\n RefundRecord,\n CompanyAccount,\n CrossTeamQueryParams,\n CrossTeamPaginatedResult,\n InvoiceRecordCrossTeam,\n RechargeRecordCrossTeam,\n ConsumptionRecordCrossTeam,\n RefundRecordCrossTeam,\n} from '../../types/billing';\n\nexport type {\n BalanceInfo,\n CreateRechargeParams,\n WechatRechargeResult,\n OrderStatus,\n OrderStatusResult,\n ConsumptionStats,\n PaginationParams,\n PaginatedResult,\n ConsumptionRecord,\n RechargeRecord,\n InvoiceRecord,\n RefundRecord,\n CompanyAccount,\n CrossTeamQueryParams,\n CrossTeamPaginatedResult,\n InvoiceRecordCrossTeam,\n RechargeRecordCrossTeam,\n ConsumptionRecordCrossTeam,\n RefundRecordCrossTeam,\n} from '../../types/billing';\n\n/**\n * 充值消费模块\n */\nexport class Billing {\n private client: PlolinkClient;\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 获取团队余额信息\n * \n * @returns 余额信息,包括可用余额和可开票金额\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const balance = await billing.getBalance();\n * console.log(`余额: ${balance.balance}, 可开票: ${balance.invoiceableAmount}`);\n * ```\n */\n public async getBalance(): Promise<BalanceInfo> {\n return this.client.axiosInstance.get('/api/v1/payments/balance');\n }\n\n /**\n * 创建微信充值订单\n * \n * @param params - 充值参数\n * @returns 充值订单信息,包含二维码URL和订单号\n * @throws {PlolinkError} 当金额无效或创建失败时抛出\n * \n * @example\n * ```typescript\n * // 基础充值(仅返回二维码URL)\n * const result = await billing.createRecharge({\n * amount: 100,\n * description: '充值100元'\n * });\n * console.log(`请使用微信扫描: ${result.qrCodeUrl}`);\n * \n * // 充值并获取二维码图片\n * const result = await billing.createRecharge({\n * amount: 100,\n * needQrCodeImage: true\n * });\n * console.log(`二维码图片地址: ${result.qrCodeImageUrl}`);\n * ```\n */\n public async createRecharge(params: CreateRechargeParams): Promise<WechatRechargeResult> {\n const { amount, description, needQrCodeImage } = params;\n \n if (amount <= 0) {\n throw new PlolinkError('Amount must be greater than 0', 'INVALID_AMOUNT');\n }\n\n return this.client.axiosInstance.post('/api/v1/payments/recharge/wechat', {\n amount,\n description,\n needQrCodeImage,\n });\n }\n\n /**\n * 查询订单状态\n * \n * @param orderNo - 订单号\n * @returns 订单状态信息\n * @throws {PlolinkError} 当订单不存在时抛出\n * \n * @example\n * ```typescript\n * const status = await billing.getOrderStatus('ORDER_123');\n * console.log(`订单状态: ${status.status}`);\n * ```\n */\n public async getOrderStatus(orderNo: string): Promise<OrderStatusResult> {\n // 通过充值记录接口查询订单状态\n const records = await this.getRechargeRecords();\n const record = records.find((r) => r.orderId === orderNo);\n \n if (!record) {\n throw new PlolinkError(`Order not found: ${orderNo}`, 'ORDER_NOT_FOUND');\n }\n\n return {\n orderNo,\n status: record.status,\n amount: record.amount,\n createdAt: record.createdAt,\n };\n }\n\n /**\n * 轮询订单状态\n * \n * @description\n * 创建一个轮询器持续监听订单状态变化,直到订单达到终态(success/failed/closed)。\n * 使用指数退避策略,初始间隔1秒,最大间隔30秒。\n * \n * @param orderNo - 订单号\n * @param onStatusChange - 状态变化回调函数\n * @returns Poller实例,可用于手动停止轮询\n * \n * @example\n * ```typescript\n * const poller = billing.watchOrderStatus('ORDER_123', (status) => {\n * console.log(`状态更新: ${status.status}`);\n * \n * if (status.status === 'success') {\n * console.log('支付成功!');\n * } else if (status.status === 'failed') {\n * console.error('支付失败!');\n * }\n * });\n * \n * // 开始轮询\n * poller.start();\n * \n * // 需要时可以手动停止\n * // poller.stop();\n * ```\n */\n public watchOrderStatus(\n orderNo: string,\n onStatusChange: (status: OrderStatusResult) => void\n ): Poller<OrderStatusResult> {\n const poller = new Poller<OrderStatusResult>({\n task: () => this.getOrderStatus(orderNo),\n onResult: onStatusChange,\n shouldStop: (status) => {\n return ['success', 'failed', 'closed'].includes(status.status);\n },\n initialInterval: 1000,\n maxInterval: 30000,\n backoffFactor: 1.5,\n onError: (error) => {\n this.client.logger.error('Order polling error', { error, orderNo });\n },\n });\n\n // 自动启动\n void poller.start();\n\n return poller;\n }\n\n /**\n * 获取消耗统计\n * \n * @returns 消耗统计信息(今日/7天/30天)\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const stats = await billing.getConsumptionStats();\n * console.log(`今日消耗: ${stats.today}`);\n * console.log(`7天消耗: ${stats.last7Days}`);\n * console.log(`30天消耗: ${stats.last30Days}`);\n * ```\n */\n public async getConsumptionStats(): Promise<ConsumptionStats> {\n return this.client.axiosInstance.get('/api/v1/payments/consumption/stats');\n }\n\n /**\n * 获取消费记录(分页)\n * \n * @param params - 分页参数\n * @returns 消费记录列表和总数\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getConsumptionRecords({\n * page: 1,\n * pageSize: 20\n * });\n * console.log(`共 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`消费: ${record.amount}, 用途: ${record.purpose}`);\n * });\n * ```\n */\n public async getConsumptionRecords(\n params: PaginationParams = {}\n ): Promise<PaginatedResult<ConsumptionRecord>> {\n const { page = 1, pageSize = 20 } = params;\n return this.client.axiosInstance.get('/api/v1/payments/consumption/records', {\n params: { page, pageSize },\n });\n }\n\n /**\n * 获取充值记录\n * \n * @returns 充值记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const records = await billing.getRechargeRecords();\n * records.forEach(record => {\n * console.log(`${record.createdAt}: ${record.amount}, 状态: ${record.status}`);\n * });\n * ```\n */\n public async getRechargeRecords(): Promise<RechargeRecord[]> {\n return this.client.axiosInstance.get('/api/v1/payments/recharge/records');\n }\n\n /**\n * 获取开票记录\n * \n * @returns 开票记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const records = await billing.getInvoiceRecords();\n * records.forEach(record => {\n * console.log(`发票: ${record.invoiceNumber}, 金额: ${record.amount}`);\n * });\n * ```\n */\n public async getInvoiceRecords(): Promise<InvoiceRecord[]> {\n return this.client.axiosInstance.get('/api/v1/payments/invoice/records');\n }\n\n /**\n * 获取退费记录\n * \n * @returns 退费记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const records = await billing.getRefundRecords();\n * records.forEach(record => {\n * console.log(`退费: ${record.amount}, 备注: ${record.remark}`);\n * });\n * ```\n */\n public async getRefundRecords(): Promise<RefundRecord[]> {\n return this.client.axiosInstance.get('/api/v1/payments/refund/records');\n }\n\n /**\n * 获取对公账户信息\n * \n * @returns 对公账户信息\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const account = await billing.getCompanyAccount();\n * console.log(`账户名: ${account.accountName}`);\n * console.log(`账号: ${account.accountNumber}`);\n * console.log(`开户行: ${account.bankName}`);\n * ```\n */\n public async getCompanyAccount(): Promise<CompanyAccount> {\n return this.client.axiosInstance.get('/api/v1/payments/company-account');\n }\n\n // ============ 跨团队查询接口 ============\n\n /**\n * 获取跨团队开票记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的开票记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getInvoiceRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 发票号: ${record.invoiceNumber}, 金额: ${record.amount}`);\n * });\n * ```\n */\n public async getInvoiceRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<InvoiceRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/invoice/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队充值记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的充值记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getRechargeRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 状态: ${record.status}`);\n * });\n * ```\n */\n public async getRechargeRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<RechargeRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/recharge/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队消费记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的消费记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getConsumptionRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 用途: ${record.purpose}`);\n * });\n * ```\n */\n public async getConsumptionRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<ConsumptionRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/consumption/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队退费记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的退费记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getRefundRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 备注: ${record.remark}`);\n * });\n * ```\n */\n public async getRefundRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<RefundRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/refund/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/modules/billing/index.ts"],"names":["PlolinkError","Poller"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 充值消费模块\n * \n * @description\n * 提供完整的充值消费相关功能,包括:\n * - 余额查询\n * - 微信扫码充值(支持可选生成二维码图片)\n * - 订单状态查询和轮询\n * - 消费/充值/开票/退费记录查询\n * - 消耗统计\n * - 对公账户信息\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { Billing } from '@plolink/sdk/billing';\n * \n * const client = new PlolinkClient({\n * mode: 'apiKey',\n * apiKey: 'your-api-key'\n * });\n * \n * const billing = new Billing(client);\n * \n * // 查询余额\n * const balance = await billing.getBalance();\n * console.log(`当前余额: ${balance.balance}`);\n * \n * // 发起充值(含二维码图片)\n * const result = await billing.createRecharge({\n * amount: 100,\n * needQrCodeImage: true\n * });\n * console.log(`请扫码支付: ${result.qrCodeImageUrl}`);\n * \n * // 轮询订单状态\n * const poller = billing.watchOrderStatus(result.orderNo, (status) => {\n * console.log(`订单状态: ${status.status}`);\n * if (status.status === 'success') {\n * console.log('支付成功!');\n * }\n * });\n * ```\n * \n * @module billing\n */\n\nimport { PlolinkClient } from '../../core/client';\nimport { Poller } from '../../common/poller';\nimport { PlolinkError } from '../../core/error';\nimport type {\n BalanceInfo,\n CreateRechargeParams,\n WechatRechargeResult,\n OrderStatusResult,\n ConsumptionStats,\n PaginationParams,\n PaginatedResult,\n ConsumptionRecord,\n RechargeRecord,\n InvoiceRecord,\n RefundRecord,\n CompanyAccount,\n CrossTeamQueryParams,\n CrossTeamPaginatedResult,\n InvoiceRecordCrossTeam,\n RechargeRecordCrossTeam,\n ConsumptionRecordCrossTeam,\n RefundRecordCrossTeam,\n RechargeConsumptionStatsCrossTeam,\n} from '../../types/billing';\n\nexport type {\n BalanceInfo,\n CreateRechargeParams,\n WechatRechargeResult,\n OrderStatus,\n OrderStatusResult,\n ConsumptionStats,\n PaginationParams,\n PaginatedResult,\n ConsumptionRecord,\n RechargeRecord,\n InvoiceRecord,\n RefundRecord,\n CompanyAccount,\n CrossTeamQueryParams,\n CrossTeamPaginatedResult,\n InvoiceRecordCrossTeam,\n RechargeRecordCrossTeam,\n ConsumptionRecordCrossTeam,\n RefundRecordCrossTeam,\n RechargeConsumptionStatsCrossTeam,\n} from '../../types/billing';\n\n/**\n * 充值消费模块\n */\nexport class Billing {\n private client: PlolinkClient;\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 获取团队余额信息\n * \n * @returns 余额信息,包括可用余额和可开票金额\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const balance = await billing.getBalance();\n * console.log(`余额: ${balance.balance}, 可开票: ${balance.invoiceableAmount}`);\n * ```\n */\n public async getBalance(): Promise<BalanceInfo> {\n return this.client.axiosInstance.get('/api/v1/payments/balance');\n }\n\n /**\n * 创建微信充值订单\n * \n * @param params - 充值参数\n * @returns 充值订单信息,包含二维码URL和订单号\n * @throws {PlolinkError} 当金额无效或创建失败时抛出\n * \n * @example\n * ```typescript\n * // 基础充值(仅返回二维码URL)\n * const result = await billing.createRecharge({\n * amount: 100,\n * description: '充值100元'\n * });\n * console.log(`请使用微信扫描: ${result.qrCodeUrl}`);\n * \n * // 充值并获取二维码图片\n * const result = await billing.createRecharge({\n * amount: 100,\n * needQrCodeImage: true\n * });\n * console.log(`二维码图片地址: ${result.qrCodeImageUrl}`);\n * ```\n */\n public async createRecharge(params: CreateRechargeParams): Promise<WechatRechargeResult> {\n const { amount, description, needQrCodeImage } = params;\n \n if (amount <= 0) {\n throw new PlolinkError('Amount must be greater than 0', 'INVALID_AMOUNT');\n }\n\n return this.client.axiosInstance.post('/api/v1/payments/recharge/wechat', {\n amount,\n description,\n needQrCodeImage,\n });\n }\n\n /**\n * 查询订单状态\n * \n * @param orderNo - 订单号\n * @returns 订单状态信息\n * @throws {PlolinkError} 当订单不存在时抛出\n * \n * @example\n * ```typescript\n * const status = await billing.getOrderStatus('ORDER_123');\n * console.log(`订单状态: ${status.status}`);\n * ```\n */\n public async getOrderStatus(orderNo: string): Promise<OrderStatusResult> {\n // 通过充值记录接口查询订单状态\n const records = await this.getRechargeRecords();\n const record = records.find((r) => r.orderId === orderNo);\n \n if (!record) {\n throw new PlolinkError(`Order not found: ${orderNo}`, 'ORDER_NOT_FOUND');\n }\n\n return {\n orderNo,\n status: record.status,\n amount: record.amount,\n createdAt: record.createdAt,\n };\n }\n\n /**\n * 轮询订单状态\n * \n * @description\n * 创建一个轮询器持续监听订单状态变化,直到订单达到终态(success/failed/closed)。\n * 使用指数退避策略,初始间隔1秒,最大间隔30秒。\n * \n * @param orderNo - 订单号\n * @param onStatusChange - 状态变化回调函数\n * @returns Poller实例,可用于手动停止轮询\n * \n * @example\n * ```typescript\n * const poller = billing.watchOrderStatus('ORDER_123', (status) => {\n * console.log(`状态更新: ${status.status}`);\n * \n * if (status.status === 'success') {\n * console.log('支付成功!');\n * } else if (status.status === 'failed') {\n * console.error('支付失败!');\n * }\n * });\n * \n * // 开始轮询\n * poller.start();\n * \n * // 需要时可以手动停止\n * // poller.stop();\n * ```\n */\n public watchOrderStatus(\n orderNo: string,\n onStatusChange: (status: OrderStatusResult) => void\n ): Poller<OrderStatusResult> {\n const poller = new Poller<OrderStatusResult>({\n task: () => this.getOrderStatus(orderNo),\n onResult: onStatusChange,\n shouldStop: (status) => {\n return ['success', 'failed', 'closed'].includes(status.status);\n },\n initialInterval: 1000,\n maxInterval: 30000,\n backoffFactor: 1.5,\n onError: (error) => {\n this.client.logger.error('Order polling error', { error, orderNo });\n },\n });\n\n // 自动启动\n void poller.start();\n\n return poller;\n }\n\n /**\n * 获取消耗统计\n * \n * @returns 消耗统计信息(今日/7天/30天)\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const stats = await billing.getConsumptionStats();\n * console.log(`今日消耗: ${stats.today}`);\n * console.log(`7天消耗: ${stats.last7Days}`);\n * console.log(`30天消耗: ${stats.last30Days}`);\n * ```\n */\n public async getConsumptionStats(): Promise<ConsumptionStats> {\n return this.client.axiosInstance.get('/api/v1/payments/consumption/stats');\n }\n\n /**\n * 获取消费记录(分页)\n * \n * @param params - 分页参数\n * @returns 消费记录列表和总数\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getConsumptionRecords({\n * page: 1,\n * pageSize: 20\n * });\n * console.log(`共 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`消费: ${record.amount}, 用途: ${record.purpose}`);\n * });\n * ```\n */\n public async getConsumptionRecords(\n params: PaginationParams = {}\n ): Promise<PaginatedResult<ConsumptionRecord>> {\n const { page = 1, pageSize = 20 } = params;\n return this.client.axiosInstance.get('/api/v1/payments/consumption/records', {\n params: { page, pageSize },\n });\n }\n\n /**\n * 获取充值记录\n * \n * @returns 充值记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const records = await billing.getRechargeRecords();\n * records.forEach(record => {\n * console.log(`${record.createdAt}: ${record.amount}, 状态: ${record.status}`);\n * });\n * ```\n */\n public async getRechargeRecords(): Promise<RechargeRecord[]> {\n return this.client.axiosInstance.get('/api/v1/payments/recharge/records');\n }\n\n /**\n * 获取开票记录\n * \n * @returns 开票记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const records = await billing.getInvoiceRecords();\n * records.forEach(record => {\n * console.log(`发票: ${record.invoiceNumber}, 金额: ${record.amount}`);\n * });\n * ```\n */\n public async getInvoiceRecords(): Promise<InvoiceRecord[]> {\n return this.client.axiosInstance.get('/api/v1/payments/invoice/records');\n }\n\n /**\n * 获取退费记录\n * \n * @returns 退费记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const records = await billing.getRefundRecords();\n * records.forEach(record => {\n * console.log(`退费: ${record.amount}, 备注: ${record.remark}`);\n * });\n * ```\n */\n public async getRefundRecords(): Promise<RefundRecord[]> {\n return this.client.axiosInstance.get('/api/v1/payments/refund/records');\n }\n\n /**\n * 获取对公账户信息\n * \n * @returns 对公账户信息\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const account = await billing.getCompanyAccount();\n * console.log(`账户名: ${account.accountName}`);\n * console.log(`账号: ${account.accountNumber}`);\n * console.log(`开户行: ${account.bankName}`);\n * ```\n */\n public async getCompanyAccount(): Promise<CompanyAccount> {\n return this.client.axiosInstance.get('/api/v1/payments/company-account');\n }\n\n // ============ 跨团队查询接口 ============\n\n /**\n * 获取跨团队开票记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的开票记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getInvoiceRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 发票号: ${record.invoiceNumber}, 金额: ${record.amount}`);\n * });\n * ```\n */\n public async getInvoiceRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<InvoiceRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/invoice/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队充值记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的充值记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getRechargeRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 状态: ${record.status}`);\n * });\n * ```\n */\n public async getRechargeRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<RechargeRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/recharge/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队消费记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的消费记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getConsumptionRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 用途: ${record.purpose}`);\n * });\n * ```\n */\n public async getConsumptionRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<ConsumptionRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/consumption/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队退费记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的退费记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getRefundRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 备注: ${record.remark}`);\n * });\n * ```\n */\n public async getRefundRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<RefundRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/refund/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队充值消费统计汇总\n *\n * @description\n * 获取用户拥有财务权限的所有团队的充值和消费统计汇总。\n * 包括今日、近7天、近30天以及总额的充值和消费数据,以及统计的团队数量。\n *\n * @returns 跨团队充值消费统计汇总\n * @throws {PlolinkError} 当请求失败时抛出\n *\n * @example\n * ```typescript\n * const stats = await billing.getRechargeConsumptionStatsCrossTeam();\n * console.log(`全部团队今日消费: ${stats.consumptionToday}`);\n * console.log(`全部团队今日充值: ${stats.rechargeToday}`);\n * console.log(`全部团队消费总额: ${stats.consumptionTotal}`);\n * console.log(`全部团队充值总额: ${stats.rechargeTotal}`);\n * console.log(`统计团队数: ${stats.teamCount}`);\n * ```\n */\n public async getRechargeConsumptionStatsCrossTeam(): Promise<RechargeConsumptionStatsCrossTeam> {\n return this.client.axiosInstance.get('/api/v1/payments/stats:cross-team');\n }\n}\n"]}
|
|
@@ -201,6 +201,29 @@ interface RefundRecordCrossTeam extends RefundRecord {
|
|
|
201
201
|
/** 团队名称 */
|
|
202
202
|
teamName: string;
|
|
203
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* 跨团队充值消费统计汇总
|
|
206
|
+
*/
|
|
207
|
+
interface RechargeConsumptionStatsCrossTeam {
|
|
208
|
+
/** 消费-今日 */
|
|
209
|
+
consumptionToday: string;
|
|
210
|
+
/** 消费-近7天 */
|
|
211
|
+
consumptionLast7Days: string;
|
|
212
|
+
/** 消费-近30天 */
|
|
213
|
+
consumptionLast30Days: string;
|
|
214
|
+
/** 消费-总额(所有时间) */
|
|
215
|
+
consumptionTotal: string;
|
|
216
|
+
/** 充值-今日 */
|
|
217
|
+
rechargeToday: string;
|
|
218
|
+
/** 充值-近7天 */
|
|
219
|
+
rechargeLast7Days: string;
|
|
220
|
+
/** 充值-近30天 */
|
|
221
|
+
rechargeLast30Days: string;
|
|
222
|
+
/** 充值-总额(所有时间) */
|
|
223
|
+
rechargeTotal: string;
|
|
224
|
+
/** 统计的团队数量 */
|
|
225
|
+
teamCount: number;
|
|
226
|
+
}
|
|
204
227
|
|
|
205
228
|
/**
|
|
206
229
|
* 充值消费模块
|
|
@@ -533,6 +556,27 @@ declare class Billing {
|
|
|
533
556
|
* ```
|
|
534
557
|
*/
|
|
535
558
|
getRefundRecordsCrossTeam(params: CrossTeamQueryParams): Promise<CrossTeamPaginatedResult<RefundRecordCrossTeam>>;
|
|
559
|
+
/**
|
|
560
|
+
* 获取跨团队充值消费统计汇总
|
|
561
|
+
*
|
|
562
|
+
* @description
|
|
563
|
+
* 获取用户拥有财务权限的所有团队的充值和消费统计汇总。
|
|
564
|
+
* 包括今日、近7天、近30天以及总额的充值和消费数据,以及统计的团队数量。
|
|
565
|
+
*
|
|
566
|
+
* @returns 跨团队充值消费统计汇总
|
|
567
|
+
* @throws {PlolinkError} 当请求失败时抛出
|
|
568
|
+
*
|
|
569
|
+
* @example
|
|
570
|
+
* ```typescript
|
|
571
|
+
* const stats = await billing.getRechargeConsumptionStatsCrossTeam();
|
|
572
|
+
* console.log(`全部团队今日消费: ${stats.consumptionToday}`);
|
|
573
|
+
* console.log(`全部团队今日充值: ${stats.rechargeToday}`);
|
|
574
|
+
* console.log(`全部团队消费总额: ${stats.consumptionTotal}`);
|
|
575
|
+
* console.log(`全部团队充值总额: ${stats.rechargeTotal}`);
|
|
576
|
+
* console.log(`统计团队数: ${stats.teamCount}`);
|
|
577
|
+
* ```
|
|
578
|
+
*/
|
|
579
|
+
getRechargeConsumptionStatsCrossTeam(): Promise<RechargeConsumptionStatsCrossTeam>;
|
|
536
580
|
}
|
|
537
581
|
|
|
538
|
-
export { type BalanceInfo, Billing, type CompanyAccount, type ConsumptionRecord, type ConsumptionRecordCrossTeam, type ConsumptionStats, type CreateRechargeParams, type CrossTeamPaginatedResult, type CrossTeamQueryParams, type InvoiceRecord, type InvoiceRecordCrossTeam, type OrderStatus, type OrderStatusResult, type PaginatedResult, type PaginationParams, type RechargeRecord, type RechargeRecordCrossTeam, type RefundRecord, type RefundRecordCrossTeam, type WechatRechargeResult };
|
|
582
|
+
export { type BalanceInfo, Billing, type CompanyAccount, type ConsumptionRecord, type ConsumptionRecordCrossTeam, type ConsumptionStats, type CreateRechargeParams, type CrossTeamPaginatedResult, type CrossTeamQueryParams, type InvoiceRecord, type InvoiceRecordCrossTeam, type OrderStatus, type OrderStatusResult, type PaginatedResult, type PaginationParams, type RechargeConsumptionStatsCrossTeam, type RechargeRecord, type RechargeRecordCrossTeam, type RefundRecord, type RefundRecordCrossTeam, type WechatRechargeResult };
|
|
@@ -201,6 +201,29 @@ interface RefundRecordCrossTeam extends RefundRecord {
|
|
|
201
201
|
/** 团队名称 */
|
|
202
202
|
teamName: string;
|
|
203
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* 跨团队充值消费统计汇总
|
|
206
|
+
*/
|
|
207
|
+
interface RechargeConsumptionStatsCrossTeam {
|
|
208
|
+
/** 消费-今日 */
|
|
209
|
+
consumptionToday: string;
|
|
210
|
+
/** 消费-近7天 */
|
|
211
|
+
consumptionLast7Days: string;
|
|
212
|
+
/** 消费-近30天 */
|
|
213
|
+
consumptionLast30Days: string;
|
|
214
|
+
/** 消费-总额(所有时间) */
|
|
215
|
+
consumptionTotal: string;
|
|
216
|
+
/** 充值-今日 */
|
|
217
|
+
rechargeToday: string;
|
|
218
|
+
/** 充值-近7天 */
|
|
219
|
+
rechargeLast7Days: string;
|
|
220
|
+
/** 充值-近30天 */
|
|
221
|
+
rechargeLast30Days: string;
|
|
222
|
+
/** 充值-总额(所有时间) */
|
|
223
|
+
rechargeTotal: string;
|
|
224
|
+
/** 统计的团队数量 */
|
|
225
|
+
teamCount: number;
|
|
226
|
+
}
|
|
204
227
|
|
|
205
228
|
/**
|
|
206
229
|
* 充值消费模块
|
|
@@ -533,6 +556,27 @@ declare class Billing {
|
|
|
533
556
|
* ```
|
|
534
557
|
*/
|
|
535
558
|
getRefundRecordsCrossTeam(params: CrossTeamQueryParams): Promise<CrossTeamPaginatedResult<RefundRecordCrossTeam>>;
|
|
559
|
+
/**
|
|
560
|
+
* 获取跨团队充值消费统计汇总
|
|
561
|
+
*
|
|
562
|
+
* @description
|
|
563
|
+
* 获取用户拥有财务权限的所有团队的充值和消费统计汇总。
|
|
564
|
+
* 包括今日、近7天、近30天以及总额的充值和消费数据,以及统计的团队数量。
|
|
565
|
+
*
|
|
566
|
+
* @returns 跨团队充值消费统计汇总
|
|
567
|
+
* @throws {PlolinkError} 当请求失败时抛出
|
|
568
|
+
*
|
|
569
|
+
* @example
|
|
570
|
+
* ```typescript
|
|
571
|
+
* const stats = await billing.getRechargeConsumptionStatsCrossTeam();
|
|
572
|
+
* console.log(`全部团队今日消费: ${stats.consumptionToday}`);
|
|
573
|
+
* console.log(`全部团队今日充值: ${stats.rechargeToday}`);
|
|
574
|
+
* console.log(`全部团队消费总额: ${stats.consumptionTotal}`);
|
|
575
|
+
* console.log(`全部团队充值总额: ${stats.rechargeTotal}`);
|
|
576
|
+
* console.log(`统计团队数: ${stats.teamCount}`);
|
|
577
|
+
* ```
|
|
578
|
+
*/
|
|
579
|
+
getRechargeConsumptionStatsCrossTeam(): Promise<RechargeConsumptionStatsCrossTeam>;
|
|
536
580
|
}
|
|
537
581
|
|
|
538
|
-
export { type BalanceInfo, Billing, type CompanyAccount, type ConsumptionRecord, type ConsumptionRecordCrossTeam, type ConsumptionStats, type CreateRechargeParams, type CrossTeamPaginatedResult, type CrossTeamQueryParams, type InvoiceRecord, type InvoiceRecordCrossTeam, type OrderStatus, type OrderStatusResult, type PaginatedResult, type PaginationParams, type RechargeRecord, type RechargeRecordCrossTeam, type RefundRecord, type RefundRecordCrossTeam, type WechatRechargeResult };
|
|
582
|
+
export { type BalanceInfo, Billing, type CompanyAccount, type ConsumptionRecord, type ConsumptionRecordCrossTeam, type ConsumptionStats, type CreateRechargeParams, type CrossTeamPaginatedResult, type CrossTeamQueryParams, type InvoiceRecord, type InvoiceRecordCrossTeam, type OrderStatus, type OrderStatusResult, type PaginatedResult, type PaginationParams, type RechargeConsumptionStatsCrossTeam, type RechargeRecord, type RechargeRecordCrossTeam, type RefundRecord, type RefundRecordCrossTeam, type WechatRechargeResult };
|
|
@@ -404,6 +404,29 @@ var Billing = class {
|
|
|
404
404
|
}
|
|
405
405
|
});
|
|
406
406
|
}
|
|
407
|
+
/**
|
|
408
|
+
* 获取跨团队充值消费统计汇总
|
|
409
|
+
*
|
|
410
|
+
* @description
|
|
411
|
+
* 获取用户拥有财务权限的所有团队的充值和消费统计汇总。
|
|
412
|
+
* 包括今日、近7天、近30天以及总额的充值和消费数据,以及统计的团队数量。
|
|
413
|
+
*
|
|
414
|
+
* @returns 跨团队充值消费统计汇总
|
|
415
|
+
* @throws {PlolinkError} 当请求失败时抛出
|
|
416
|
+
*
|
|
417
|
+
* @example
|
|
418
|
+
* ```typescript
|
|
419
|
+
* const stats = await billing.getRechargeConsumptionStatsCrossTeam();
|
|
420
|
+
* console.log(`全部团队今日消费: ${stats.consumptionToday}`);
|
|
421
|
+
* console.log(`全部团队今日充值: ${stats.rechargeToday}`);
|
|
422
|
+
* console.log(`全部团队消费总额: ${stats.consumptionTotal}`);
|
|
423
|
+
* console.log(`全部团队充值总额: ${stats.rechargeTotal}`);
|
|
424
|
+
* console.log(`统计团队数: ${stats.teamCount}`);
|
|
425
|
+
* ```
|
|
426
|
+
*/
|
|
427
|
+
async getRechargeConsumptionStatsCrossTeam() {
|
|
428
|
+
return this.client.axiosInstance.get("/api/v1/payments/stats:cross-team");
|
|
429
|
+
}
|
|
407
430
|
};
|
|
408
431
|
|
|
409
432
|
export { Billing };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/modules/billing/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 充值消费模块\n * \n * @description\n * 提供完整的充值消费相关功能,包括:\n * - 余额查询\n * - 微信扫码充值(支持可选生成二维码图片)\n * - 订单状态查询和轮询\n * - 消费/充值/开票/退费记录查询\n * - 消耗统计\n * - 对公账户信息\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { Billing } from '@plolink/sdk/billing';\n * \n * const client = new PlolinkClient({\n * mode: 'apiKey',\n * apiKey: 'your-api-key'\n * });\n * \n * const billing = new Billing(client);\n * \n * // 查询余额\n * const balance = await billing.getBalance();\n * console.log(`当前余额: ${balance.balance}`);\n * \n * // 发起充值(含二维码图片)\n * const result = await billing.createRecharge({\n * amount: 100,\n * needQrCodeImage: true\n * });\n * console.log(`请扫码支付: ${result.qrCodeImageUrl}`);\n * \n * // 轮询订单状态\n * const poller = billing.watchOrderStatus(result.orderNo, (status) => {\n * console.log(`订单状态: ${status.status}`);\n * if (status.status === 'success') {\n * console.log('支付成功!');\n * }\n * });\n * ```\n * \n * @module billing\n */\n\nimport { PlolinkClient } from '../../core/client';\nimport { Poller } from '../../common/poller';\nimport { PlolinkError } from '../../core/error';\nimport type {\n BalanceInfo,\n CreateRechargeParams,\n WechatRechargeResult,\n OrderStatusResult,\n ConsumptionStats,\n PaginationParams,\n PaginatedResult,\n ConsumptionRecord,\n RechargeRecord,\n InvoiceRecord,\n RefundRecord,\n CompanyAccount,\n CrossTeamQueryParams,\n CrossTeamPaginatedResult,\n InvoiceRecordCrossTeam,\n RechargeRecordCrossTeam,\n ConsumptionRecordCrossTeam,\n RefundRecordCrossTeam,\n} from '../../types/billing';\n\nexport type {\n BalanceInfo,\n CreateRechargeParams,\n WechatRechargeResult,\n OrderStatus,\n OrderStatusResult,\n ConsumptionStats,\n PaginationParams,\n PaginatedResult,\n ConsumptionRecord,\n RechargeRecord,\n InvoiceRecord,\n RefundRecord,\n CompanyAccount,\n CrossTeamQueryParams,\n CrossTeamPaginatedResult,\n InvoiceRecordCrossTeam,\n RechargeRecordCrossTeam,\n ConsumptionRecordCrossTeam,\n RefundRecordCrossTeam,\n} from '../../types/billing';\n\n/**\n * 充值消费模块\n */\nexport class Billing {\n private client: PlolinkClient;\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 获取团队余额信息\n * \n * @returns 余额信息,包括可用余额和可开票金额\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const balance = await billing.getBalance();\n * console.log(`余额: ${balance.balance}, 可开票: ${balance.invoiceableAmount}`);\n * ```\n */\n public async getBalance(): Promise<BalanceInfo> {\n return this.client.axiosInstance.get('/api/v1/payments/balance');\n }\n\n /**\n * 创建微信充值订单\n * \n * @param params - 充值参数\n * @returns 充值订单信息,包含二维码URL和订单号\n * @throws {PlolinkError} 当金额无效或创建失败时抛出\n * \n * @example\n * ```typescript\n * // 基础充值(仅返回二维码URL)\n * const result = await billing.createRecharge({\n * amount: 100,\n * description: '充值100元'\n * });\n * console.log(`请使用微信扫描: ${result.qrCodeUrl}`);\n * \n * // 充值并获取二维码图片\n * const result = await billing.createRecharge({\n * amount: 100,\n * needQrCodeImage: true\n * });\n * console.log(`二维码图片地址: ${result.qrCodeImageUrl}`);\n * ```\n */\n public async createRecharge(params: CreateRechargeParams): Promise<WechatRechargeResult> {\n const { amount, description, needQrCodeImage } = params;\n \n if (amount <= 0) {\n throw new PlolinkError('Amount must be greater than 0', 'INVALID_AMOUNT');\n }\n\n return this.client.axiosInstance.post('/api/v1/payments/recharge/wechat', {\n amount,\n description,\n needQrCodeImage,\n });\n }\n\n /**\n * 查询订单状态\n * \n * @param orderNo - 订单号\n * @returns 订单状态信息\n * @throws {PlolinkError} 当订单不存在时抛出\n * \n * @example\n * ```typescript\n * const status = await billing.getOrderStatus('ORDER_123');\n * console.log(`订单状态: ${status.status}`);\n * ```\n */\n public async getOrderStatus(orderNo: string): Promise<OrderStatusResult> {\n // 通过充值记录接口查询订单状态\n const records = await this.getRechargeRecords();\n const record = records.find((r) => r.orderId === orderNo);\n \n if (!record) {\n throw new PlolinkError(`Order not found: ${orderNo}`, 'ORDER_NOT_FOUND');\n }\n\n return {\n orderNo,\n status: record.status,\n amount: record.amount,\n createdAt: record.createdAt,\n };\n }\n\n /**\n * 轮询订单状态\n * \n * @description\n * 创建一个轮询器持续监听订单状态变化,直到订单达到终态(success/failed/closed)。\n * 使用指数退避策略,初始间隔1秒,最大间隔30秒。\n * \n * @param orderNo - 订单号\n * @param onStatusChange - 状态变化回调函数\n * @returns Poller实例,可用于手动停止轮询\n * \n * @example\n * ```typescript\n * const poller = billing.watchOrderStatus('ORDER_123', (status) => {\n * console.log(`状态更新: ${status.status}`);\n * \n * if (status.status === 'success') {\n * console.log('支付成功!');\n * } else if (status.status === 'failed') {\n * console.error('支付失败!');\n * }\n * });\n * \n * // 开始轮询\n * poller.start();\n * \n * // 需要时可以手动停止\n * // poller.stop();\n * ```\n */\n public watchOrderStatus(\n orderNo: string,\n onStatusChange: (status: OrderStatusResult) => void\n ): Poller<OrderStatusResult> {\n const poller = new Poller<OrderStatusResult>({\n task: () => this.getOrderStatus(orderNo),\n onResult: onStatusChange,\n shouldStop: (status) => {\n return ['success', 'failed', 'closed'].includes(status.status);\n },\n initialInterval: 1000,\n maxInterval: 30000,\n backoffFactor: 1.5,\n onError: (error) => {\n this.client.logger.error('Order polling error', { error, orderNo });\n },\n });\n\n // 自动启动\n void poller.start();\n\n return poller;\n }\n\n /**\n * 获取消耗统计\n * \n * @returns 消耗统计信息(今日/7天/30天)\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const stats = await billing.getConsumptionStats();\n * console.log(`今日消耗: ${stats.today}`);\n * console.log(`7天消耗: ${stats.last7Days}`);\n * console.log(`30天消耗: ${stats.last30Days}`);\n * ```\n */\n public async getConsumptionStats(): Promise<ConsumptionStats> {\n return this.client.axiosInstance.get('/api/v1/payments/consumption/stats');\n }\n\n /**\n * 获取消费记录(分页)\n * \n * @param params - 分页参数\n * @returns 消费记录列表和总数\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getConsumptionRecords({\n * page: 1,\n * pageSize: 20\n * });\n * console.log(`共 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`消费: ${record.amount}, 用途: ${record.purpose}`);\n * });\n * ```\n */\n public async getConsumptionRecords(\n params: PaginationParams = {}\n ): Promise<PaginatedResult<ConsumptionRecord>> {\n const { page = 1, pageSize = 20 } = params;\n return this.client.axiosInstance.get('/api/v1/payments/consumption/records', {\n params: { page, pageSize },\n });\n }\n\n /**\n * 获取充值记录\n * \n * @returns 充值记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const records = await billing.getRechargeRecords();\n * records.forEach(record => {\n * console.log(`${record.createdAt}: ${record.amount}, 状态: ${record.status}`);\n * });\n * ```\n */\n public async getRechargeRecords(): Promise<RechargeRecord[]> {\n return this.client.axiosInstance.get('/api/v1/payments/recharge/records');\n }\n\n /**\n * 获取开票记录\n * \n * @returns 开票记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const records = await billing.getInvoiceRecords();\n * records.forEach(record => {\n * console.log(`发票: ${record.invoiceNumber}, 金额: ${record.amount}`);\n * });\n * ```\n */\n public async getInvoiceRecords(): Promise<InvoiceRecord[]> {\n return this.client.axiosInstance.get('/api/v1/payments/invoice/records');\n }\n\n /**\n * 获取退费记录\n * \n * @returns 退费记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const records = await billing.getRefundRecords();\n * records.forEach(record => {\n * console.log(`退费: ${record.amount}, 备注: ${record.remark}`);\n * });\n * ```\n */\n public async getRefundRecords(): Promise<RefundRecord[]> {\n return this.client.axiosInstance.get('/api/v1/payments/refund/records');\n }\n\n /**\n * 获取对公账户信息\n * \n * @returns 对公账户信息\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const account = await billing.getCompanyAccount();\n * console.log(`账户名: ${account.accountName}`);\n * console.log(`账号: ${account.accountNumber}`);\n * console.log(`开户行: ${account.bankName}`);\n * ```\n */\n public async getCompanyAccount(): Promise<CompanyAccount> {\n return this.client.axiosInstance.get('/api/v1/payments/company-account');\n }\n\n // ============ 跨团队查询接口 ============\n\n /**\n * 获取跨团队开票记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的开票记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getInvoiceRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 发票号: ${record.invoiceNumber}, 金额: ${record.amount}`);\n * });\n * ```\n */\n public async getInvoiceRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<InvoiceRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/invoice/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队充值记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的充值记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getRechargeRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 状态: ${record.status}`);\n * });\n * ```\n */\n public async getRechargeRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<RechargeRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/recharge/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队消费记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的消费记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getConsumptionRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 用途: ${record.purpose}`);\n * });\n * ```\n */\n public async getConsumptionRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<ConsumptionRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/consumption/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队退费记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的退费记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getRefundRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 备注: ${record.remark}`);\n * });\n * ```\n */\n public async getRefundRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<RefundRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/refund/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/modules/billing/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 充值消费模块\n * \n * @description\n * 提供完整的充值消费相关功能,包括:\n * - 余额查询\n * - 微信扫码充值(支持可选生成二维码图片)\n * - 订单状态查询和轮询\n * - 消费/充值/开票/退费记录查询\n * - 消耗统计\n * - 对公账户信息\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { Billing } from '@plolink/sdk/billing';\n * \n * const client = new PlolinkClient({\n * mode: 'apiKey',\n * apiKey: 'your-api-key'\n * });\n * \n * const billing = new Billing(client);\n * \n * // 查询余额\n * const balance = await billing.getBalance();\n * console.log(`当前余额: ${balance.balance}`);\n * \n * // 发起充值(含二维码图片)\n * const result = await billing.createRecharge({\n * amount: 100,\n * needQrCodeImage: true\n * });\n * console.log(`请扫码支付: ${result.qrCodeImageUrl}`);\n * \n * // 轮询订单状态\n * const poller = billing.watchOrderStatus(result.orderNo, (status) => {\n * console.log(`订单状态: ${status.status}`);\n * if (status.status === 'success') {\n * console.log('支付成功!');\n * }\n * });\n * ```\n * \n * @module billing\n */\n\nimport { PlolinkClient } from '../../core/client';\nimport { Poller } from '../../common/poller';\nimport { PlolinkError } from '../../core/error';\nimport type {\n BalanceInfo,\n CreateRechargeParams,\n WechatRechargeResult,\n OrderStatusResult,\n ConsumptionStats,\n PaginationParams,\n PaginatedResult,\n ConsumptionRecord,\n RechargeRecord,\n InvoiceRecord,\n RefundRecord,\n CompanyAccount,\n CrossTeamQueryParams,\n CrossTeamPaginatedResult,\n InvoiceRecordCrossTeam,\n RechargeRecordCrossTeam,\n ConsumptionRecordCrossTeam,\n RefundRecordCrossTeam,\n RechargeConsumptionStatsCrossTeam,\n} from '../../types/billing';\n\nexport type {\n BalanceInfo,\n CreateRechargeParams,\n WechatRechargeResult,\n OrderStatus,\n OrderStatusResult,\n ConsumptionStats,\n PaginationParams,\n PaginatedResult,\n ConsumptionRecord,\n RechargeRecord,\n InvoiceRecord,\n RefundRecord,\n CompanyAccount,\n CrossTeamQueryParams,\n CrossTeamPaginatedResult,\n InvoiceRecordCrossTeam,\n RechargeRecordCrossTeam,\n ConsumptionRecordCrossTeam,\n RefundRecordCrossTeam,\n RechargeConsumptionStatsCrossTeam,\n} from '../../types/billing';\n\n/**\n * 充值消费模块\n */\nexport class Billing {\n private client: PlolinkClient;\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 获取团队余额信息\n * \n * @returns 余额信息,包括可用余额和可开票金额\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const balance = await billing.getBalance();\n * console.log(`余额: ${balance.balance}, 可开票: ${balance.invoiceableAmount}`);\n * ```\n */\n public async getBalance(): Promise<BalanceInfo> {\n return this.client.axiosInstance.get('/api/v1/payments/balance');\n }\n\n /**\n * 创建微信充值订单\n * \n * @param params - 充值参数\n * @returns 充值订单信息,包含二维码URL和订单号\n * @throws {PlolinkError} 当金额无效或创建失败时抛出\n * \n * @example\n * ```typescript\n * // 基础充值(仅返回二维码URL)\n * const result = await billing.createRecharge({\n * amount: 100,\n * description: '充值100元'\n * });\n * console.log(`请使用微信扫描: ${result.qrCodeUrl}`);\n * \n * // 充值并获取二维码图片\n * const result = await billing.createRecharge({\n * amount: 100,\n * needQrCodeImage: true\n * });\n * console.log(`二维码图片地址: ${result.qrCodeImageUrl}`);\n * ```\n */\n public async createRecharge(params: CreateRechargeParams): Promise<WechatRechargeResult> {\n const { amount, description, needQrCodeImage } = params;\n \n if (amount <= 0) {\n throw new PlolinkError('Amount must be greater than 0', 'INVALID_AMOUNT');\n }\n\n return this.client.axiosInstance.post('/api/v1/payments/recharge/wechat', {\n amount,\n description,\n needQrCodeImage,\n });\n }\n\n /**\n * 查询订单状态\n * \n * @param orderNo - 订单号\n * @returns 订单状态信息\n * @throws {PlolinkError} 当订单不存在时抛出\n * \n * @example\n * ```typescript\n * const status = await billing.getOrderStatus('ORDER_123');\n * console.log(`订单状态: ${status.status}`);\n * ```\n */\n public async getOrderStatus(orderNo: string): Promise<OrderStatusResult> {\n // 通过充值记录接口查询订单状态\n const records = await this.getRechargeRecords();\n const record = records.find((r) => r.orderId === orderNo);\n \n if (!record) {\n throw new PlolinkError(`Order not found: ${orderNo}`, 'ORDER_NOT_FOUND');\n }\n\n return {\n orderNo,\n status: record.status,\n amount: record.amount,\n createdAt: record.createdAt,\n };\n }\n\n /**\n * 轮询订单状态\n * \n * @description\n * 创建一个轮询器持续监听订单状态变化,直到订单达到终态(success/failed/closed)。\n * 使用指数退避策略,初始间隔1秒,最大间隔30秒。\n * \n * @param orderNo - 订单号\n * @param onStatusChange - 状态变化回调函数\n * @returns Poller实例,可用于手动停止轮询\n * \n * @example\n * ```typescript\n * const poller = billing.watchOrderStatus('ORDER_123', (status) => {\n * console.log(`状态更新: ${status.status}`);\n * \n * if (status.status === 'success') {\n * console.log('支付成功!');\n * } else if (status.status === 'failed') {\n * console.error('支付失败!');\n * }\n * });\n * \n * // 开始轮询\n * poller.start();\n * \n * // 需要时可以手动停止\n * // poller.stop();\n * ```\n */\n public watchOrderStatus(\n orderNo: string,\n onStatusChange: (status: OrderStatusResult) => void\n ): Poller<OrderStatusResult> {\n const poller = new Poller<OrderStatusResult>({\n task: () => this.getOrderStatus(orderNo),\n onResult: onStatusChange,\n shouldStop: (status) => {\n return ['success', 'failed', 'closed'].includes(status.status);\n },\n initialInterval: 1000,\n maxInterval: 30000,\n backoffFactor: 1.5,\n onError: (error) => {\n this.client.logger.error('Order polling error', { error, orderNo });\n },\n });\n\n // 自动启动\n void poller.start();\n\n return poller;\n }\n\n /**\n * 获取消耗统计\n * \n * @returns 消耗统计信息(今日/7天/30天)\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const stats = await billing.getConsumptionStats();\n * console.log(`今日消耗: ${stats.today}`);\n * console.log(`7天消耗: ${stats.last7Days}`);\n * console.log(`30天消耗: ${stats.last30Days}`);\n * ```\n */\n public async getConsumptionStats(): Promise<ConsumptionStats> {\n return this.client.axiosInstance.get('/api/v1/payments/consumption/stats');\n }\n\n /**\n * 获取消费记录(分页)\n * \n * @param params - 分页参数\n * @returns 消费记录列表和总数\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getConsumptionRecords({\n * page: 1,\n * pageSize: 20\n * });\n * console.log(`共 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`消费: ${record.amount}, 用途: ${record.purpose}`);\n * });\n * ```\n */\n public async getConsumptionRecords(\n params: PaginationParams = {}\n ): Promise<PaginatedResult<ConsumptionRecord>> {\n const { page = 1, pageSize = 20 } = params;\n return this.client.axiosInstance.get('/api/v1/payments/consumption/records', {\n params: { page, pageSize },\n });\n }\n\n /**\n * 获取充值记录\n * \n * @returns 充值记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const records = await billing.getRechargeRecords();\n * records.forEach(record => {\n * console.log(`${record.createdAt}: ${record.amount}, 状态: ${record.status}`);\n * });\n * ```\n */\n public async getRechargeRecords(): Promise<RechargeRecord[]> {\n return this.client.axiosInstance.get('/api/v1/payments/recharge/records');\n }\n\n /**\n * 获取开票记录\n * \n * @returns 开票记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const records = await billing.getInvoiceRecords();\n * records.forEach(record => {\n * console.log(`发票: ${record.invoiceNumber}, 金额: ${record.amount}`);\n * });\n * ```\n */\n public async getInvoiceRecords(): Promise<InvoiceRecord[]> {\n return this.client.axiosInstance.get('/api/v1/payments/invoice/records');\n }\n\n /**\n * 获取退费记录\n * \n * @returns 退费记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const records = await billing.getRefundRecords();\n * records.forEach(record => {\n * console.log(`退费: ${record.amount}, 备注: ${record.remark}`);\n * });\n * ```\n */\n public async getRefundRecords(): Promise<RefundRecord[]> {\n return this.client.axiosInstance.get('/api/v1/payments/refund/records');\n }\n\n /**\n * 获取对公账户信息\n * \n * @returns 对公账户信息\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const account = await billing.getCompanyAccount();\n * console.log(`账户名: ${account.accountName}`);\n * console.log(`账号: ${account.accountNumber}`);\n * console.log(`开户行: ${account.bankName}`);\n * ```\n */\n public async getCompanyAccount(): Promise<CompanyAccount> {\n return this.client.axiosInstance.get('/api/v1/payments/company-account');\n }\n\n // ============ 跨团队查询接口 ============\n\n /**\n * 获取跨团队开票记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的开票记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getInvoiceRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 发票号: ${record.invoiceNumber}, 金额: ${record.amount}`);\n * });\n * ```\n */\n public async getInvoiceRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<InvoiceRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/invoice/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队充值记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的充值记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getRechargeRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 状态: ${record.status}`);\n * });\n * ```\n */\n public async getRechargeRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<RechargeRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/recharge/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队消费记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的消费记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getConsumptionRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 用途: ${record.purpose}`);\n * });\n * ```\n */\n public async getConsumptionRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<ConsumptionRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/consumption/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队退费记录\n * \n * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的退费记录\n * \n * @param params - 查询参数\n * @returns 分页结果(包含团队名称)\n * @throws {PlolinkError} 当参数无效或请求失败时抛出\n * \n * @example\n * ```typescript\n * const result = await billing.getRefundRecordsCrossTeam({\n * startDate: '2025-01-01T00:00:00.000Z',\n * endDate: '2025-01-31T23:59:59.999Z',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log(`共查询到 ${result.total} 条记录`);\n * result.list.forEach(record => {\n * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 备注: ${record.remark}`);\n * });\n * ```\n */\n public async getRefundRecordsCrossTeam(\n params: CrossTeamQueryParams\n ): Promise<CrossTeamPaginatedResult<RefundRecordCrossTeam>> {\n const { startDate, endDate, page = 1, pageSize = 20 } = params;\n\n if (!startDate || !endDate) {\n throw new PlolinkError('startDate and endDate are required', 'MISSING_PARAMS');\n }\n\n if (pageSize > 100) {\n throw new PlolinkError('pageSize must not exceed 100', 'INVALID_PAGE_SIZE');\n }\n\n return this.client.axiosInstance.get('/api/v1/payments/refund/records:cross-team', {\n params: {\n startDate,\n endDate,\n page,\n pageSize,\n },\n });\n }\n\n /**\n * 获取跨团队充值消费统计汇总\n *\n * @description\n * 获取用户拥有财务权限的所有团队的充值和消费统计汇总。\n * 包括今日、近7天、近30天以及总额的充值和消费数据,以及统计的团队数量。\n *\n * @returns 跨团队充值消费统计汇总\n * @throws {PlolinkError} 当请求失败时抛出\n *\n * @example\n * ```typescript\n * const stats = await billing.getRechargeConsumptionStatsCrossTeam();\n * console.log(`全部团队今日消费: ${stats.consumptionToday}`);\n * console.log(`全部团队今日充值: ${stats.rechargeToday}`);\n * console.log(`全部团队消费总额: ${stats.consumptionTotal}`);\n * console.log(`全部团队充值总额: ${stats.rechargeTotal}`);\n * console.log(`统计团队数: ${stats.teamCount}`);\n * ```\n */\n public async getRechargeConsumptionStatsCrossTeam(): Promise<RechargeConsumptionStatsCrossTeam> {\n return this.client.axiosInstance.get('/api/v1/payments/stats:cross-team');\n }\n}\n"]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkY3UJVC2L_cjs = require('../../chunk-Y3UJVC2L.cjs');
|
|
4
|
+
|
|
5
|
+
// src/modules/llm/index.ts
|
|
6
|
+
var LLM = class {
|
|
7
|
+
constructor(client) {
|
|
8
|
+
this.client = client;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 聊天完成
|
|
12
|
+
*
|
|
13
|
+
* @description
|
|
14
|
+
* 调用 LLM 模型进行聊天对话。支持多轮对话,自动处理计费扣费。
|
|
15
|
+
*
|
|
16
|
+
* @param params - 聊天完成参数
|
|
17
|
+
* @returns 聊天完成响应,包含生成的内容和 token 使用信息
|
|
18
|
+
* @throws {PlolinkError} 当参数无效、余额不足或调用失败时抛出
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const response = await llm.chat({
|
|
23
|
+
* model: 'deepseek-v3-1-terminus',
|
|
24
|
+
* messages: [
|
|
25
|
+
* { role: 'system', content: '你是一个专业的编程助手' },
|
|
26
|
+
* { role: 'user', content: '如何用 TypeScript 实现单例模式?' }
|
|
27
|
+
* ],
|
|
28
|
+
* temperature: 0.7
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* console.log('回复:', response.choices[0].message.content);
|
|
32
|
+
* console.log('输入 tokens:', response.usage.prompt_tokens);
|
|
33
|
+
* console.log('输出 tokens:', response.usage.completion_tokens);
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
async chat(params) {
|
|
37
|
+
if (!params.model) {
|
|
38
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("Model is required", "INVALID_PARAMS");
|
|
39
|
+
}
|
|
40
|
+
if (!params.messages || params.messages.length === 0) {
|
|
41
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("Messages array cannot be empty", "INVALID_PARAMS");
|
|
42
|
+
}
|
|
43
|
+
for (const message of params.messages) {
|
|
44
|
+
if (!message.role || !["system", "user", "assistant"].includes(message.role)) {
|
|
45
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError(
|
|
46
|
+
`Invalid message role: ${message.role}. Must be one of: system, user, assistant`,
|
|
47
|
+
"INVALID_PARAMS"
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
if (!message.content) {
|
|
51
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("Message content cannot be empty", "INVALID_PARAMS");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (params.temperature !== void 0) {
|
|
55
|
+
if (params.temperature < 0 || params.temperature > 2) {
|
|
56
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("Temperature must be between 0 and 2", "INVALID_PARAMS");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (params.max_tokens !== void 0 && params.max_tokens <= 0) {
|
|
60
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("max_tokens must be a positive number", "INVALID_PARAMS");
|
|
61
|
+
}
|
|
62
|
+
if (params.top_p !== void 0) {
|
|
63
|
+
if (params.top_p < 0 || params.top_p > 1) {
|
|
64
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("top_p must be between 0 and 1", "INVALID_PARAMS");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
this.client.logger.info("Calling LLM chat completion", {
|
|
68
|
+
model: params.model,
|
|
69
|
+
messageCount: params.messages.length
|
|
70
|
+
});
|
|
71
|
+
return this.client.axiosInstance.post("/api/v1/llm/chat/completions", params);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 获取所有可用模型列表
|
|
75
|
+
*
|
|
76
|
+
* @description
|
|
77
|
+
* 获取所有可用的 LLM 模型及其详细信息,包括供应商和价格信息。
|
|
78
|
+
*
|
|
79
|
+
* @returns 模型信息列表
|
|
80
|
+
* @throws {PlolinkError} 当请求失败时抛出
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* const models = await llm.getModels();
|
|
85
|
+
*
|
|
86
|
+
* console.log(`共有 ${models.length} 个可用模型`);
|
|
87
|
+
*
|
|
88
|
+
* models.forEach(model => {
|
|
89
|
+
* console.log(`模型:${model.name}`);
|
|
90
|
+
* console.log(` ID: ${model.id}`);
|
|
91
|
+
* console.log(` 供应商: ${model.provider}`);
|
|
92
|
+
* console.log(` 输入价格: ${model.inputPrice} 元/1000 tokens`);
|
|
93
|
+
* console.log(` 输出价格: ${model.outputPrice} 元/1000 tokens`);
|
|
94
|
+
* });
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
async getModels() {
|
|
98
|
+
this.client.logger.info("Fetching available models");
|
|
99
|
+
return this.client.axiosInstance.get("/api/v1/llm/models");
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
exports.LLM = LLM;
|
|
104
|
+
//# sourceMappingURL=index.cjs.map
|
|
105
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/modules/llm/index.ts"],"names":["PlolinkError"],"mappings":";;;;;AAgEO,IAAM,MAAN,MAAU;AAAA,EAGf,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BA,MAAa,KAAK,MAAA,EAA+D;AAE/E,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,MAAM,IAAIA,8BAAA,CAAa,mBAAA,EAAqB,gBAAgB,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,EAAG;AACpD,MAAA,MAAM,IAAIA,8BAAA,CAAa,gCAAA,EAAkC,gBAAgB,CAAA;AAAA,IAC3E;AAGA,IAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,MAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,IAAQ,CAAC,CAAC,QAAA,EAAU,MAAA,EAAQ,WAAW,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5E,QAAA,MAAM,IAAIA,8BAAA;AAAA,UACR,CAAA,sBAAA,EAAyB,QAAQ,IAAI,CAAA,yCAAA,CAAA;AAAA,UACrC;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,QAAA,MAAM,IAAIA,8BAAA,CAAa,iCAAA,EAAmC,gBAAgB,CAAA;AAAA,MAC5E;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAW;AACpC,MAAA,IAAI,MAAA,CAAO,WAAA,GAAc,CAAA,IAAK,MAAA,CAAO,cAAc,CAAA,EAAG;AACpD,QAAA,MAAM,IAAIA,8BAAA,CAAa,qCAAA,EAAuC,gBAAgB,CAAA;AAAA,MAChF;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,UAAA,KAAe,MAAA,IAAa,MAAA,CAAO,cAAc,CAAA,EAAG;AAC7D,MAAA,MAAM,IAAIA,8BAAA,CAAa,sCAAA,EAAwC,gBAAgB,CAAA;AAAA,IACjF;AAEA,IAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAW;AAC9B,MAAA,IAAI,MAAA,CAAO,KAAA,GAAQ,CAAA,IAAK,MAAA,CAAO,QAAQ,CAAA,EAAG;AACxC,QAAA,MAAM,IAAIA,8BAAA,CAAa,+BAAA,EAAiC,gBAAgB,CAAA;AAAA,MAC1E;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,6BAAA,EAA+B;AAAA,MACrD,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAA,EAAc,OAAO,QAAA,CAAS;AAAA,KAC/B,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,IAAA,CAAK,gCAAgC,MAAM,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,MAAa,SAAA,GAAkC;AAC7C,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,2BAA2B,CAAA;AAEnD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,GAAA,CAAI,oBAAoB,CAAA;AAAA,EAC3D;AACF","file":"index.cjs","sourcesContent":["/**\n * LLM 模块\n * \n * @description\n * 提供通用的 LLM 调用能力,兼容 OpenAI API 格式。\n * 支持:\n * - 聊天完成(chat completions)\n * - 模型列表查询\n * - 自动计费扣费\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { LLM } from '@plolink/sdk/llm';\n * \n * const client = new PlolinkClient({\n * token: 'sk-your-api-key'\n * });\n * \n * const llm = new LLM(client);\n * \n * // 获取模型列表\n * const models = await llm.getModels();\n * console.log('可用模型:', models.map(m => m.id));\n * \n * // 调用聊天完成\n * const response = await llm.chat({\n * model: 'deepseek-v3-1-terminus',\n * messages: [\n * { role: 'system', content: '你是一个有帮助的助手' },\n * { role: 'user', content: '你好,请介绍一下自己' }\n * ],\n * temperature: 0.7\n * });\n * \n * console.log('回复:', response.choices[0].message.content);\n * console.log('消耗 tokens:', response.usage);\n * ```\n * \n * @module llm\n */\n\nimport { PlolinkClient } from '../../core/client';\nimport { PlolinkError } from '../../core/error';\nimport type {\n ChatCompletionParams,\n ChatCompletionResponse,\n ModelInfo,\n} from '../../types/llm';\n\n// Re-export 类型\nexport type {\n MessageRole,\n ChatMessage,\n ChatCompletionParams,\n ChatCompletionChoice,\n TokenUsage,\n ChatCompletionResponse,\n ModelInfo,\n} from '../../types/llm';\n\n/**\n * LLM 模块类\n */\nexport class LLM {\n private client: PlolinkClient;\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 聊天完成\n * \n * @description\n * 调用 LLM 模型进行聊天对话。支持多轮对话,自动处理计费扣费。\n * \n * @param params - 聊天完成参数\n * @returns 聊天完成响应,包含生成的内容和 token 使用信息\n * @throws {PlolinkError} 当参数无效、余额不足或调用失败时抛出\n * \n * @example\n * ```typescript\n * const response = await llm.chat({\n * model: 'deepseek-v3-1-terminus',\n * messages: [\n * { role: 'system', content: '你是一个专业的编程助手' },\n * { role: 'user', content: '如何用 TypeScript 实现单例模式?' }\n * ],\n * temperature: 0.7\n * });\n * \n * console.log('回复:', response.choices[0].message.content);\n * console.log('输入 tokens:', response.usage.prompt_tokens);\n * console.log('输出 tokens:', response.usage.completion_tokens);\n * ```\n */\n public async chat(params: ChatCompletionParams): Promise<ChatCompletionResponse> {\n // 参数验证\n if (!params.model) {\n throw new PlolinkError('Model is required', 'INVALID_PARAMS');\n }\n\n if (!params.messages || params.messages.length === 0) {\n throw new PlolinkError('Messages array cannot be empty', 'INVALID_PARAMS');\n }\n\n // 验证每条消息\n for (const message of params.messages) {\n if (!message.role || !['system', 'user', 'assistant'].includes(message.role)) {\n throw new PlolinkError(\n `Invalid message role: ${message.role}. Must be one of: system, user, assistant`,\n 'INVALID_PARAMS'\n );\n }\n if (!message.content) {\n throw new PlolinkError('Message content cannot be empty', 'INVALID_PARAMS');\n }\n }\n\n // 验证可选参数\n if (params.temperature !== undefined) {\n if (params.temperature < 0 || params.temperature > 2) {\n throw new PlolinkError('Temperature must be between 0 and 2', 'INVALID_PARAMS');\n }\n }\n\n if (params.max_tokens !== undefined && params.max_tokens <= 0) {\n throw new PlolinkError('max_tokens must be a positive number', 'INVALID_PARAMS');\n }\n\n if (params.top_p !== undefined) {\n if (params.top_p < 0 || params.top_p > 1) {\n throw new PlolinkError('top_p must be between 0 and 1', 'INVALID_PARAMS');\n }\n }\n\n this.client.logger.info('Calling LLM chat completion', {\n model: params.model,\n messageCount: params.messages.length,\n });\n\n return this.client.axiosInstance.post('/api/v1/llm/chat/completions', params);\n }\n\n /**\n * 获取所有可用模型列表\n * \n * @description\n * 获取所有可用的 LLM 模型及其详细信息,包括供应商和价格信息。\n * \n * @returns 模型信息列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const models = await llm.getModels();\n * \n * console.log(`共有 ${models.length} 个可用模型`);\n * \n * models.forEach(model => {\n * console.log(`模型:${model.name}`);\n * console.log(` ID: ${model.id}`);\n * console.log(` 供应商: ${model.provider}`);\n * console.log(` 输入价格: ${model.inputPrice} 元/1000 tokens`);\n * console.log(` 输出价格: ${model.outputPrice} 元/1000 tokens`);\n * });\n * ```\n */\n public async getModels(): Promise<ModelInfo[]> {\n this.client.logger.info('Fetching available models');\n\n return this.client.axiosInstance.get('/api/v1/llm/models');\n }\n}\n"]}
|