@plolink/sdk 0.0.4

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.
Files changed (76) hide show
  1. package/README.md +259 -0
  2. package/dist/chunk-4H4RACSE.js +335 -0
  3. package/dist/chunk-4H4RACSE.js.map +1 -0
  4. package/dist/chunk-IHAAKFEJ.js +219 -0
  5. package/dist/chunk-IHAAKFEJ.js.map +1 -0
  6. package/dist/chunk-JR4HYYQI.cjs +221 -0
  7. package/dist/chunk-JR4HYYQI.cjs.map +1 -0
  8. package/dist/chunk-MD4O7FWT.js +46 -0
  9. package/dist/chunk-MD4O7FWT.js.map +1 -0
  10. package/dist/chunk-NS3DJP2O.cjs +349 -0
  11. package/dist/chunk-NS3DJP2O.cjs.map +1 -0
  12. package/dist/chunk-Y3UJVC2L.cjs +48 -0
  13. package/dist/chunk-Y3UJVC2L.cjs.map +1 -0
  14. package/dist/client-CAjIQKPm.d.cts +193 -0
  15. package/dist/client-CwNikk7i.d.ts +193 -0
  16. package/dist/common/index.cjs +65 -0
  17. package/dist/common/index.cjs.map +1 -0
  18. package/dist/common/index.d.cts +422 -0
  19. package/dist/common/index.d.ts +422 -0
  20. package/dist/common/index.js +4 -0
  21. package/dist/common/index.js.map +1 -0
  22. package/dist/core-77EbLgbp.d.cts +97 -0
  23. package/dist/core-77EbLgbp.d.ts +97 -0
  24. package/dist/index.cjs +350 -0
  25. package/dist/index.cjs.map +1 -0
  26. package/dist/index.d.cts +98 -0
  27. package/dist/index.d.ts +98 -0
  28. package/dist/index.js +306 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/modules/agent/index.cjs +21 -0
  31. package/dist/modules/agent/index.cjs.map +1 -0
  32. package/dist/modules/agent/index.d.cts +71 -0
  33. package/dist/modules/agent/index.d.ts +71 -0
  34. package/dist/modules/agent/index.js +19 -0
  35. package/dist/modules/agent/index.js.map +1 -0
  36. package/dist/modules/billing/index.cjs +413 -0
  37. package/dist/modules/billing/index.cjs.map +1 -0
  38. package/dist/modules/billing/index.d.cts +538 -0
  39. package/dist/modules/billing/index.d.ts +538 -0
  40. package/dist/modules/billing/index.js +411 -0
  41. package/dist/modules/billing/index.js.map +1 -0
  42. package/dist/modules/chat/index.cjs +20 -0
  43. package/dist/modules/chat/index.cjs.map +1 -0
  44. package/dist/modules/chat/index.d.cts +68 -0
  45. package/dist/modules/chat/index.d.ts +68 -0
  46. package/dist/modules/chat/index.js +18 -0
  47. package/dist/modules/chat/index.js.map +1 -0
  48. package/dist/modules/psych/index.cjs +20 -0
  49. package/dist/modules/psych/index.cjs.map +1 -0
  50. package/dist/modules/psych/index.d.cts +69 -0
  51. package/dist/modules/psych/index.d.ts +69 -0
  52. package/dist/modules/psych/index.js +18 -0
  53. package/dist/modules/psych/index.js.map +1 -0
  54. package/dist/modules/rbac/index.cjs +197 -0
  55. package/dist/modules/rbac/index.cjs.map +1 -0
  56. package/dist/modules/rbac/index.d.cts +293 -0
  57. package/dist/modules/rbac/index.d.ts +293 -0
  58. package/dist/modules/rbac/index.js +195 -0
  59. package/dist/modules/rbac/index.js.map +1 -0
  60. package/dist/modules/team/index.cjs +54 -0
  61. package/dist/modules/team/index.cjs.map +1 -0
  62. package/dist/modules/team/index.d.cts +91 -0
  63. package/dist/modules/team/index.d.ts +91 -0
  64. package/dist/modules/team/index.js +52 -0
  65. package/dist/modules/team/index.js.map +1 -0
  66. package/dist/modules/virtual-account/index.cjs +293 -0
  67. package/dist/modules/virtual-account/index.cjs.map +1 -0
  68. package/dist/modules/virtual-account/index.d.cts +366 -0
  69. package/dist/modules/virtual-account/index.d.ts +366 -0
  70. package/dist/modules/virtual-account/index.js +291 -0
  71. package/dist/modules/virtual-account/index.js.map +1 -0
  72. package/dist/poller-BlIRbwL4.d.cts +201 -0
  73. package/dist/poller-DWKZjuSw.d.ts +201 -0
  74. package/dist/shared-6ZepUSPW.d.cts +31 -0
  75. package/dist/shared-6ZepUSPW.d.ts +31 -0
  76. package/package.json +96 -0
