@plolink/sdk 0.0.11 → 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/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/package.json +1 -1
|
@@ -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"]}
|