@plolink/sdk 2.0.1 → 2.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.
@@ -0,0 +1,311 @@
1
+ import { P as PlolinkClient } from '../../client-CwNikk7i.js';
2
+ import '../../core-77EbLgbp.js';
3
+ import 'axios';
4
+
5
+ /**
6
+ * 发票申请模块类型
7
+ */
8
+ /**
9
+ * 申请单状态
10
+ */
11
+ type InvoiceApplicationStatus = 'PENDING' | 'APPROVED' | 'REJECTED';
12
+ /**
13
+ * 创建开票申请参数
14
+ */
15
+ interface CreateInvoiceApplicationParams {
16
+ /** 团队列表,每个团队包含团队ID和申请金额 */
17
+ teams: Array<{
18
+ /** 团队ID */
19
+ teamId: string;
20
+ /** 申请金额 */
21
+ amount: number;
22
+ }>;
23
+ /** 发票类型 */
24
+ invoiceType: string;
25
+ /** 发票抬头 */
26
+ invoiceTitle: string;
27
+ /** 税号 */
28
+ taxNumber: string;
29
+ /** 业务模块(可选) */
30
+ businessModule?: string;
31
+ /** 业务编码(可选) */
32
+ businessCode?: string;
33
+ /** 业务ID(可选) */
34
+ businessId?: string;
35
+ /** 备注(可选) */
36
+ remark?: string;
37
+ }
38
+ /**
39
+ * 创建开票申请响应
40
+ */
41
+ interface CreateInvoiceApplicationResult {
42
+ /** 申请单ID */
43
+ id: string;
44
+ /** 创建时间 */
45
+ createdAt: Date;
46
+ }
47
+ /**
48
+ * 申请单列表查询参数
49
+ */
50
+ interface ListInvoiceApplicationsParams {
51
+ /** 页码,从1开始,默认1 */
52
+ page?: number;
53
+ /** 每页条数,默认20 */
54
+ pageSize?: number;
55
+ /** 申请单状态筛选 */
56
+ status?: InvoiceApplicationStatus;
57
+ }
58
+ /**
59
+ * 申请单列表项
60
+ */
61
+ interface InvoiceApplicationListItem {
62
+ /** 申请单ID */
63
+ id: string;
64
+ /** 总金额 */
65
+ totalAmount: string;
66
+ /** 发票抬头 */
67
+ invoiceTitle: string;
68
+ /** 申请单状态 */
69
+ status: InvoiceApplicationStatus;
70
+ /** 创建时间 */
71
+ createdAt: Date;
72
+ /** 涉及团队数量 */
73
+ teamCount: number;
74
+ /** 业务模块 */
75
+ businessModule: string;
76
+ /** 业务编码 */
77
+ businessCode: string;
78
+ /** 业务ID */
79
+ businessId: string;
80
+ }
81
+ /**
82
+ * 分页申请单列表结果
83
+ */
84
+ interface PaginatedInvoiceApplications {
85
+ /** 申请单列表 */
86
+ list: InvoiceApplicationListItem[];
87
+ /** 总条数 */
88
+ total: number;
89
+ /** 当前页码 */
90
+ page: number;
91
+ /** 每页条数 */
92
+ pageSize: number;
93
+ }
94
+ /**
95
+ * 申请单详情中的团队信息
96
+ */
97
+ interface InvoiceApplicationTeamDetail {
98
+ /** 团队ID */
99
+ teamId: string;
100
+ /** 团队名称 */
101
+ teamName: string;
102
+ /** 申请金额 */
103
+ amount: string;
104
+ }
105
+ /**
106
+ * 申请单详情
107
+ */
108
+ interface InvoiceApplicationDetail {
109
+ /** 申请单ID */
110
+ id: string;
111
+ /** 申请单状态 */
112
+ status: InvoiceApplicationStatus;
113
+ /** 发票类型 */
114
+ invoiceType: string;
115
+ /** 发票抬头 */
116
+ invoiceTitle: string;
117
+ /** 税号 */
118
+ taxNumber: string;
119
+ /** 总金额 */
120
+ totalAmount: string;
121
+ /** 业务模块 */
122
+ businessModule: string;
123
+ /** 业务编码 */
124
+ businessCode: string;
125
+ /** 业务ID */
126
+ businessId: string;
127
+ /** 备注 */
128
+ remark: string;
129
+ /** 发票号(审核通过后填写) */
130
+ invoiceNumber: string;
131
+ /** 发票文件Key(审核通过后填写) */
132
+ fileKey: string;
133
+ /** 审核人ID */
134
+ reviewerId: string;
135
+ /** 审核时间 */
136
+ reviewedAt: Date | null;
137
+ /** 创建时间 */
138
+ createdAt: Date;
139
+ /** 团队详情列表 */
140
+ details: InvoiceApplicationTeamDetail[];
141
+ }
142
+ /**
143
+ * 团队财务选项
144
+ */
145
+ interface TeamFinancialOption {
146
+ /** 团队ID */
147
+ teamId: string;
148
+ /** 团队名称 */
149
+ teamName: string;
150
+ /** 可开票金额 */
151
+ invoiceableAmount: string;
152
+ /** 消费金额 */
153
+ consumptionAmount: string;
154
+ /** 已开票金额 */
155
+ invoicedAmount: string;
156
+ /** 余额 */
157
+ balance: string;
158
+ }
159
+
160
+ /**
161
+ * 发票申请模块
162
+ *
163
+ * @description
164
+ * 提供跨团队发票申请相关功能,包括:
165
+ * - 获取有申请开票权限的团队财务选项
166
+ * - 创建跨团队开票申请
167
+ * - 分页查询申请单列表
168
+ * - 查询申请单详情
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * import { PlolinkClient } from '@plolink/sdk';
173
+ * import { InvoiceApplication } from '@plolink/sdk/invoice-application';
174
+ *
175
+ * const client = new PlolinkClient({
176
+ * token: 'sk-your-api-key'
177
+ * });
178
+ *
179
+ * const invoiceApp = new InvoiceApplication(client);
180
+ *
181
+ * // 获取可申请开票的团队列表
182
+ * const teams = await invoiceApp.getTeamFinancialOptions();
183
+ *
184
+ * // 创建开票申请
185
+ * const result = await invoiceApp.create({
186
+ * teams: [{ teamId: 'team-1', amount: 1000 }],
187
+ * invoiceType: 'VAT_SPECIAL',
188
+ * invoiceTitle: 'Company Name',
189
+ * taxNumber: '91110000XXX'
190
+ * });
191
+ *
192
+ * // 查询申请单列表
193
+ * const list = await invoiceApp.list({ page: 1, pageSize: 20 });
194
+ *
195
+ * // 查询申请单详情
196
+ * const detail = await invoiceApp.getById(result.id);
197
+ * ```
198
+ *
199
+ * @module invoice-application
200
+ */
201
+
202
+ /**
203
+ * 发票申请模块
204
+ */
205
+ declare class InvoiceApplication {
206
+ private client;
207
+ constructor(client: PlolinkClient);
208
+ /**
209
+ * 获取团队财务选项
210
+ *
211
+ * @description
212
+ * 返回当前用户有申请开票权限的团队列表及其财务信息。
213
+ * 包含每个团队的可开票金额、消费金额、已开票金额和余额。
214
+ *
215
+ * @returns 团队财务选项列表
216
+ * @throws {PlolinkError} 当请求失败时抛出
217
+ *
218
+ * @example
219
+ * ```typescript
220
+ * const teams = await invoiceApp.getTeamFinancialOptions();
221
+ * teams.forEach(team => {
222
+ * console.log(`${team.teamName}: 可开票 ${team.invoiceableAmount}`);
223
+ * });
224
+ * ```
225
+ */
226
+ getTeamFinancialOptions(): Promise<TeamFinancialOption[]>;
227
+ /**
228
+ * 创建开票申请
229
+ *
230
+ * @description
231
+ * 创建跨团队开票申请。支持同时为多个团队申请开票,
232
+ * 申请单将提交给财务审核。
233
+ *
234
+ * @param params - 开票申请参数
235
+ * @returns 创建结果,包含申请单ID和创建时间
236
+ * @throws {PlolinkError} 当参数无效或创建失败时抛出
237
+ *
238
+ * @example
239
+ * ```typescript
240
+ * // 单团队申请
241
+ * const result = await invoiceApp.create({
242
+ * teams: [{ teamId: 'team-1', amount: 1000 }],
243
+ * invoiceType: 'VAT_SPECIAL',
244
+ * invoiceTitle: 'Test Company Ltd',
245
+ * taxNumber: '91110000XXX',
246
+ * remark: 'January invoice'
247
+ * });
248
+ * console.log(`申请单ID: ${result.id}`);
249
+ *
250
+ * // 跨团队申请
251
+ * const result = await invoiceApp.create({
252
+ * teams: [
253
+ * { teamId: 'team-1', amount: 500 },
254
+ * { teamId: 'team-2', amount: 300 }
255
+ * ],
256
+ * invoiceType: 'VAT_NORMAL',
257
+ * invoiceTitle: 'Test Company Ltd',
258
+ * taxNumber: '91110000XXX'
259
+ * });
260
+ * ```
261
+ */
262
+ create(params: CreateInvoiceApplicationParams): Promise<CreateInvoiceApplicationResult>;
263
+ /**
264
+ * 分页查询申请单列表
265
+ *
266
+ * @description
267
+ * 分页查询当前用户提交的发票申请单列表,支持按状态筛选。
268
+ *
269
+ * @param params - 查询参数
270
+ * @returns 分页申请单列表
271
+ * @throws {PlolinkError} 当请求失败时抛出
272
+ *
273
+ * @example
274
+ * ```typescript
275
+ * // 查询所有申请单
276
+ * const result = await invoiceApp.list({ page: 1, pageSize: 20 });
277
+ * console.log(`共 ${result.total} 条申请单`);
278
+ *
279
+ * // 按状态筛选
280
+ * const pending = await invoiceApp.list({ status: 'PENDING' });
281
+ * const approved = await invoiceApp.list({ status: 'APPROVED' });
282
+ * ```
283
+ */
284
+ list(params?: ListInvoiceApplicationsParams): Promise<PaginatedInvoiceApplications>;
285
+ /**
286
+ * 查询申请单详情
287
+ *
288
+ * @description
289
+ * 根据申请单ID查询详细信息,包括各团队的申请金额和审核状态。
290
+ *
291
+ * @param id - 申请单ID
292
+ * @returns 申请单详情
293
+ * @throws {PlolinkError} 当申请单不存在或请求失败时抛出
294
+ *
295
+ * @example
296
+ * ```typescript
297
+ * const detail = await invoiceApp.getById('application-id');
298
+ * console.log(`状态: ${detail.status}`);
299
+ * console.log(`总金额: ${detail.totalAmount}`);
300
+ * console.log(`发票号: ${detail.invoiceNumber || '未填写'}`);
301
+ *
302
+ * // 查看各团队详情
303
+ * detail.details.forEach(d => {
304
+ * console.log(`${d.teamName}: ${d.amount}`);
305
+ * });
306
+ * ```
307
+ */
308
+ getById(id: string): Promise<InvoiceApplicationDetail>;
309
+ }
310
+
311
+ export { type CreateInvoiceApplicationParams, type CreateInvoiceApplicationResult, InvoiceApplication, type InvoiceApplicationDetail, type InvoiceApplicationListItem, type InvoiceApplicationStatus, type ListInvoiceApplicationsParams, type PaginatedInvoiceApplications, type TeamFinancialOption };
@@ -0,0 +1,162 @@
1
+ import { PlolinkError } from '../../chunk-MD4O7FWT.js';
2
+
3
+ // src/modules/invoice-application/index.ts
4
+ var InvoiceApplication = class {
5
+ constructor(client) {
6
+ this.client = client;
7
+ }
8
+ /**
9
+ * 获取团队财务选项
10
+ *
11
+ * @description
12
+ * 返回当前用户有申请开票权限的团队列表及其财务信息。
13
+ * 包含每个团队的可开票金额、消费金额、已开票金额和余额。
14
+ *
15
+ * @returns 团队财务选项列表
16
+ * @throws {PlolinkError} 当请求失败时抛出
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const teams = await invoiceApp.getTeamFinancialOptions();
21
+ * teams.forEach(team => {
22
+ * console.log(`${team.teamName}: 可开票 ${team.invoiceableAmount}`);
23
+ * });
24
+ * ```
25
+ */
26
+ async getTeamFinancialOptions() {
27
+ return this.client.axiosInstance.get("/api/v1/payments/teams/financial-options");
28
+ }
29
+ /**
30
+ * 创建开票申请
31
+ *
32
+ * @description
33
+ * 创建跨团队开票申请。支持同时为多个团队申请开票,
34
+ * 申请单将提交给财务审核。
35
+ *
36
+ * @param params - 开票申请参数
37
+ * @returns 创建结果,包含申请单ID和创建时间
38
+ * @throws {PlolinkError} 当参数无效或创建失败时抛出
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * // 单团队申请
43
+ * const result = await invoiceApp.create({
44
+ * teams: [{ teamId: 'team-1', amount: 1000 }],
45
+ * invoiceType: 'VAT_SPECIAL',
46
+ * invoiceTitle: 'Test Company Ltd',
47
+ * taxNumber: '91110000XXX',
48
+ * remark: 'January invoice'
49
+ * });
50
+ * console.log(`申请单ID: ${result.id}`);
51
+ *
52
+ * // 跨团队申请
53
+ * const result = await invoiceApp.create({
54
+ * teams: [
55
+ * { teamId: 'team-1', amount: 500 },
56
+ * { teamId: 'team-2', amount: 300 }
57
+ * ],
58
+ * invoiceType: 'VAT_NORMAL',
59
+ * invoiceTitle: 'Test Company Ltd',
60
+ * taxNumber: '91110000XXX'
61
+ * });
62
+ * ```
63
+ */
64
+ async create(params) {
65
+ const { teams, invoiceType, invoiceTitle, taxNumber, businessModule, businessCode, businessId, remark } = params;
66
+ if (!teams || teams.length === 0) {
67
+ throw new PlolinkError("teams is required and must not be empty", "INVALID_PARAMS");
68
+ }
69
+ for (const team of teams) {
70
+ if (!team.teamId) {
71
+ throw new PlolinkError("teamId is required for each team", "INVALID_PARAMS");
72
+ }
73
+ if (!team.amount || team.amount <= 0) {
74
+ throw new PlolinkError("amount must be greater than 0 for each team", "INVALID_PARAMS");
75
+ }
76
+ }
77
+ if (!invoiceType) {
78
+ throw new PlolinkError("invoiceType is required", "INVALID_PARAMS");
79
+ }
80
+ if (!invoiceTitle) {
81
+ throw new PlolinkError("invoiceTitle is required", "INVALID_PARAMS");
82
+ }
83
+ if (!taxNumber) {
84
+ throw new PlolinkError("taxNumber is required", "INVALID_PARAMS");
85
+ }
86
+ this.client.logger.info("Creating invoice application", {
87
+ teamCount: teams.length,
88
+ totalAmount: teams.reduce((sum, t) => sum + t.amount, 0),
89
+ invoiceType
90
+ });
91
+ return this.client.axiosInstance.post("/api/v1/payments/invoice/applications", {
92
+ teams,
93
+ invoiceType,
94
+ invoiceTitle,
95
+ taxNumber,
96
+ businessModule,
97
+ businessCode,
98
+ businessId,
99
+ remark
100
+ });
101
+ }
102
+ /**
103
+ * 分页查询申请单列表
104
+ *
105
+ * @description
106
+ * 分页查询当前用户提交的发票申请单列表,支持按状态筛选。
107
+ *
108
+ * @param params - 查询参数
109
+ * @returns 分页申请单列表
110
+ * @throws {PlolinkError} 当请求失败时抛出
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * // 查询所有申请单
115
+ * const result = await invoiceApp.list({ page: 1, pageSize: 20 });
116
+ * console.log(`共 ${result.total} 条申请单`);
117
+ *
118
+ * // 按状态筛选
119
+ * const pending = await invoiceApp.list({ status: 'PENDING' });
120
+ * const approved = await invoiceApp.list({ status: 'APPROVED' });
121
+ * ```
122
+ */
123
+ async list(params = {}) {
124
+ const { page = 1, pageSize = 20, status } = params;
125
+ return this.client.axiosInstance.get("/api/v1/payments/invoice/applications", {
126
+ params: { page, pageSize, status }
127
+ });
128
+ }
129
+ /**
130
+ * 查询申请单详情
131
+ *
132
+ * @description
133
+ * 根据申请单ID查询详细信息,包括各团队的申请金额和审核状态。
134
+ *
135
+ * @param id - 申请单ID
136
+ * @returns 申请单详情
137
+ * @throws {PlolinkError} 当申请单不存在或请求失败时抛出
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * const detail = await invoiceApp.getById('application-id');
142
+ * console.log(`状态: ${detail.status}`);
143
+ * console.log(`总金额: ${detail.totalAmount}`);
144
+ * console.log(`发票号: ${detail.invoiceNumber || '未填写'}`);
145
+ *
146
+ * // 查看各团队详情
147
+ * detail.details.forEach(d => {
148
+ * console.log(`${d.teamName}: ${d.amount}`);
149
+ * });
150
+ * ```
151
+ */
152
+ async getById(id) {
153
+ if (!id) {
154
+ throw new PlolinkError("id is required", "INVALID_PARAMS");
155
+ }
156
+ return this.client.axiosInstance.get(`/api/v1/payments/invoice/applications/${id}`);
157
+ }
158
+ };
159
+
160
+ export { InvoiceApplication };
161
+ //# sourceMappingURL=index.js.map
162
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/invoice-application/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 发票申请模块\n *\n * @description\n * 提供跨团队发票申请相关功能,包括:\n * - 获取有申请开票权限的团队财务选项\n * - 创建跨团队开票申请\n * - 分页查询申请单列表\n * - 查询申请单详情\n *\n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { InvoiceApplication } from '@plolink/sdk/invoice-application';\n *\n * const client = new PlolinkClient({\n * token: 'sk-your-api-key'\n * });\n *\n * const invoiceApp = new InvoiceApplication(client);\n *\n * // 获取可申请开票的团队列表\n * const teams = await invoiceApp.getTeamFinancialOptions();\n *\n * // 创建开票申请\n * const result = await invoiceApp.create({\n * teams: [{ teamId: 'team-1', amount: 1000 }],\n * invoiceType: 'VAT_SPECIAL',\n * invoiceTitle: 'Company Name',\n * taxNumber: '91110000XXX'\n * });\n *\n * // 查询申请单列表\n * const list = await invoiceApp.list({ page: 1, pageSize: 20 });\n *\n * // 查询申请单详情\n * const detail = await invoiceApp.getById(result.id);\n * ```\n *\n * @module invoice-application\n */\n\nimport { PlolinkClient } from '../../core/client';\nimport { PlolinkError } from '../../core/error';\nimport type {\n CreateInvoiceApplicationParams,\n CreateInvoiceApplicationResult,\n ListInvoiceApplicationsParams,\n PaginatedInvoiceApplications,\n InvoiceApplicationDetail,\n TeamFinancialOption,\n} from '../../types/invoice-application';\n\nexport type {\n InvoiceApplicationStatus,\n CreateInvoiceApplicationParams,\n CreateInvoiceApplicationResult,\n ListInvoiceApplicationsParams,\n InvoiceApplicationListItem,\n PaginatedInvoiceApplications,\n InvoiceApplicationDetail,\n TeamFinancialOption,\n} from '../../types/invoice-application';\n\n/**\n * 发票申请模块\n */\nexport class InvoiceApplication {\n private client: PlolinkClient;\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 获取团队财务选项\n *\n * @description\n * 返回当前用户有申请开票权限的团队列表及其财务信息。\n * 包含每个团队的可开票金额、消费金额、已开票金额和余额。\n *\n * @returns 团队财务选项列表\n * @throws {PlolinkError} 当请求失败时抛出\n *\n * @example\n * ```typescript\n * const teams = await invoiceApp.getTeamFinancialOptions();\n * teams.forEach(team => {\n * console.log(`${team.teamName}: 可开票 ${team.invoiceableAmount}`);\n * });\n * ```\n */\n public async getTeamFinancialOptions(): Promise<TeamFinancialOption[]> {\n return this.client.axiosInstance.get('/api/v1/payments/teams/financial-options');\n }\n\n /**\n * 创建开票申请\n *\n * @description\n * 创建跨团队开票申请。支持同时为多个团队申请开票,\n * 申请单将提交给财务审核。\n *\n * @param params - 开票申请参数\n * @returns 创建结果,包含申请单ID和创建时间\n * @throws {PlolinkError} 当参数无效或创建失败时抛出\n *\n * @example\n * ```typescript\n * // 单团队申请\n * const result = await invoiceApp.create({\n * teams: [{ teamId: 'team-1', amount: 1000 }],\n * invoiceType: 'VAT_SPECIAL',\n * invoiceTitle: 'Test Company Ltd',\n * taxNumber: '91110000XXX',\n * remark: 'January invoice'\n * });\n * console.log(`申请单ID: ${result.id}`);\n *\n * // 跨团队申请\n * const result = await invoiceApp.create({\n * teams: [\n * { teamId: 'team-1', amount: 500 },\n * { teamId: 'team-2', amount: 300 }\n * ],\n * invoiceType: 'VAT_NORMAL',\n * invoiceTitle: 'Test Company Ltd',\n * taxNumber: '91110000XXX'\n * });\n * ```\n */\n public async create(\n params: CreateInvoiceApplicationParams,\n ): Promise<CreateInvoiceApplicationResult> {\n const { teams, invoiceType, invoiceTitle, taxNumber, businessModule, businessCode, businessId, remark } = params;\n\n // 参数验证\n if (!teams || teams.length === 0) {\n throw new PlolinkError('teams is required and must not be empty', 'INVALID_PARAMS');\n }\n\n for (const team of teams) {\n if (!team.teamId) {\n throw new PlolinkError('teamId is required for each team', 'INVALID_PARAMS');\n }\n if (!team.amount || team.amount <= 0) {\n throw new PlolinkError('amount must be greater than 0 for each team', 'INVALID_PARAMS');\n }\n }\n\n if (!invoiceType) {\n throw new PlolinkError('invoiceType is required', 'INVALID_PARAMS');\n }\n\n if (!invoiceTitle) {\n throw new PlolinkError('invoiceTitle is required', 'INVALID_PARAMS');\n }\n\n if (!taxNumber) {\n throw new PlolinkError('taxNumber is required', 'INVALID_PARAMS');\n }\n\n this.client.logger.info('Creating invoice application', {\n teamCount: teams.length,\n totalAmount: teams.reduce((sum, t) => sum + t.amount, 0),\n invoiceType,\n });\n\n return this.client.axiosInstance.post('/api/v1/payments/invoice/applications', {\n teams,\n invoiceType,\n invoiceTitle,\n taxNumber,\n businessModule,\n businessCode,\n businessId,\n remark,\n });\n }\n\n /**\n * 分页查询申请单列表\n *\n * @description\n * 分页查询当前用户提交的发票申请单列表,支持按状态筛选。\n *\n * @param params - 查询参数\n * @returns 分页申请单列表\n * @throws {PlolinkError} 当请求失败时抛出\n *\n * @example\n * ```typescript\n * // 查询所有申请单\n * const result = await invoiceApp.list({ page: 1, pageSize: 20 });\n * console.log(`共 ${result.total} 条申请单`);\n *\n * // 按状态筛选\n * const pending = await invoiceApp.list({ status: 'PENDING' });\n * const approved = await invoiceApp.list({ status: 'APPROVED' });\n * ```\n */\n public async list(\n params: ListInvoiceApplicationsParams = {},\n ): Promise<PaginatedInvoiceApplications> {\n const { page = 1, pageSize = 20, status } = params;\n\n return this.client.axiosInstance.get('/api/v1/payments/invoice/applications', {\n params: { page, pageSize, status },\n });\n }\n\n /**\n * 查询申请单详情\n *\n * @description\n * 根据申请单ID查询详细信息,包括各团队的申请金额和审核状态。\n *\n * @param id - 申请单ID\n * @returns 申请单详情\n * @throws {PlolinkError} 当申请单不存在或请求失败时抛出\n *\n * @example\n * ```typescript\n * const detail = await invoiceApp.getById('application-id');\n * console.log(`状态: ${detail.status}`);\n * console.log(`总金额: ${detail.totalAmount}`);\n * console.log(`发票号: ${detail.invoiceNumber || '未填写'}`);\n *\n * // 查看各团队详情\n * detail.details.forEach(d => {\n * console.log(`${d.teamName}: ${d.amount}`);\n * });\n * ```\n */\n public async getById(id: string): Promise<InvoiceApplicationDetail> {\n if (!id) {\n throw new PlolinkError('id is required', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.get(`/api/v1/payments/invoice/applications/${id}`);\n }\n}\n"]}
@@ -39,6 +39,7 @@ var PsychologyTest = class {
39
39
  async createTestSession(params) {
40
40
  this.client.logger.info("Creating psychology test session", {
41
41
  groupCodes: params.groupCodes,
42
+ tags: params.tags,
42
43
  businessModule: params.businessModule,
43
44
  businessCode: params.businessCode,
44
45
  needAnalysis: params.needAnalysis
@@ -143,6 +144,7 @@ var PsychologyTest = class {
143
144
  this.client.logger.warn("Using deprecated initiate() method. Please use createTestSession() + getSessionQuestions() instead.");
144
145
  this.client.logger.info("Initiating psychology test (deprecated)", {
145
146
  groupCodes: params.groupCodes,
147
+ tags: params.tags,
146
148
  businessModule: params.businessModule,
147
149
  businessCode: params.businessCode,
148
150
  needAnalysis: params.needAnalysis
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/modules/psychology-test/index.ts"],"names":["PlolinkError"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 心理评测模块\n * \n * @description\n * 提供心理评测相关功能,包括:\n * - 发起心理评测会话\n * - 提交心理评测答题\n * - 获取评测详情和结果\n * - 获取答题记录\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * \n * const client = new PlolinkClient({\n * token: 'sk-your-api-key'\n * });\n * \n * // 发起心理评测\n * const initResult = await client.psychologyTest.initiate({\n * groupCodes: ['family_parenting', 'disc'],\n * businessModule: 'talent_assessment',\n * businessCode: 'job_match',\n * businessId: 'clxxxx123456',\n * needAnalysis: true,\n * analysisPrompt: '请结合家庭养育方式和DISC行为模式,分析候选人的性格特点。'\n * });\n * console.log(`评测会话已创建: ${initResult.sessionId}`);\n * console.log(`共 ${initResult.totalCount} 道题目`);\n * \n * // 用户答题...\n * const answers = initResult.questions.map(q => ({\n * groupCode: q.groupCode,\n * bankId: q.bankId,\n * questionId: q.questionId,\n * questionCode: q.questionCode,\n * answer: getUserAnswer(q), // 获取用户答案\n * timeSpent: getTimeSpent(q) // 获取答题时间\n * }));\n * \n * // 提交心理评测\n * const submitResult = await client.psychologyTest.submit({\n * sessionId: initResult.sessionId,\n * answers,\n * duration: 480000\n * });\n * console.log('得分描述:', submitResult.scoreDescription);\n * \n * // 查询评测详情\n * const detail = await client.psychologyTest.getDetail(initResult.sessionId);\n * if (detail.analysisStatus === 'COMPLETED') {\n * console.log('AI分析结果:', detail.analysisResult);\n * }\n * ```\n * \n * @module psychology-test\n */\n\nimport { PlolinkClient } from '../../core/client';\nimport { PlolinkError } from '../../core/error';\nimport type {\n CreatePsychologyTestSessionParams,\n CreatePsychologyTestSessionResponse,\n GetSessionQuestionsResponse,\n InitiatePsychologyTestParams,\n InitiatePsychologyTestResponse,\n SubmitPsychologyTestParams,\n SubmitPsychologyTestResponse,\n PsychologyTestDetail,\n PsychologyTestAnswerDetail,\n ListPsychologyTestSessionsParams,\n ListPsychologyTestSessionsResponse,\n PsychologyBankGroupSummary,\n} from '../../types/psychology-test';\n\nexport type {\n PsychologyTestStatus,\n PsychologyAnalysisStatus,\n QuestionType,\n QuestionDependency,\n QuestionOption,\n QuestionMetadata,\n QuestionInfo,\n GroupSummary,\n CreatePsychologyTestSessionParams,\n CreatePsychologyTestSessionResponse,\n GetSessionQuestionsResponse,\n InitiatePsychologyTestParams,\n InitiatePsychologyTestResponse,\n AnswerRecord,\n SubmitPsychologyTestParams,\n TestCalculationResult,\n SubmitPsychologyTestResponse,\n PsychologyTestAnswerDetail,\n PsychologyTestDetail,\n PsychologyTestWebhookData,\n ListPsychologyTestSessionsParams,\n ListPsychologyTestSessionsResponse,\n PsychologyBankGroupSummary,\n} from '../../types/psychology-test';\n\n/**\n * 心理评测模块\n */\nexport class PsychologyTest {\n private client: PlolinkClient;\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 创建心理评测会话\n * \n * @description\n * 创建心理评测会话记录(不返回题目)。\n * 创建后需要调用 getSessionQuestions() 获取题目列表。\n * \n * @param params - 创建会话参数\n * @returns 会话信息,包含会话ID\n * @throws {PlolinkError} 当参数验证失败或创建失败时抛出\n * \n * @example\n * ```typescript\n * // 1. 创建会话\n * const { sessionId } = await client.psychologyTest.createTestSession({\n * groupCodes: ['family_parenting', 'disc'],\n * businessModule: 'talent_assessment',\n * businessCode: 'job_match',\n * businessId: 'clxxxx123456',\n * needAnalysis: true,\n * analysisPrompt: '请结合家庭养育方式和DISC行为模式,分析候选人的性格特点。'\n * });\n * \n * console.log(`评测会话已创建: ${sessionId}`);\n * \n * // 2. 获取题目\n * const questions = await client.psychologyTest.getSessionQuestions(sessionId);\n * ```\n */\n public async createTestSession(params: CreatePsychologyTestSessionParams): Promise<CreatePsychologyTestSessionResponse> {\n this.client.logger.info('Creating psychology test session', {\n groupCodes: params.groupCodes,\n businessModule: params.businessModule,\n businessCode: params.businessCode,\n needAnalysis: params.needAnalysis,\n });\n\n // 参数校验\n if (!params.groupCodes || params.groupCodes.length === 0) {\n throw new PlolinkError(\n 'groupCodes is required and cannot be empty',\n 'VALIDATION_ERROR'\n );\n }\n\n if (!params.businessModule || !params.businessCode || !params.businessId) {\n throw new PlolinkError(\n 'businessModule, businessCode, and businessId are required',\n 'VALIDATION_ERROR'\n );\n }\n\n if (params.needAnalysis && !params.analysisPrompt) {\n throw new PlolinkError(\n 'analysisPrompt is required when needAnalysis is true',\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n const response = await this.client.axiosInstance.post<CreatePsychologyTestSessionResponse>(\n '/api/v1/psychology/test-sessions',\n params\n );\n\n this.client.logger.info('Psychology test session created successfully', {\n sessionId: response.sessionId,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to create psychology test session', { error });\n throw error;\n }\n }\n\n /**\n * 获取会话题目\n * \n * @description\n * 获取心理评测会话的题目列表(动态生成,每次调用都会重新打乱题目顺序)。\n * \n * @param sessionId - 评测会话ID\n * @returns 题目列表和题组摘要\n * @throws {PlolinkError} 当会话不存在或获取失败时抛出\n * \n * @example\n * ```typescript\n * const questions = await client.psychologyTest.getSessionQuestions('clxxxx789012');\n * \n * console.log(`共 ${questions.totalCount} 道题目`);\n * console.log('题组摘要:', questions.groupSummary);\n * \n * // 展示题目\n * questions.questions.forEach((q, index) => {\n * console.log(`题目 ${index + 1}: ${q.content}`);\n * });\n * ```\n */\n public async getSessionQuestions(sessionId: string): Promise<GetSessionQuestionsResponse> {\n this.client.logger.info('Getting session questions', { sessionId });\n\n if (!sessionId) {\n throw new PlolinkError('sessionId is required', 'VALIDATION_ERROR');\n }\n\n try {\n const response = await this.client.axiosInstance.get<GetSessionQuestionsResponse>(\n `/api/v1/psychology/test-sessions/${sessionId}/questions`\n );\n\n this.client.logger.info('Session questions retrieved successfully', {\n sessionId,\n totalCount: response.totalCount,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to get session questions', { error, sessionId });\n throw error;\n }\n }\n\n /**\n * 发起心理评测(已废弃)\n * \n * @deprecated 此方法已废弃,将在 v2.0 中移除。请使用 createTestSession() + getSessionQuestions() 替代。\n * \n * @description\n * 根据题组代码列表发起心理评测会话,系统会自动生成打乱后的题目列表并返回。\n * \n * **迁移建议**:\n * ```typescript\n * // 旧方式(已废弃)\n * const result = await client.psychologyTest.initiate(params);\n * \n * // 新方式(推荐)\n * const { sessionId } = await client.psychologyTest.createTestSession(params);\n * const result = await client.psychologyTest.getSessionQuestions(sessionId);\n * ```\n * \n * @param params - 发起评测参数\n * @returns 评测会话信息,包含会话ID和题目列表\n * @throws {PlolinkError} 当参数验证失败或发起失败时抛出\n */\n public async initiate(params: InitiatePsychologyTestParams): Promise<InitiatePsychologyTestResponse> {\n this.client.logger.warn('Using deprecated initiate() method. Please use createTestSession() + getSessionQuestions() instead.');\n \n this.client.logger.info('Initiating psychology test (deprecated)', {\n groupCodes: params.groupCodes,\n businessModule: params.businessModule,\n businessCode: params.businessCode,\n needAnalysis: params.needAnalysis,\n });\n\n // 参数校验\n if (!params.groupCodes || params.groupCodes.length === 0) {\n throw new PlolinkError(\n 'groupCodes is required and cannot be empty',\n 'VALIDATION_ERROR'\n );\n }\n\n if (!params.businessModule || !params.businessCode || !params.businessId) {\n throw new PlolinkError(\n 'businessModule, businessCode, and businessId are required',\n 'VALIDATION_ERROR'\n );\n }\n\n if (params.needAnalysis && !params.analysisPrompt) {\n throw new PlolinkError(\n 'analysisPrompt is required when needAnalysis is true',\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n // 内部调用新方法实现兼容\n const { sessionId } = await this.createTestSession(params);\n const questionsData = await this.getSessionQuestions(sessionId);\n\n const response: InitiatePsychologyTestResponse = {\n sessionId,\n ...questionsData,\n };\n\n this.client.logger.info('Psychology test initiated successfully (deprecated)', {\n sessionId: response.sessionId,\n totalCount: response.totalCount,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to initiate psychology test', { error });\n throw error;\n }\n }\n\n /**\n * 提交心理评测\n * \n * @description\n * 提交心理评测答题数据,系统会自动计算得分并生成 Markdown 描述。\n * 如需 AI 分析则会加入异步队列,分析完成后会通过 Webhook 通知。\n * \n * @param params - 提交评测参数\n * @returns 提交结果,包含计算结果和得分描述\n * @throws {PlolinkError} 当参数验证失败或提交失败时抛出\n * \n * @example\n * ```typescript\n * const result = await client.psychologyTest.submit({\n * sessionId: 'clxxxx789012',\n * answers: [\n * {\n * groupCode: 'family_parenting',\n * bankId: 'bank_123',\n * questionId: 'q_001',\n * questionCode: 'FP001A',\n * answer: '1',\n * timeSpent: 3500\n * },\n * // ... 更多答题记录\n * ],\n * duration: 480000\n * });\n * \n * console.log('得分描述:', result.scoreDescription);\n * console.log('计算结果:', result.calculationResults);\n * ```\n */\n public async submit(params: SubmitPsychologyTestParams): Promise<SubmitPsychologyTestResponse> {\n this.client.logger.info('Submitting psychology test', {\n sessionId: params.sessionId,\n answersCount: params.answers.length,\n });\n\n // 参数校验\n if (!params.sessionId) {\n throw new PlolinkError(\n 'sessionId is required',\n 'VALIDATION_ERROR'\n );\n }\n\n if (!params.answers || params.answers.length === 0) {\n throw new PlolinkError(\n 'answers is required and cannot be empty',\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n const response = await this.client.axiosInstance.post<SubmitPsychologyTestResponse>(\n '/api/v1/psychology/test-sessions/submit',\n params\n );\n\n this.client.logger.info('Psychology test submitted successfully', {\n sessionId: response.sessionId,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to submit psychology test', { error });\n throw error;\n }\n }\n\n /**\n * 获取心理评测详情\n * \n * @description\n * 获取心理评测会话的完整信息,包括基本信息、计算结果、得分描述、AI分析结果等。\n * \n * @param sessionId - 评测会话ID\n * @returns 评测会话详情\n * @throws {PlolinkError} 当会话不存在或查询失败时抛出\n * \n * @example\n * ```typescript\n * const detail = await client.psychologyTest.getDetail('clxxxx789012');\n * \n * console.log('评测状态:', detail.status);\n * console.log('得分描述:', detail.scoreDescription);\n * \n * // 检查分析状态\n * if (detail.analysisStatus === 'COMPLETED') {\n * console.log('AI分析结果:', detail.analysisResult);\n * } else if (detail.analysisStatus === 'ANALYZING') {\n * console.log('AI分析进行中,请稍后查询');\n * } else if (detail.analysisStatus === 'FAILED') {\n * console.error('分析失败:', detail.analysisError);\n * }\n * ```\n */\n public async getDetail(sessionId: string): Promise<PsychologyTestDetail> {\n this.client.logger.info('Getting psychology test detail', { sessionId });\n\n if (!sessionId) {\n throw new PlolinkError(\n 'sessionId is required',\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n const response = await this.client.axiosInstance.get<PsychologyTestDetail>(\n `/api/v1/psychology/test-sessions/${sessionId}`\n );\n\n this.client.logger.info('Psychology test detail retrieved successfully', {\n sessionId,\n status: response.status,\n analysisStatus: response.analysisStatus,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to get psychology test detail', { error });\n throw error;\n }\n }\n\n /**\n * 获取心理评测答题记录\n * \n * @description\n * 获取心理评测会话的所有答题记录。\n * \n * @param sessionId - 评测会话ID\n * @returns 答题记录列表\n * @throws {PlolinkError} 当会话不存在或查询失败时抛出\n * \n * @example\n * ```typescript\n * const answers = await client.psychologyTest.getAnswers('clxxxx789012');\n * \n * console.log(`共 ${answers.length} 条答题记录`);\n * answers.forEach(answer => {\n * console.log(`题目 ${answer.questionCode}: ${answer.answer}`);\n * });\n * ```\n */\n public async getAnswers(sessionId: string): Promise<PsychologyTestAnswerDetail[]> {\n this.client.logger.info('Getting psychology test answers', { sessionId });\n\n if (!sessionId) {\n throw new PlolinkError(\n 'sessionId is required',\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n const response = await this.client.axiosInstance.get<PsychologyTestAnswerDetail[]>(\n `/api/v1/psychology/test-sessions/${sessionId}/answers`\n );\n\n this.client.logger.info('Psychology test answers retrieved successfully', {\n sessionId,\n count: response.length,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to get psychology test answers', { error });\n throw error;\n }\n }\n\n /**\n * 列表查询心理评测会话\n * \n * @description\n * 查询心理评测会话列表,支持分页和多条件筛选。\n * 团队成员可访问该团队的评测数据(teamId 由后端从认证信息中自动获取)。\n * \n * @param params - 查询参数\n * @returns 会话列表和分页信息\n * @throws {PlolinkError} 当查询失败时抛出\n * \n * @example\n * ```typescript\n * // 查询所有评测会话\n * const result = await client.psychologyTest.listTestSessions({\n * page: 1,\n * size: 20\n * });\n * \n * console.log(`共 ${result.total} 条记录`);\n * result.list.forEach(session => {\n * console.log(`会话ID: ${session.id}, 状态: ${session.status}`);\n * });\n * \n * // 按条件筛选\n * const filtered = await client.psychologyTest.listTestSessions({\n * page: 1,\n * size: 20,\n * businessModule: 'talent_assessment',\n * status: 'COMPLETED',\n * analysisStatus: 'COMPLETED'\n * });\n * ```\n */\n public async listTestSessions(\n params: ListPsychologyTestSessionsParams = {}\n ): Promise<ListPsychologyTestSessionsResponse> {\n this.client.logger.info('Listing psychology test sessions', { params });\n\n try {\n // 构建查询参数\n const queryParams = new URLSearchParams();\n if (params.page !== undefined) queryParams.append('page', String(params.page));\n if (params.size !== undefined) queryParams.append('size', String(params.size));\n if (params.businessModule) queryParams.append('businessModule', params.businessModule);\n if (params.businessCode) queryParams.append('businessCode', params.businessCode);\n if (params.status) queryParams.append('status', params.status);\n if (params.analysisStatus) queryParams.append('analysisStatus', params.analysisStatus);\n if (params.startDate) queryParams.append('startDate', params.startDate);\n if (params.endDate) queryParams.append('endDate', params.endDate);\n\n const url = `/api/v1/psychology/test-sessions${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;\n const response = await this.client.axiosInstance.get<ListPsychologyTestSessionsResponse>(url);\n\n this.client.logger.info('Psychology test sessions listed successfully', {\n total: response.total,\n count: response.list.length,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to list psychology test sessions', { error });\n throw error;\n }\n }\n\n /**\n * 删除心理评测会话\n * \n * @description\n * 软删除心理评测会话记录。删除后数据不会真正从数据库移除,\n * 但在正常查询中不会显示。团队成员可删除该团队的评测数据。\n * \n * @param sessionId - 评测会话ID\n * @returns void\n * @throws {PlolinkError} 当会话不存在或删除失败时抛出\n * \n * @example\n * ```typescript\n * // 删除评测会话\n * await client.psychologyTest.deleteTestSession('clxxxx789012');\n * console.log('评测会话已删除');\n * ```\n */\n public async deleteTestSession(sessionId: string): Promise<void> {\n this.client.logger.info('Deleting psychology test session', { sessionId });\n\n if (!sessionId) {\n throw new PlolinkError(\n 'sessionId is required',\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n await this.client.axiosInstance.delete(\n `/api/v1/psychology/test-sessions/${sessionId}`\n );\n\n this.client.logger.info('Psychology test session deleted successfully', {\n sessionId,\n });\n } catch (error) {\n this.client.logger.error('Failed to delete psychology test session', { error });\n throw error;\n }\n }\n\n /**\n * 获取题库组列表\n * \n * @description\n * 获取所有启用状态的题库组列表,返回基本信息用于选择。\n * 此接口不需要管理员权限,普通用户即可调用。\n * \n * @returns 题库组列表\n * @throws {PlolinkError} 当查询失败时抛出\n * \n * @example\n * ```typescript\n * const groups = await client.psychologyTest.listBankGroups();\n * groups.forEach(g => {\n * console.log(`${g.name} (${g.code}): ${g.testObjective}`);\n * });\n * ```\n */\n public async listBankGroups(): Promise<PsychologyBankGroupSummary[]> {\n this.client.logger.info('Listing psychology bank groups');\n\n try {\n const response = await this.client.axiosInstance.get<PsychologyBankGroupSummary[]>(\n '/api/v1/psychology/bank-groups'\n );\n\n this.client.logger.info('Psychology bank groups listed successfully', {\n count: response.length,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to list psychology bank groups', { error });\n throw error;\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/modules/psychology-test/index.ts"],"names":["PlolinkError"],"mappings":";;;;;AAwGO,IAAM,iBAAN,MAAqB;AAAA,EAG1B,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BA,MAAa,kBAAkB,MAAA,EAAyF;AACtH,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,kCAAA,EAAoC;AAAA,MAC1D,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,cAAc,MAAA,CAAO;AAAA,KACtB,CAAA;AAGD,IAAA,IAAI,CAAC,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,WAAW,CAAA,EAAG;AACxD,MAAA,MAAM,IAAIA,8BAAA;AAAA,QACR,4CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAO,cAAA,IAAkB,CAAC,OAAO,YAAA,IAAgB,CAAC,OAAO,UAAA,EAAY;AACxE,MAAA,MAAM,IAAIA,8BAAA;AAAA,QACR,2DAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,YAAA,IAAgB,CAAC,MAAA,CAAO,cAAA,EAAgB;AACjD,MAAA,MAAM,IAAIA,8BAAA;AAAA,QACR,sDAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,IAAA;AAAA,QAC/C,kCAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,8CAAA,EAAgD;AAAA,QACtE,WAAW,QAAA,CAAS;AAAA,OACrB,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,KAAA,CAAM,0CAAA,EAA4C,EAAE,OAAO,CAAA;AAC9E,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBA,MAAa,oBAAoB,SAAA,EAAyD;AACxF,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,2BAAA,EAA6B,EAAE,WAAW,CAAA;AAElE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAIA,8BAAA,CAAa,uBAAA,EAAyB,kBAAkB,CAAA;AAAA,IACpE;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,GAAA;AAAA,QAC/C,oCAAoC,SAAS,CAAA,UAAA;AAAA,OAC/C;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,0CAAA,EAA4C;AAAA,QAClE,SAAA;AAAA,QACA,YAAY,QAAA,CAAS;AAAA,OACtB,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,KAAA,CAAM,mCAAmC,EAAE,KAAA,EAAO,WAAW,CAAA;AAChF,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAa,SAAS,MAAA,EAA+E;AACnG,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,qGAAqG,CAAA;AAE7H,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,yCAAA,EAA2C;AAAA,MACjE,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,cAAc,MAAA,CAAO;AAAA,KACtB,CAAA;AAGD,IAAA,IAAI,CAAC,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,WAAW,CAAA,EAAG;AACxD,MAAA,MAAM,IAAIA,8BAAA;AAAA,QACR,4CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAO,cAAA,IAAkB,CAAC,OAAO,YAAA,IAAgB,CAAC,OAAO,UAAA,EAAY;AACxE,MAAA,MAAM,IAAIA,8BAAA;AAAA,QACR,2DAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,YAAA,IAAgB,CAAC,MAAA,CAAO,cAAA,EAAgB;AACjD,MAAA,MAAM,IAAIA,8BAAA;AAAA,QACR,sDAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,IAAA,CAAK,kBAAkB,MAAM,CAAA;AACzD,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA;AAE9D,MAAA,MAAM,QAAA,GAA2C;AAAA,QAC/C,SAAA;AAAA,QACA,GAAG;AAAA,OACL;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,qDAAA,EAAuD;AAAA,QAC7E,WAAW,QAAA,CAAS,SAAA;AAAA,QACpB,YAAY,QAAA,CAAS;AAAA,OACtB,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,KAAA,CAAM,oCAAA,EAAsC,EAAE,OAAO,CAAA;AACxE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmCA,MAAa,OAAO,MAAA,EAA2E;AAC7F,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,4BAAA,EAA8B;AAAA,MACpD,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,KAC9B,CAAA;AAGD,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,MAAA,MAAM,IAAIA,8BAAA;AAAA,QACR,uBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAClD,MAAA,MAAM,IAAIA,8BAAA;AAAA,QACR,yCAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,IAAA;AAAA,QAC/C,yCAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,wCAAA,EAA0C;AAAA,QAChE,WAAW,QAAA,CAAS;AAAA,OACrB,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,KAAA,CAAM,kCAAA,EAAoC,EAAE,OAAO,CAAA;AACtE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BA,MAAa,UAAU,SAAA,EAAkD;AACvE,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,gCAAA,EAAkC,EAAE,WAAW,CAAA;AAEvE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAIA,8BAAA;AAAA,QACR,uBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,GAAA;AAAA,QAC/C,oCAAoC,SAAS,CAAA;AAAA,OAC/C;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,+CAAA,EAAiD;AAAA,QACvE,SAAA;AAAA,QACA,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,gBAAgB,QAAA,CAAS;AAAA,OAC1B,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,KAAA,CAAM,sCAAA,EAAwC,EAAE,OAAO,CAAA;AAC1E,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAa,WAAW,SAAA,EAA0D;AAChF,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,iCAAA,EAAmC,EAAE,WAAW,CAAA;AAExE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAIA,8BAAA;AAAA,QACR,uBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,GAAA;AAAA,QAC/C,oCAAoC,SAAS,CAAA,QAAA;AAAA,OAC/C;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,gDAAA,EAAkD;AAAA,QACxE,SAAA;AAAA,QACA,OAAO,QAAA,CAAS;AAAA,OACjB,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,KAAA,CAAM,uCAAA,EAAyC,EAAE,OAAO,CAAA;AAC3E,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCA,MAAa,gBAAA,CACX,MAAA,GAA2C,EAAC,EACC;AAC7C,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,kCAAA,EAAoC,EAAE,QAAQ,CAAA;AAEtE,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,MAAA,CAAO,SAAS,KAAA,CAAA,EAAW,WAAA,CAAY,OAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7E,MAAA,IAAI,MAAA,CAAO,SAAS,KAAA,CAAA,EAAW,WAAA,CAAY,OAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7E,MAAA,IAAI,OAAO,cAAA,EAAgB,WAAA,CAAY,MAAA,CAAO,gBAAA,EAAkB,OAAO,cAAc,CAAA;AACrF,MAAA,IAAI,OAAO,YAAA,EAAc,WAAA,CAAY,MAAA,CAAO,cAAA,EAAgB,OAAO,YAAY,CAAA;AAC/E,MAAA,IAAI,OAAO,MAAA,EAAQ,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAC7D,MAAA,IAAI,OAAO,cAAA,EAAgB,WAAA,CAAY,MAAA,CAAO,gBAAA,EAAkB,OAAO,cAAc,CAAA;AACrF,MAAA,IAAI,OAAO,SAAA,EAAW,WAAA,CAAY,MAAA,CAAO,WAAA,EAAa,OAAO,SAAS,CAAA;AACtE,MAAA,IAAI,OAAO,OAAA,EAAS,WAAA,CAAY,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AAEhE,MAAA,MAAM,GAAA,GAAM,CAAA,gCAAA,EAAmC,WAAA,CAAY,QAAA,EAAS,GAAI,IAAI,WAAA,CAAY,QAAA,EAAU,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AACzG,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,IAAwC,GAAG,CAAA;AAE5F,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,8CAAA,EAAgD;AAAA,QACtE,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,KAAA,EAAO,SAAS,IAAA,CAAK;AAAA,OACtB,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,KAAA,CAAM,yCAAA,EAA2C,EAAE,OAAO,CAAA;AAC7E,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAa,kBAAkB,SAAA,EAAkC;AAC/D,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,kCAAA,EAAoC,EAAE,WAAW,CAAA;AAEzE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAIA,8BAAA;AAAA,QACR,uBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAO,aAAA,CAAc,MAAA;AAAA,QAC9B,oCAAoC,SAAS,CAAA;AAAA,OAC/C;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,8CAAA,EAAgD;AAAA,QACtE;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,KAAA,CAAM,0CAAA,EAA4C,EAAE,OAAO,CAAA;AAC9E,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAa,cAAA,GAAwD;AACnE,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,gCAAgC,CAAA;AAExD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,GAAA;AAAA,QAC/C;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,4CAAA,EAA8C;AAAA,QACpE,OAAO,QAAA,CAAS;AAAA,OACjB,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,KAAA,CAAM,uCAAA,EAAyC,EAAE,OAAO,CAAA;AAC3E,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF","file":"index.cjs","sourcesContent":["/**\n * 心理评测模块\n * \n * @description\n * 提供心理评测相关功能,包括:\n * - 发起心理评测会话\n * - 提交心理评测答题\n * - 获取评测详情和结果\n * - 获取答题记录\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * \n * const client = new PlolinkClient({\n * token: 'sk-your-api-key'\n * });\n * \n * // 发起心理评测\n * const initResult = await client.psychologyTest.initiate({\n * groupCodes: ['family_parenting', 'disc'],\n * businessModule: 'talent_assessment',\n * businessCode: 'job_match',\n * businessId: 'clxxxx123456',\n * needAnalysis: true,\n * analysisPrompt: '请结合家庭养育方式和DISC行为模式,分析候选人的性格特点。'\n * });\n * console.log(`评测会话已创建: ${initResult.sessionId}`);\n * console.log(`共 ${initResult.totalCount} 道题目`);\n * \n * // 用户答题...\n * const answers = initResult.questions.map(q => ({\n * groupCode: q.groupCode,\n * bankId: q.bankId,\n * questionId: q.questionId,\n * questionCode: q.questionCode,\n * answer: getUserAnswer(q), // 获取用户答案\n * timeSpent: getTimeSpent(q) // 获取答题时间\n * }));\n * \n * // 提交心理评测\n * const submitResult = await client.psychologyTest.submit({\n * sessionId: initResult.sessionId,\n * answers,\n * duration: 480000\n * });\n * console.log('得分描述:', submitResult.scoreDescription);\n * \n * // 查询评测详情\n * const detail = await client.psychologyTest.getDetail(initResult.sessionId);\n * if (detail.analysisStatus === 'COMPLETED') {\n * console.log('AI分析结果:', detail.analysisResult);\n * }\n * ```\n * \n * @module psychology-test\n */\n\nimport { PlolinkClient } from '../../core/client';\nimport { PlolinkError } from '../../core/error';\nimport type {\n CreatePsychologyTestSessionParams,\n CreatePsychologyTestSessionResponse,\n GetSessionQuestionsResponse,\n InitiatePsychologyTestParams,\n InitiatePsychologyTestResponse,\n SubmitPsychologyTestParams,\n SubmitPsychologyTestResponse,\n PsychologyTestDetail,\n PsychologyTestAnswerDetail,\n ListPsychologyTestSessionsParams,\n ListPsychologyTestSessionsResponse,\n PsychologyBankGroupSummary,\n} from '../../types/psychology-test';\n\nexport type {\n PsychologyTestStatus,\n PsychologyAnalysisStatus,\n QuestionType,\n QuestionDependency,\n QuestionOption,\n QuestionMetadata,\n QuestionInfo,\n GroupSummary,\n CreatePsychologyTestSessionParams,\n CreatePsychologyTestSessionResponse,\n GetSessionQuestionsResponse,\n InitiatePsychologyTestParams,\n InitiatePsychologyTestResponse,\n AnswerRecord,\n SubmitPsychologyTestParams,\n TestCalculationResult,\n SubmitPsychologyTestResponse,\n PsychologyTestAnswerDetail,\n PsychologyTestDetail,\n PsychologyTestWebhookData,\n ListPsychologyTestSessionsParams,\n ListPsychologyTestSessionsResponse,\n PsychologyBankGroupSummary,\n} from '../../types/psychology-test';\n\n/**\n * 心理评测模块\n */\nexport class PsychologyTest {\n private client: PlolinkClient;\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 创建心理评测会话\n * \n * @description\n * 创建心理评测会话记录(不返回题目)。\n * 创建后需要调用 getSessionQuestions() 获取题目列表。\n * \n * @param params - 创建会话参数\n * @returns 会话信息,包含会话ID\n * @throws {PlolinkError} 当参数验证失败或创建失败时抛出\n * \n * @example\n * ```typescript\n * // 1. 创建会话\n * const { sessionId } = await client.psychologyTest.createTestSession({\n * groupCodes: ['family_parenting', 'disc'],\n * businessModule: 'talent_assessment',\n * businessCode: 'job_match',\n * businessId: 'clxxxx123456',\n * needAnalysis: true,\n * analysisPrompt: '请结合家庭养育方式和DISC行为模式,分析候选人的性格特点。'\n * });\n * \n * console.log(`评测会话已创建: ${sessionId}`);\n * \n * // 2. 获取题目\n * const questions = await client.psychologyTest.getSessionQuestions(sessionId);\n * ```\n */\n public async createTestSession(params: CreatePsychologyTestSessionParams): Promise<CreatePsychologyTestSessionResponse> {\n this.client.logger.info('Creating psychology test session', {\n groupCodes: params.groupCodes,\n tags: params.tags,\n businessModule: params.businessModule,\n businessCode: params.businessCode,\n needAnalysis: params.needAnalysis,\n });\n\n // 参数校验\n if (!params.groupCodes || params.groupCodes.length === 0) {\n throw new PlolinkError(\n 'groupCodes is required and cannot be empty',\n 'VALIDATION_ERROR'\n );\n }\n\n if (!params.businessModule || !params.businessCode || !params.businessId) {\n throw new PlolinkError(\n 'businessModule, businessCode, and businessId are required',\n 'VALIDATION_ERROR'\n );\n }\n\n if (params.needAnalysis && !params.analysisPrompt) {\n throw new PlolinkError(\n 'analysisPrompt is required when needAnalysis is true',\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n const response = await this.client.axiosInstance.post<CreatePsychologyTestSessionResponse>(\n '/api/v1/psychology/test-sessions',\n params\n );\n\n this.client.logger.info('Psychology test session created successfully', {\n sessionId: response.sessionId,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to create psychology test session', { error });\n throw error;\n }\n }\n\n /**\n * 获取会话题目\n * \n * @description\n * 获取心理评测会话的题目列表(动态生成,每次调用都会重新打乱题目顺序)。\n * \n * @param sessionId - 评测会话ID\n * @returns 题目列表和题组摘要\n * @throws {PlolinkError} 当会话不存在或获取失败时抛出\n * \n * @example\n * ```typescript\n * const questions = await client.psychologyTest.getSessionQuestions('clxxxx789012');\n * \n * console.log(`共 ${questions.totalCount} 道题目`);\n * console.log('题组摘要:', questions.groupSummary);\n * \n * // 展示题目\n * questions.questions.forEach((q, index) => {\n * console.log(`题目 ${index + 1}: ${q.content}`);\n * });\n * ```\n */\n public async getSessionQuestions(sessionId: string): Promise<GetSessionQuestionsResponse> {\n this.client.logger.info('Getting session questions', { sessionId });\n\n if (!sessionId) {\n throw new PlolinkError('sessionId is required', 'VALIDATION_ERROR');\n }\n\n try {\n const response = await this.client.axiosInstance.get<GetSessionQuestionsResponse>(\n `/api/v1/psychology/test-sessions/${sessionId}/questions`\n );\n\n this.client.logger.info('Session questions retrieved successfully', {\n sessionId,\n totalCount: response.totalCount,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to get session questions', { error, sessionId });\n throw error;\n }\n }\n\n /**\n * 发起心理评测(已废弃)\n * \n * @deprecated 此方法已废弃,将在 v2.0 中移除。请使用 createTestSession() + getSessionQuestions() 替代。\n * \n * @description\n * 根据题组代码列表发起心理评测会话,系统会自动生成打乱后的题目列表并返回。\n * \n * **迁移建议**:\n * ```typescript\n * // 旧方式(已废弃)\n * const result = await client.psychologyTest.initiate(params);\n * \n * // 新方式(推荐)\n * const { sessionId } = await client.psychologyTest.createTestSession(params);\n * const result = await client.psychologyTest.getSessionQuestions(sessionId);\n * ```\n * \n * @param params - 发起评测参数\n * @returns 评测会话信息,包含会话ID和题目列表\n * @throws {PlolinkError} 当参数验证失败或发起失败时抛出\n */\n public async initiate(params: InitiatePsychologyTestParams): Promise<InitiatePsychologyTestResponse> {\n this.client.logger.warn('Using deprecated initiate() method. Please use createTestSession() + getSessionQuestions() instead.');\n \n this.client.logger.info('Initiating psychology test (deprecated)', {\n groupCodes: params.groupCodes,\n tags: params.tags,\n businessModule: params.businessModule,\n businessCode: params.businessCode,\n needAnalysis: params.needAnalysis,\n });\n\n // 参数校验\n if (!params.groupCodes || params.groupCodes.length === 0) {\n throw new PlolinkError(\n 'groupCodes is required and cannot be empty',\n 'VALIDATION_ERROR'\n );\n }\n\n if (!params.businessModule || !params.businessCode || !params.businessId) {\n throw new PlolinkError(\n 'businessModule, businessCode, and businessId are required',\n 'VALIDATION_ERROR'\n );\n }\n\n if (params.needAnalysis && !params.analysisPrompt) {\n throw new PlolinkError(\n 'analysisPrompt is required when needAnalysis is true',\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n // 内部调用新方法实现兼容\n const { sessionId } = await this.createTestSession(params);\n const questionsData = await this.getSessionQuestions(sessionId);\n\n const response: InitiatePsychologyTestResponse = {\n sessionId,\n ...questionsData,\n };\n\n this.client.logger.info('Psychology test initiated successfully (deprecated)', {\n sessionId: response.sessionId,\n totalCount: response.totalCount,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to initiate psychology test', { error });\n throw error;\n }\n }\n\n /**\n * 提交心理评测\n * \n * @description\n * 提交心理评测答题数据,系统会自动计算得分并生成 Markdown 描述。\n * 如需 AI 分析则会加入异步队列,分析完成后会通过 Webhook 通知。\n * \n * @param params - 提交评测参数\n * @returns 提交结果,包含计算结果和得分描述\n * @throws {PlolinkError} 当参数验证失败或提交失败时抛出\n * \n * @example\n * ```typescript\n * const result = await client.psychologyTest.submit({\n * sessionId: 'clxxxx789012',\n * answers: [\n * {\n * groupCode: 'family_parenting',\n * bankId: 'bank_123',\n * questionId: 'q_001',\n * questionCode: 'FP001A',\n * answer: '1',\n * timeSpent: 3500\n * },\n * // ... 更多答题记录\n * ],\n * duration: 480000\n * });\n * \n * console.log('得分描述:', result.scoreDescription);\n * console.log('计算结果:', result.calculationResults);\n * ```\n */\n public async submit(params: SubmitPsychologyTestParams): Promise<SubmitPsychologyTestResponse> {\n this.client.logger.info('Submitting psychology test', {\n sessionId: params.sessionId,\n answersCount: params.answers.length,\n });\n\n // 参数校验\n if (!params.sessionId) {\n throw new PlolinkError(\n 'sessionId is required',\n 'VALIDATION_ERROR'\n );\n }\n\n if (!params.answers || params.answers.length === 0) {\n throw new PlolinkError(\n 'answers is required and cannot be empty',\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n const response = await this.client.axiosInstance.post<SubmitPsychologyTestResponse>(\n '/api/v1/psychology/test-sessions/submit',\n params\n );\n\n this.client.logger.info('Psychology test submitted successfully', {\n sessionId: response.sessionId,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to submit psychology test', { error });\n throw error;\n }\n }\n\n /**\n * 获取心理评测详情\n * \n * @description\n * 获取心理评测会话的完整信息,包括基本信息、计算结果、得分描述、AI分析结果等。\n * \n * @param sessionId - 评测会话ID\n * @returns 评测会话详情\n * @throws {PlolinkError} 当会话不存在或查询失败时抛出\n * \n * @example\n * ```typescript\n * const detail = await client.psychologyTest.getDetail('clxxxx789012');\n * \n * console.log('评测状态:', detail.status);\n * console.log('得分描述:', detail.scoreDescription);\n * \n * // 检查分析状态\n * if (detail.analysisStatus === 'COMPLETED') {\n * console.log('AI分析结果:', detail.analysisResult);\n * } else if (detail.analysisStatus === 'ANALYZING') {\n * console.log('AI分析进行中,请稍后查询');\n * } else if (detail.analysisStatus === 'FAILED') {\n * console.error('分析失败:', detail.analysisError);\n * }\n * ```\n */\n public async getDetail(sessionId: string): Promise<PsychologyTestDetail> {\n this.client.logger.info('Getting psychology test detail', { sessionId });\n\n if (!sessionId) {\n throw new PlolinkError(\n 'sessionId is required',\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n const response = await this.client.axiosInstance.get<PsychologyTestDetail>(\n `/api/v1/psychology/test-sessions/${sessionId}`\n );\n\n this.client.logger.info('Psychology test detail retrieved successfully', {\n sessionId,\n status: response.status,\n analysisStatus: response.analysisStatus,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to get psychology test detail', { error });\n throw error;\n }\n }\n\n /**\n * 获取心理评测答题记录\n * \n * @description\n * 获取心理评测会话的所有答题记录。\n * \n * @param sessionId - 评测会话ID\n * @returns 答题记录列表\n * @throws {PlolinkError} 当会话不存在或查询失败时抛出\n * \n * @example\n * ```typescript\n * const answers = await client.psychologyTest.getAnswers('clxxxx789012');\n * \n * console.log(`共 ${answers.length} 条答题记录`);\n * answers.forEach(answer => {\n * console.log(`题目 ${answer.questionCode}: ${answer.answer}`);\n * });\n * ```\n */\n public async getAnswers(sessionId: string): Promise<PsychologyTestAnswerDetail[]> {\n this.client.logger.info('Getting psychology test answers', { sessionId });\n\n if (!sessionId) {\n throw new PlolinkError(\n 'sessionId is required',\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n const response = await this.client.axiosInstance.get<PsychologyTestAnswerDetail[]>(\n `/api/v1/psychology/test-sessions/${sessionId}/answers`\n );\n\n this.client.logger.info('Psychology test answers retrieved successfully', {\n sessionId,\n count: response.length,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to get psychology test answers', { error });\n throw error;\n }\n }\n\n /**\n * 列表查询心理评测会话\n * \n * @description\n * 查询心理评测会话列表,支持分页和多条件筛选。\n * 团队成员可访问该团队的评测数据(teamId 由后端从认证信息中自动获取)。\n * \n * @param params - 查询参数\n * @returns 会话列表和分页信息\n * @throws {PlolinkError} 当查询失败时抛出\n * \n * @example\n * ```typescript\n * // 查询所有评测会话\n * const result = await client.psychologyTest.listTestSessions({\n * page: 1,\n * size: 20\n * });\n * \n * console.log(`共 ${result.total} 条记录`);\n * result.list.forEach(session => {\n * console.log(`会话ID: ${session.id}, 状态: ${session.status}`);\n * });\n * \n * // 按条件筛选\n * const filtered = await client.psychologyTest.listTestSessions({\n * page: 1,\n * size: 20,\n * businessModule: 'talent_assessment',\n * status: 'COMPLETED',\n * analysisStatus: 'COMPLETED'\n * });\n * ```\n */\n public async listTestSessions(\n params: ListPsychologyTestSessionsParams = {}\n ): Promise<ListPsychologyTestSessionsResponse> {\n this.client.logger.info('Listing psychology test sessions', { params });\n\n try {\n // 构建查询参数\n const queryParams = new URLSearchParams();\n if (params.page !== undefined) queryParams.append('page', String(params.page));\n if (params.size !== undefined) queryParams.append('size', String(params.size));\n if (params.businessModule) queryParams.append('businessModule', params.businessModule);\n if (params.businessCode) queryParams.append('businessCode', params.businessCode);\n if (params.status) queryParams.append('status', params.status);\n if (params.analysisStatus) queryParams.append('analysisStatus', params.analysisStatus);\n if (params.startDate) queryParams.append('startDate', params.startDate);\n if (params.endDate) queryParams.append('endDate', params.endDate);\n\n const url = `/api/v1/psychology/test-sessions${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;\n const response = await this.client.axiosInstance.get<ListPsychologyTestSessionsResponse>(url);\n\n this.client.logger.info('Psychology test sessions listed successfully', {\n total: response.total,\n count: response.list.length,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to list psychology test sessions', { error });\n throw error;\n }\n }\n\n /**\n * 删除心理评测会话\n * \n * @description\n * 软删除心理评测会话记录。删除后数据不会真正从数据库移除,\n * 但在正常查询中不会显示。团队成员可删除该团队的评测数据。\n * \n * @param sessionId - 评测会话ID\n * @returns void\n * @throws {PlolinkError} 当会话不存在或删除失败时抛出\n * \n * @example\n * ```typescript\n * // 删除评测会话\n * await client.psychologyTest.deleteTestSession('clxxxx789012');\n * console.log('评测会话已删除');\n * ```\n */\n public async deleteTestSession(sessionId: string): Promise<void> {\n this.client.logger.info('Deleting psychology test session', { sessionId });\n\n if (!sessionId) {\n throw new PlolinkError(\n 'sessionId is required',\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n await this.client.axiosInstance.delete(\n `/api/v1/psychology/test-sessions/${sessionId}`\n );\n\n this.client.logger.info('Psychology test session deleted successfully', {\n sessionId,\n });\n } catch (error) {\n this.client.logger.error('Failed to delete psychology test session', { error });\n throw error;\n }\n }\n\n /**\n * 获取题库组列表\n * \n * @description\n * 获取所有启用状态的题库组列表,返回基本信息用于选择。\n * 此接口不需要管理员权限,普通用户即可调用。\n * \n * @returns 题库组列表\n * @throws {PlolinkError} 当查询失败时抛出\n * \n * @example\n * ```typescript\n * const groups = await client.psychologyTest.listBankGroups();\n * groups.forEach(g => {\n * console.log(`${g.name} (${g.code}): ${g.testObjective}`);\n * });\n * ```\n */\n public async listBankGroups(): Promise<PsychologyBankGroupSummary[]> {\n this.client.logger.info('Listing psychology bank groups');\n\n try {\n const response = await this.client.axiosInstance.get<PsychologyBankGroupSummary[]>(\n '/api/v1/psychology/bank-groups'\n );\n\n this.client.logger.info('Psychology bank groups listed successfully', {\n count: response.length,\n });\n\n return response;\n } catch (error) {\n this.client.logger.error('Failed to list psychology bank groups', { error });\n throw error;\n }\n }\n}\n"]}