@@ -0,0 +1,411 @@
1
+ import { Poller } from '../../chunk-IHAAKFEJ.js';
2
+ import { PlolinkError } from '../../chunk-MD4O7FWT.js';
3
+
4
+ // src/modules/billing/index.ts
5
+ var Billing = class {
6
+ constructor(client) {
7
+ this.client = client;
8
+ }
9
+ /**
10
+ * 获取团队余额信息
11
+ *
12
+ * @returns 余额信息,包括可用余额和可开票金额
13
+ * @throws {PlolinkError} 当请求失败时抛出
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const balance = await billing.getBalance();
18
+ * console.log(`余额: ${balance.balance}, 可开票: ${balance.invoiceableAmount}`);
19
+ * ```
20
+ */
21
+ async getBalance() {
22
+ return this.client.axiosInstance.get("/api/v1/payments/balance");
23
+ }
24
+ /**
25
+ * 创建微信充值订单
26
+ *
27
+ * @param params - 充值参数
28
+ * @returns 充值订单信息,包含二维码URL和订单号
29
+ * @throws {PlolinkError} 当金额无效或创建失败时抛出
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * // 基础充值(仅返回二维码URL)
34
+ * const result = await billing.createRecharge({
35
+ * amount: 100,
36
+ * description: '充值100元'
37
+ * });
38
+ * console.log(`请使用微信扫描: ${result.qrCodeUrl}`);
39
+ *
40
+ * // 充值并获取二维码图片
41
+ * const result = await billing.createRecharge({
42
+ * amount: 100,
43
+ * needQrCodeImage: true
44
+ * });
45
+ * console.log(`二维码图片地址: ${result.qrCodeImageUrl}`);
46
+ * ```
47
+ */
48
+ async createRecharge(params) {
49
+ const { amount, description, needQrCodeImage } = params;
50
+ if (amount <= 0) {
51
+ throw new PlolinkError("Amount must be greater than 0", "INVALID_AMOUNT");
52
+ }
53
+ return this.client.axiosInstance.post("/api/v1/payments/recharge/wechat", {
54
+ amount,
55
+ description,
56
+ needQrCodeImage
57
+ });
58
+ }
59
+ /**
60
+ * 查询订单状态
61
+ *
62
+ * @param orderNo - 订单号
63
+ * @returns 订单状态信息
64
+ * @throws {PlolinkError} 当订单不存在时抛出
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * const status = await billing.getOrderStatus('ORDER_123');
69
+ * console.log(`订单状态: ${status.status}`);
70
+ * ```
71
+ */
72
+ async getOrderStatus(orderNo) {
73
+ const records = await this.getRechargeRecords();
74
+ const record = records.find((r) => r.orderId === orderNo);
75
+ if (!record) {
76
+ throw new PlolinkError(`Order not found: ${orderNo}`, "ORDER_NOT_FOUND");
77
+ }
78
+ return {
79
+ orderNo,
80
+ status: record.status,
81
+ amount: record.amount,
82
+ createdAt: record.createdAt
83
+ };
84
+ }
85
+ /**
86
+ * 轮询订单状态
87
+ *
88
+ * @description
89
+ * 创建一个轮询器持续监听订单状态变化,直到订单达到终态(success/failed/closed)。
90
+ * 使用指数退避策略,初始间隔1秒,最大间隔30秒。
91
+ *
92
+ * @param orderNo - 订单号
93
+ * @param onStatusChange - 状态变化回调函数
94
+ * @returns Poller实例,可用于手动停止轮询
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * const poller = billing.watchOrderStatus('ORDER_123', (status) => {
99
+ * console.log(`状态更新: ${status.status}`);
100
+ *
101
+ * if (status.status === 'success') {
102
+ * console.log('支付成功!');
103
+ * } else if (status.status === 'failed') {
104
+ * console.error('支付失败!');
105
+ * }
106
+ * });
107
+ *
108
+ * // 开始轮询
109
+ * poller.start();
110
+ *
111
+ * // 需要时可以手动停止
112
+ * // poller.stop();
113
+ * ```
114
+ */
115
+ watchOrderStatus(orderNo, onStatusChange) {
116
+ const poller = new Poller({
117
+ task: () => this.getOrderStatus(orderNo),
118
+ onResult: onStatusChange,
119
+ shouldStop: (status) => {
120
+ return ["success", "failed", "closed"].includes(status.status);
121
+ },
122
+ initialInterval: 1e3,
123
+ maxInterval: 3e4,
124
+ backoffFactor: 1.5,
125
+ onError: (error) => {
126
+ this.client.logger.error("Order polling error", { error, orderNo });
127
+ }
128
+ });
129
+ void poller.start();
130
+ return poller;
131
+ }
132
+ /**
133
+ * 获取消耗统计
134
+ *
135
+ * @returns 消耗统计信息(今日/7天/30天)
136
+ * @throws {PlolinkError} 当请求失败时抛出
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * const stats = await billing.getConsumptionStats();
141
+ * console.log(`今日消耗: ${stats.today}`);
142
+ * console.log(`7天消耗: ${stats.last7Days}`);
143
+ * console.log(`30天消耗: ${stats.last30Days}`);
144
+ * ```
145
+ */
146
+ async getConsumptionStats() {
147
+ return this.client.axiosInstance.get("/api/v1/payments/consumption/stats");
148
+ }
149
+ /**
150
+ * 获取消费记录(分页)
151
+ *
152
+ * @param params - 分页参数
153
+ * @returns 消费记录列表和总数
154
+ * @throws {PlolinkError} 当请求失败时抛出
155
+ *
156
+ * @example
157
+ * ```typescript
158
+ * const result = await billing.getConsumptionRecords({
159
+ * page: 1,
160
+ * pageSize: 20
161
+ * });
162
+ * console.log(`共 ${result.total} 条记录`);
163
+ * result.list.forEach(record => {
164
+ * console.log(`消费: ${record.amount}, 用途: ${record.purpose}`);
165
+ * });
166
+ * ```
167
+ */
168
+ async getConsumptionRecords(params = {}) {
169
+ const { page = 1, pageSize = 20 } = params;
170
+ return this.client.axiosInstance.get("/api/v1/payments/consumption/records", {
171
+ params: { page, pageSize }
172
+ });
173
+ }
174
+ /**
175
+ * 获取充值记录
176
+ *
177
+ * @returns 充值记录列表
178
+ * @throws {PlolinkError} 当请求失败时抛出
179
+ *
180
+ * @example
181
+ * ```typescript
182
+ * const records = await billing.getRechargeRecords();
183
+ * records.forEach(record => {
184
+ * console.log(`${record.createdAt}: ${record.amount}, 状态: ${record.status}`);
185
+ * });
186
+ * ```
187
+ */
188
+ async getRechargeRecords() {
189
+ return this.client.axiosInstance.get("/api/v1/payments/recharge/records");
190
+ }
191
+ /**
192
+ * 获取开票记录
193
+ *
194
+ * @returns 开票记录列表
195
+ * @throws {PlolinkError} 当请求失败时抛出
196
+ *
197
+ * @example
198
+ * ```typescript
199
+ * const records = await billing.getInvoiceRecords();
200
+ * records.forEach(record => {
201
+ * console.log(`发票: ${record.invoiceNumber}, 金额: ${record.amount}`);
202
+ * });
203
+ * ```
204
+ */
205
+ async getInvoiceRecords() {
206
+ return this.client.axiosInstance.get("/api/v1/payments/invoice/records");
207
+ }
208
+ /**
209
+ * 获取退费记录
210
+ *
211
+ * @returns 退费记录列表
212
+ * @throws {PlolinkError} 当请求失败时抛出
213
+ *
214
+ * @example
215
+ * ```typescript
216
+ * const records = await billing.getRefundRecords();
217
+ * records.forEach(record => {
218
+ * console.log(`退费: ${record.amount}, 备注: ${record.remark}`);
219
+ * });
220
+ * ```
221
+ */
222
+ async getRefundRecords() {
223
+ return this.client.axiosInstance.get("/api/v1/payments/refund/records");
224
+ }
225
+ /**
226
+ * 获取对公账户信息
227
+ *
228
+ * @returns 对公账户信息
229
+ * @throws {PlolinkError} 当请求失败时抛出
230
+ *
231
+ * @example
232
+ * ```typescript
233
+ * const account = await billing.getCompanyAccount();
234
+ * console.log(`账户名: ${account.accountName}`);
235
+ * console.log(`账号: ${account.accountNumber}`);
236
+ * console.log(`开户行: ${account.bankName}`);
237
+ * ```
238
+ */
239
+ async getCompanyAccount() {
240
+ return this.client.axiosInstance.get("/api/v1/payments/company-account");
241
+ }
242
+ // ============ 跨团队查询接口 ============
243
+ /**
244
+ * 获取跨团队开票记录
245
+ *
246
+ * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的开票记录
247
+ *
248
+ * @param params - 查询参数
249
+ * @returns 分页结果(包含团队名称)
250
+ * @throws {PlolinkError} 当参数无效或请求失败时抛出
251
+ *
252
+ * @example
253
+ * ```typescript
254
+ * const result = await billing.getInvoiceRecordsCrossTeam({
255
+ * startDate: '2025-01-01T00:00:00.000Z',
256
+ * endDate: '2025-01-31T23:59:59.999Z',
257
+ * page: 1,
258
+ * pageSize: 20
259
+ * });
260
+ *
261
+ * console.log(`共查询到 ${result.total} 条记录`);
262
+ * result.list.forEach(record => {
263
+ * console.log(`团队: ${record.teamName}, 发票号: ${record.invoiceNumber}, 金额: ${record.amount}`);
264
+ * });
265
+ * ```
266
+ */
267
+ async getInvoiceRecordsCrossTeam(params) {
268
+ const { startDate, endDate, page = 1, pageSize = 20 } = params;
269
+ if (!startDate || !endDate) {
270
+ throw new PlolinkError("startDate and endDate are required", "MISSING_PARAMS");
271
+ }
272
+ if (pageSize > 100) {
273
+ throw new PlolinkError("pageSize must not exceed 100", "INVALID_PAGE_SIZE");
274
+ }
275
+ return this.client.axiosInstance.get("/api/v1/payments/invoice/records:cross-team", {
276
+ params: {
277
+ startDate,
278
+ endDate,
279
+ page,
280
+ pageSize
281
+ }
282
+ });
283
+ }
284
+ /**
285
+ * 获取跨团队充值记录
286
+ *
287
+ * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的充值记录
288
+ *
289
+ * @param params - 查询参数
290
+ * @returns 分页结果(包含团队名称)
291
+ * @throws {PlolinkError} 当参数无效或请求失败时抛出
292
+ *
293
+ * @example
294
+ * ```typescript
295
+ * const result = await billing.getRechargeRecordsCrossTeam({
296
+ * startDate: '2025-01-01T00:00:00.000Z',
297
+ * endDate: '2025-01-31T23:59:59.999Z',
298
+ * page: 1,
299
+ * pageSize: 20
300
+ * });
301
+ *
302
+ * console.log(`共查询到 ${result.total} 条记录`);
303
+ * result.list.forEach(record => {
304
+ * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 状态: ${record.status}`);
305
+ * });
306
+ * ```
307
+ */
308
+ async getRechargeRecordsCrossTeam(params) {
309
+ const { startDate, endDate, page = 1, pageSize = 20 } = params;
310
+ if (!startDate || !endDate) {
311
+ throw new PlolinkError("startDate and endDate are required", "MISSING_PARAMS");
312
+ }
313
+ if (pageSize > 100) {
314
+ throw new PlolinkError("pageSize must not exceed 100", "INVALID_PAGE_SIZE");
315
+ }
316
+ return this.client.axiosInstance.get("/api/v1/payments/recharge/records:cross-team", {
317
+ params: {
318
+ startDate,
319
+ endDate,
320
+ page,
321
+ pageSize
322
+ }
323
+ });
324
+ }
325
+ /**
326
+ * 获取跨团队消费记录
327
+ *
328
+ * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的消费记录
329
+ *
330
+ * @param params - 查询参数
331
+ * @returns 分页结果(包含团队名称)
332
+ * @throws {PlolinkError} 当参数无效或请求失败时抛出
333
+ *
334
+ * @example
335
+ * ```typescript
336
+ * const result = await billing.getConsumptionRecordsCrossTeam({
337
+ * startDate: '2025-01-01T00:00:00.000Z',
338
+ * endDate: '2025-01-31T23:59:59.999Z',
339
+ * page: 1,
340
+ * pageSize: 20
341
+ * });
342
+ *
343
+ * console.log(`共查询到 ${result.total} 条记录`);
344
+ * result.list.forEach(record => {
345
+ * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 用途: ${record.purpose}`);
346
+ * });
347
+ * ```
348
+ */
349
+ async getConsumptionRecordsCrossTeam(params) {
350
+ const { startDate, endDate, page = 1, pageSize = 20 } = params;
351
+ if (!startDate || !endDate) {
352
+ throw new PlolinkError("startDate and endDate are required", "MISSING_PARAMS");
353
+ }
354
+ if (pageSize > 100) {
355
+ throw new PlolinkError("pageSize must not exceed 100", "INVALID_PAGE_SIZE");
356
+ }
357
+ return this.client.axiosInstance.get("/api/v1/payments/consumption/records:cross-team", {
358
+ params: {
359
+ startDate,
360
+ endDate,
361
+ page,
362
+ pageSize
363
+ }
364
+ });
365
+ }
366
+ /**
367
+ * 获取跨团队退费记录
368
+ *
369
+ * 用于财务人员在多个团队中拥有财务权限时查询所有可管理团队的退费记录
370
+ *
371
+ * @param params - 查询参数
372
+ * @returns 分页结果(包含团队名称)
373
+ * @throws {PlolinkError} 当参数无效或请求失败时抛出
374
+ *
375
+ * @example
376
+ * ```typescript
377
+ * const result = await billing.getRefundRecordsCrossTeam({
378
+ * startDate: '2025-01-01T00:00:00.000Z',
379
+ * endDate: '2025-01-31T23:59:59.999Z',
380
+ * page: 1,
381
+ * pageSize: 20
382
+ * });
383
+ *
384
+ * console.log(`共查询到 ${result.total} 条记录`);
385
+ * result.list.forEach(record => {
386
+ * console.log(`团队: ${record.teamName}, 金额: ${record.amount}, 备注: ${record.remark}`);
387
+ * });
388
+ * ```
389
+ */
390
+ async getRefundRecordsCrossTeam(params) {
391
+ const { startDate, endDate, page = 1, pageSize = 20 } = params;
392
+ if (!startDate || !endDate) {
393
+ throw new PlolinkError("startDate and endDate are required", "MISSING_PARAMS");
394
+ }
395
+ if (pageSize > 100) {
396
+ throw new PlolinkError("pageSize must not exceed 100", "INVALID_PAGE_SIZE");
397
+ }
398
+ return this.client.axiosInstance.get("/api/v1/payments/refund/records:cross-team", {
399
+ params: {
400
+ startDate,
401
+ endDate,
402
+ page,
403
+ pageSize
404
+ }
405
+ });
406
+ }
407
+ };
408
+
409
+ export { Billing };
410
+ //# sourceMappingURL=index.js.map
411
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ // src/modules/chat/index.ts
4
+ var CHAT_MODULE_INFO = {
5
+ name: "chat",
6
+ version: "1.0.0",
7
+ status: "planned",
8
+ features: [
9
+ "conversation-create",
10
+ "message-send",
11
+ "history-query",
12
+ "content-moderation",
13
+ "conversation-management",
14
+ "material-association"
15
+ ]
16
+ };
17
+
18
+ exports.CHAT_MODULE_INFO = CHAT_MODULE_INFO;
19
+ //# sourceMappingURL=index.cjs.map
20
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/chat/index.ts"],"names":[],"mappings":";;;AA8DO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU;AAAA,IACR,qBAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,oBAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA;AAEJ","file":"index.cjs","sourcesContent":["/**\n * 对话能力模块\n * \n * @description\n * 提供基于已有信息的对话功能。\n * 使用素材创建对话,聊天历史数据存储在中台。\n * 包含内容审核检查,非流式输出。\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { Chat } from '@plolink/sdk/chat';\n * \n * const client = new PlolinkClient({ mode: 'apiKey', apiKey: 'xxx' });\n * const chat = new Chat(client);\n * \n * // 创建对话\n * const conversation = await chat.createConversation({\n * materialId: 'material-123'\n * });\n * ```\n * \n * @module chat\n */\n\n// 预留:将在后续实现 Chat 类\n\n/**\n * Chat 模块占位符\n * \n * @description\n * 此模块将在后续版本中实现以下功能:\n * - 创建对话会话\n * - 发送消息\n * - 获取对话历史\n * - 内容审核\n * - 对话管理\n * - 素材关联\n * \n * @example\n * ```typescript\n * // 未来使用方式(预览)\n * const chat = new Chat(client);\n * \n * // 创建对话\n * const conversation = await chat.createConversation({\n * materialId: 'material-123',\n * context: '这是关于产品的文档...'\n * });\n * \n * // 发送消息\n * const response = await chat.sendMessage({\n * conversationId: conversation.id,\n * message: '请介绍一下这个产品'\n * });\n * \n * console.log('AI response:', response.content);\n * \n * // 获取历史记录\n * const history = await chat.getHistory(conversation.id);\n * ```\n */\nexport const CHAT_MODULE_INFO = {\n name: 'chat',\n version: '1.0.0',\n status: 'planned',\n features: [\n 'conversation-create',\n 'message-send',\n 'history-query',\n 'content-moderation',\n 'conversation-management',\n 'material-association',\n ],\n} as const;\n\n// 导出类型(预留)\nexport type ChatModuleInfo = typeof CHAT_MODULE_INFO;\n\n"]}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * 对话能力模块
3
+ *
4
+ * @description
5
+ * 提供基于已有信息的对话功能。
6
+ * 使用素材创建对话,聊天历史数据存储在中台。
7
+ * 包含内容审核检查,非流式输出。
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { PlolinkClient } from '@plolink/sdk';
12
+ * import { Chat } from '@plolink/sdk/chat';
13
+ *
14
+ * const client = new PlolinkClient({ mode: 'apiKey', apiKey: 'xxx' });
15
+ * const chat = new Chat(client);
16
+ *
17
+ * // 创建对话
18
+ * const conversation = await chat.createConversation({
19
+ * materialId: 'material-123'
20
+ * });
21
+ * ```
22
+ *
23
+ * @module chat
24
+ */
25
+ /**
26
+ * Chat 模块占位符
27
+ *
28
+ * @description
29
+ * 此模块将在后续版本中实现以下功能:
30
+ * - 创建对话会话
31
+ * - 发送消息
32
+ * - 获取对话历史
33
+ * - 内容审核
34
+ * - 对话管理
35
+ * - 素材关联
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * // 未来使用方式(预览)
40
+ * const chat = new Chat(client);
41
+ *
42
+ * // 创建对话
43
+ * const conversation = await chat.createConversation({
44
+ * materialId: 'material-123',
45
+ * context: '这是关于产品的文档...'
46
+ * });
47
+ *
48
+ * // 发送消息
49
+ * const response = await chat.sendMessage({
50
+ * conversationId: conversation.id,
51
+ * message: '请介绍一下这个产品'
52
+ * });
53
+ *
54
+ * console.log('AI response:', response.content);
55
+ *
56
+ * // 获取历史记录
57
+ * const history = await chat.getHistory(conversation.id);
58
+ * ```
59
+ */
60
+ declare const CHAT_MODULE_INFO: {
61
+ readonly name: "chat";
62
+ readonly version: "1.0.0";
63
+ readonly status: "planned";
64
+ readonly features: readonly ["conversation-create", "message-send", "history-query", "content-moderation", "conversation-management", "material-association"];
65
+ };
66
+ type ChatModuleInfo = typeof CHAT_MODULE_INFO;
67
+
68
+ export { CHAT_MODULE_INFO, type ChatModuleInfo };
@@ -0,0 +1,68 @@
1
+ /**
2
+ * 对话能力模块
3
+ *
4
+ * @description
5
+ * 提供基于已有信息的对话功能。
6
+ * 使用素材创建对话,聊天历史数据存储在中台。
7
+ * 包含内容审核检查,非流式输出。
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { PlolinkClient } from '@plolink/sdk';
12
+ * import { Chat } from '@plolink/sdk/chat';
13
+ *
14
+ * const client = new PlolinkClient({ mode: 'apiKey', apiKey: 'xxx' });
15
+ * const chat = new Chat(client);
16
+ *
17
+ * // 创建对话
18
+ * const conversation = await chat.createConversation({
19
+ * materialId: 'material-123'
20
+ * });
21
+ * ```
22
+ *
23
+ * @module chat
24
+ */
25
+ /**
26
+ * Chat 模块占位符
27
+ *
28
+ * @description
29
+ * 此模块将在后续版本中实现以下功能:
30
+ * - 创建对话会话
31
+ * - 发送消息
32
+ * - 获取对话历史
33
+ * - 内容审核
34
+ * - 对话管理
35
+ * - 素材关联
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * // 未来使用方式(预览)
40
+ * const chat = new Chat(client);
41
+ *
42
+ * // 创建对话
43
+ * const conversation = await chat.createConversation({
44
+ * materialId: 'material-123',
45
+ * context: '这是关于产品的文档...'
46
+ * });
47
+ *
48
+ * // 发送消息
49
+ * const response = await chat.sendMessage({
50
+ * conversationId: conversation.id,
51
+ * message: '请介绍一下这个产品'
52
+ * });
53
+ *
54
+ * console.log('AI response:', response.content);
55
+ *
56
+ * // 获取历史记录
57
+ * const history = await chat.getHistory(conversation.id);
58
+ * ```
59
+ */
60
+ declare const CHAT_MODULE_INFO: {
61
+ readonly name: "chat";
62
+ readonly version: "1.0.0";
63
+ readonly status: "planned";
64
+ readonly features: readonly ["conversation-create", "message-send", "history-query", "content-moderation", "conversation-management", "material-association"];
65
+ };
66
+ type ChatModuleInfo = typeof CHAT_MODULE_INFO;
67
+
68
+ export { CHAT_MODULE_INFO, type ChatModuleInfo };
@@ -0,0 +1,18 @@
1
+ // src/modules/chat/index.ts
2
+ var CHAT_MODULE_INFO = {
3
+ name: "chat",
4
+ version: "1.0.0",
5
+ status: "planned",
6
+ features: [
7
+ "conversation-create",
8
+ "message-send",
9
+ "history-query",
10
+ "content-moderation",
11
+ "conversation-management",
12
+ "material-association"
13
+ ]
14
+ };
15
+
16
+ export { CHAT_MODULE_INFO };
17
+ //# sourceMappingURL=index.js.map
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/chat/index.ts"],"names":[],"mappings":";AA8DO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU;AAAA,IACR,qBAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,oBAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * 对话能力模块\n * \n * @description\n * 提供基于已有信息的对话功能。\n * 使用素材创建对话,聊天历史数据存储在中台。\n * 包含内容审核检查,非流式输出。\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { Chat } from '@plolink/sdk/chat';\n * \n * const client = new PlolinkClient({ mode: 'apiKey', apiKey: 'xxx' });\n * const chat = new Chat(client);\n * \n * // 创建对话\n * const conversation = await chat.createConversation({\n * materialId: 'material-123'\n * });\n * ```\n * \n * @module chat\n */\n\n// 预留:将在后续实现 Chat 类\n\n/**\n * Chat 模块占位符\n * \n * @description\n * 此模块将在后续版本中实现以下功能:\n * - 创建对话会话\n * - 发送消息\n * - 获取对话历史\n * - 内容审核\n * - 对话管理\n * - 素材关联\n * \n * @example\n * ```typescript\n * // 未来使用方式(预览)\n * const chat = new Chat(client);\n * \n * // 创建对话\n * const conversation = await chat.createConversation({\n * materialId: 'material-123',\n * context: '这是关于产品的文档...'\n * });\n * \n * // 发送消息\n * const response = await chat.sendMessage({\n * conversationId: conversation.id,\n * message: '请介绍一下这个产品'\n * });\n * \n * console.log('AI response:', response.content);\n * \n * // 获取历史记录\n * const history = await chat.getHistory(conversation.id);\n * ```\n */\nexport const CHAT_MODULE_INFO = {\n name: 'chat',\n version: '1.0.0',\n status: 'planned',\n features: [\n 'conversation-create',\n 'message-send',\n 'history-query',\n 'content-moderation',\n 'conversation-management',\n 'material-association',\n ],\n} as const;\n\n// 导出类型(预留)\nexport type ChatModuleInfo = typeof CHAT_MODULE_INFO;\n\n"]}
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ // src/modules/psych/index.ts
4
+ var PSYCH_MODULE_INFO = {
5
+ name: "psych",
6
+ version: "1.0.0",
7
+ status: "planned",
8
+ features: [
9
+ "question-sampling",
10
+ "assessment-create",
11
+ "answer-submit",
12
+ "result-generate",
13
+ "duplicate-prevention",
14
+ "history-query"
15
+ ]
16
+ };
17
+
18
+ exports.PSYCH_MODULE_INFO = PSYCH_MODULE_INFO;
19
+ //# sourceMappingURL=index.cjs.map
20
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/psych/index.ts"],"names":[],"mappings":";;;AA+DO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,OAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU;AAAA,IACR,mBAAA;AAAA,IACA,mBAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA;AAEJ","file":"index.cjs","sourcesContent":["/**\n * 心理测评模块\n * \n * @description\n * 提供心理题库抽题、评测创建、答题提交、结果生成等功能。\n * 随机逻辑在后端处理,前端获取的题目已经打乱。\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { Psychology } from '@plolink/sdk/psych';\n * \n * const client = new PlolinkClient({ mode: 'apiKey', apiKey: 'xxx' });\n * const psych = new Psychology(client);\n * \n * // 抽题并创建评测\n * const assessment = await psych.createAssessment({\n * type: 'big-five',\n * count: 50\n * });\n * ```\n * \n * @module psych\n */\n\n// 预留:将在后续实现 Psychology 类\n\n/**\n * Psychology 模块占位符\n * \n * @description\n * 此模块将在后续版本中实现以下功能:\n * - 题库抽题(后端随机)\n * - 创建心理评测记录\n * - 提交答题结果\n * - 生成评测报告\n * - 防止重复提交\n * - 获取历史评测记录\n * \n * @example\n * ```typescript\n * // 未来使用方式(预览)\n * const psych = new Psychology(client);\n * \n * // 创建评测(自动抽题)\n * const assessment = await psych.createAssessment({\n * type: 'big-five',\n * count: 50\n * });\n * \n * // 提交答案\n * const result = await psych.submitAnswers({\n * assessmentId: assessment.id,\n * answers: [\n * { questionId: 1, answer: 'A' },\n * { questionId: 2, answer: 'B' }\n * ]\n * });\n * \n * // 获取评测结果\n * console.log('Assessment result:', result);\n * ```\n */\nexport const PSYCH_MODULE_INFO = {\n name: 'psych',\n version: '1.0.0',\n status: 'planned',\n features: [\n 'question-sampling',\n 'assessment-create',\n 'answer-submit',\n 'result-generate',\n 'duplicate-prevention',\n 'history-query',\n ],\n} as const;\n\n// 导出类型(预留)\nexport type PsychModuleInfo = typeof PSYCH_MODULE_INFO;\n\n"]}