@cpzxrobot/sdk 1.3.119 → 1.3.121

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AIFORM_GATEWAY.md CHANGED
@@ -40,7 +40,20 @@ interface AiformTemplate {
40
40
  factoryId: number; // 工厂ID
41
41
  name: string; // 模板名称
42
42
  content: string; // 模板内容
43
- attention?: string; // 注意事项
43
+ attention: { // 注意事项
44
+ hasFixedContent: boolean; // 是否有固定内容
45
+ fixedContentList: string[]; // 固定内容列表
46
+ hasFixedRowContent: boolean; // 是否有固定行内容
47
+ rowContent: string; // 行内容
48
+ hasFixedColumnContent: boolean; // 是否有固定列内容
49
+ columnContent: string; // 列内容
50
+ otherNotes: string; // 其他备注
51
+ };
52
+ status: number; // 解析状态:null-未上传 0-已上传 1-解析中 2-已解析
53
+ parsePrompt: string; // 从表格图片提炼的解析提示词
54
+ curVersion: number; // 当前解析版本号
55
+ createTime: string; // 创建时间
56
+ updateTime: string; // 更新时间
44
57
  }
45
58
  ```
46
59
 
@@ -57,9 +70,8 @@ if (response.code === 200) {
57
70
  templates.forEach(template => {
58
71
  console.log(`ID: ${template.id}, 名称: ${template.name}`);
59
72
  console.log(`内容: ${template.content.substring(0, 100)}...`);
60
- if (template.attention) {
61
- console.log(`注意事项: ${template.attention}`);
62
- }
73
+ console.log(`状态: ${template.status === 2 ? '已解析' : template.status === 1 ? '解析中' : '已上传'}`);
74
+ console.log(`版本: ${template.curVersion}`);
63
75
  });
64
76
  } else {
65
77
  console.error('获取模板列表失败:', response.message);
@@ -81,7 +93,18 @@ interface AiformTemplateSaveRequest {
81
93
  factoryId: number; // 工厂ID,必填
82
94
  name: string; // 模板名称,必填
83
95
  content: string; // 模板内容,必填
84
- attention?: string; // 注意事项,可选
96
+ attention?: { // 注意事项(可选)
97
+ hasFixedContent: boolean; // 是否有固定内容
98
+ fixedContentList: string[]; // 固定内容列表
99
+ hasFixedRowContent: boolean; // 是否有固定行内容
100
+ rowContent: string; // 行内容
101
+ hasFixedColumnContent: boolean; // 是否有固定列内容
102
+ columnContent: string; // 列内容
103
+ otherNotes: string; // 其他备注
104
+ };
105
+ status?: number; // 解析状态(一般由上传接口更新)
106
+ parsePrompt?: string; // 解析提示词(由上传表格图片接口提炼)
107
+ curVersion?: number; // 一般由解析/发布接口维护
85
108
  }
86
109
  ```
87
110
 
@@ -103,7 +126,15 @@ const response = await cpzxrobot().aiform.template.save({
103
126
  factoryId: 1001,
104
127
  name: "生产日报模板",
105
128
  content: "## 生产日报\n\n日期: {{date}}\n\n产量: {{production}}\n\n质量: {{quality}}",
106
- attention: "请确保填写真实数据"
129
+ attention: {
130
+ hasFixedContent: false,
131
+ fixedContentList: [],
132
+ hasFixedRowContent: true,
133
+ rowContent: "每头母猪和仔猪的日常记录情况",
134
+ hasFixedColumnContent: false,
135
+ columnContent: "",
136
+ otherNotes: ""
137
+ }
107
138
  });
108
139
 
109
140
  if (response.code === 200) {
@@ -122,7 +153,15 @@ const response = await cpzxrobot().aiform.template.save({
122
153
  factoryId: 1001,
123
154
  name: "生产日报模板(更新版)",
124
155
  content: "## 生产日报\n\n日期: {{date}}\n\n产量: {{production}}\n\n质量: {{quality}}\n\n备注: {{remark}}",
125
- attention: "请确保填写真实数据,新增加了备注字段"
156
+ attention: {
157
+ hasFixedContent: true,
158
+ fixedContentList: ["温度", "湿度"],
159
+ hasFixedRowContent: true,
160
+ rowContent: "每头母猪和仔猪的日常记录情况",
161
+ hasFixedColumnContent: false,
162
+ columnContent: "",
163
+ otherNotes: "需关注异常情况"
164
+ }
126
165
  });
127
166
 
128
167
  if (response.code === 200) {
@@ -132,40 +171,193 @@ if (response.code === 200) {
132
171
  }
133
172
  ```
134
173
 
135
- ### 3. 上传表格图片
174
+ ### 3. 上传表格图片提炼模板提示词
175
+
176
+ **方法**: `uploadTemplateImage(templateId: number | null, file: File, factoryId?: number): Promise<any>`
177
+
178
+ **接口路径**: `POST /api/v2/aiform/template/upload`
179
+
180
+ **功能**: 上传表格图片到 MinIO,异步调用视觉大模型提炼模板字段。
181
+
182
+ **参数**:
183
+ - `templateId` (number | null): 模板ID(可选,与factoryId二选一)
184
+ - `file` (File): 表格图片文件,必填
185
+ - `factoryId` (number): 工厂ID(可选,与templateId二选一)
186
+
187
+ **返回值**:
188
+ ```typescript
189
+ interface AiformTemplateUploadResponse {
190
+ code: number; // 状态码
191
+ message: string; // 提示信息
192
+ data: AiformTemplate; // 当前模板快照
193
+ }
194
+ ```
195
+
196
+ **使用示例**:
197
+
198
+ ```javascript
199
+ // 上传图片到已有模板
200
+ const fileInput = document.getElementById('fileInput');
201
+ const file = fileInput.files[0];
202
+ const templateId = 1;
203
+
204
+ try {
205
+ const response = await cpzxrobot().aiform.template.uploadTemplateImage(templateId, file);
206
+ console.log('上传成功:', response.data);
207
+ console.log('模板状态:', response.data.status);
208
+ } catch (error) {
209
+ console.error('上传失败:', error.message);
210
+ }
211
+
212
+ // 上传图片创建新模板
213
+ const factoryId = 1001;
214
+ try {
215
+ const response = await cpzxrobot().aiform.template.uploadTemplateImage(null, file, factoryId);
216
+ console.log('上传成功,新模板ID:', response.data.id);
217
+ } catch (error) {
218
+ console.error('上传失败:', error.message);
219
+ }
220
+ ```
221
+
222
+ ### 4. 删除模板
223
+
224
+ **方法**: `delete(templateId: number): Promise<any>`
225
+
226
+ **接口路径**: `POST /api/v2/aiform/template/delete/{templateId}`
227
+
228
+ **功能**: 根据模板ID删除模板,级联删除关联的历史记录和文件。
229
+
230
+ **参数**:
231
+ - `templateId` (number): 模板ID,必填
232
+
233
+ **返回值**:
234
+ ```typescript
235
+ interface AiformTemplateDeleteResponse {
236
+ code: number; // 状态码
237
+ message: string; // 提示信息
238
+ }
239
+ ```
240
+
241
+ **使用示例**:
242
+
243
+ ```javascript
244
+ // 删除模板
245
+ const templateId = 1;
246
+ try {
247
+ const response = await cpzxrobot().aiform.template.delete(templateId);
248
+ console.log('删除成功:', response.message);
249
+ } catch (error) {
250
+ console.error('删除失败:', error.message);
251
+ }
252
+ ```
253
+
254
+ ### 5. 查询模板解析历史快照
255
+
256
+ **方法**: `history(templateId: number): Promise<AiformTemplateHistoryResponse>`
257
+
258
+ **接口路径**: `GET /api/v2/aiform/template/{templateId}/history`
259
+
260
+ **功能**: 查询指定模板的解析快照列表,按版本号从新到旧排序。
261
+
262
+ **参数**:
263
+ - `templateId` (number): 模板ID,必填
264
+
265
+ **返回值**:
266
+ ```typescript
267
+ interface AiformTemplateHistoryResponse {
268
+ code: number; // 状态码
269
+ message: string; // 提示信息
270
+ data: AiformTemplateHistory[]; // 历史快照列表
271
+ }
272
+
273
+ interface AiformTemplateHistory {
274
+ id: number; // 历史表主键
275
+ templateId: number; // 模板ID
276
+ snapshotVersion: number; // 解析版本号
277
+ name: string; // 名称快照
278
+ content: string; // 内容快照
279
+ attention: object; // 注意事项快照
280
+ parsePrompt: string; // 解析提示词快照
281
+ createTime: string; // 归档时间
282
+ }
283
+ ```
284
+
285
+ **使用示例**:
286
+
287
+ ```javascript
288
+ // 查询模板历史
289
+ const templateId = 1;
290
+ try {
291
+ const response = await cpzxrobot().aiform.template.history(templateId);
292
+ console.log('历史快照:', response.data);
293
+ } catch (error) {
294
+ console.error('获取历史失败:', error.message);
295
+ }
296
+ ```
297
+
298
+ ### 6. 按版本号将历史发布到主表
299
+
300
+ **方法**: `publishHistory(templateId: number, snapshotVersion: number): Promise<AiformTemplatePublishResponse>`
301
+
302
+ **接口路径**: `POST /api/v2/aiform/template/{templateId}/history/{snapshotVersion}/publish`
136
303
 
137
- **方法**: `upload(templateId: number): Promise<AiformFileUploadResponse>`
304
+ **功能**: 根据解析版本号将对应历史快照写回主表。
305
+
306
+ **参数**:
307
+ - `templateId` (number): 模板ID,必填
308
+ - `snapshotVersion` (number): 解析版本号,必填(必须大于0)
309
+
310
+ **返回值**:
311
+ ```typescript
312
+ interface AiformTemplatePublishResponse {
313
+ code: number; // 状态码
314
+ message: string; // 提示信息
315
+ data: AiformTemplate; // 更新后的模板
316
+ }
317
+ ```
318
+
319
+ **使用示例**:
320
+
321
+ ```javascript
322
+ // 发布历史版本
323
+ const templateId = 1;
324
+ const snapshotVersion = 2;
325
+ try {
326
+ const response = await cpzxrobot().aiform.template.publishHistory(templateId, snapshotVersion);
327
+ console.log('发布成功:', response.data);
328
+ } catch (error) {
329
+ console.error('发布失败:', error.message);
330
+ }
331
+ ```
332
+
333
+ ### 7. 上传表格图片
334
+
335
+ **方法**: `upload(templateId: number, watermark: boolean = false): Promise<AiformFileUploadResponse>`
138
336
 
139
337
  **接口路径**: `POST /api/v2/aiform/file/upload`
140
338
 
141
- **功能**: 上传表格图片到 MinIO,并关联到指定的模板。上传成功后自动异步触发大模型解析。
339
+ **功能**: 上传表格图片到 MinIO,并关联到指定的模板。上传成功后自动触发大模型解析。
142
340
 
143
341
  **参数**:
144
342
  - `templateId` (number): 关联的模板ID,必填
343
+ - `watermark` (boolean): 图片是否带水印,默认 false
145
344
 
146
345
  **返回值**:
147
346
  ```typescript
148
347
  interface AiformFileUploadResponse {
149
348
  code: number; // 状态码
150
349
  message: string; // 提示信息
151
- data: File; // 文件记录
152
- }
153
-
154
- interface File {
155
- id: number; // 文件记录ID
156
- code?: string; // 业务编码
157
- tableKey: number; // 关联业务ID(模板ID)
158
- tableName: string; // 关联业务表名(固定值 aiform_template)
159
- fileName: string; // 原始文件名
160
- storageName: string; // 存储文件名
161
- fileUrl: string; // MinIO存储路径
162
- accessUrl: string; // 预签名访问链接
163
- fileExt: string; // 文件扩展名
164
- server: string; // 存储服务(minio)
165
- type: string; // 文件类型(image)
166
- status: number; // 状态:0-已上传 1-解析中 2-已解析
167
- createTime: string; // 创建时间
168
- updateTime: string; // 更新时间
350
+ data: AiformRecordVO; // 上传记录
351
+ }
352
+
353
+ interface AiformRecordVO {
354
+ code: string; // 业务编码(用于调用详情接口)
355
+ storageName: string; // 存储文件名
356
+ status: number; // 解析状态:0-已上传 1-解析中 2-已解析
357
+ watermark: boolean; // 图片是否带水印
358
+ createUserId: number; // 创建用户ID
359
+ createTime: string; // 创建时间
360
+ updateTime: string; // 更新时间
169
361
  }
170
362
  ```
171
363
 
@@ -175,15 +367,16 @@ interface File {
175
367
  // 上传文件
176
368
  async function uploadFile() {
177
369
  const templateId = 1; // 模板ID
370
+ const watermark = false; // 图片是否带水印
178
371
 
179
372
  try {
180
- const response = await cpzxrobot().aiform.record.upload(templateId);
373
+ const response = await cpzxrobot().aiform.record.upload(templateId, watermark);
181
374
  console.log('上传成功:', response.data);
182
375
  console.log('文件状态:', getFileStatusText(response.data.status));
183
- console.log('访问链接:', response.data.accessUrl);
376
+ console.log('业务编码:', response.data.code);
184
377
 
185
378
  // 可以开始轮询状态
186
- trackFileStatus(templateId, response.data.id);
379
+ trackFileStatus(templateId, response.data.code);
187
380
  } catch (error) {
188
381
  console.error('上传失败:', error.message);
189
382
  }
@@ -202,7 +395,7 @@ function getFileStatusText(status) {
202
395
  uploadFile();
203
396
  ```
204
397
 
205
- ### 4. 根据模板ID查询上传记录
398
+ ### 8. 根据模板ID查询上传记录
206
399
 
207
400
  **方法**: `list(templateId: number): Promise<AiformFileListResponse>`
208
401
 
@@ -218,7 +411,7 @@ uploadFile();
218
411
  interface AiformFileListResponse {
219
412
  code: number; // 状态码
220
413
  message: string; // 提示信息
221
- data: File[]; // 文件记录列表(精简版)
414
+ data: AiformRecordVO[]; // 文件记录列表(精简版)
222
415
  }
223
416
  ```
224
417
 
@@ -236,10 +429,10 @@ async function getTemplateRecords(templateId) {
236
429
 
237
430
  records.forEach((record, index) => {
238
431
  console.log(`\n记录 ${index + 1}:`);
239
- console.log(`文件名: ${record.fileName}`);
432
+ console.log(`文件名: ${record.storageName}`);
240
433
  console.log(`状态: ${getFileStatusText(record.status)}`);
434
+ console.log(`业务编码: ${record.code}`);
241
435
  console.log(`创建时间: ${record.createTime}`);
242
- console.log(`访问链接: ${record.accessUrl}`);
243
436
  });
244
437
  }
245
438
  } catch (error) {
@@ -251,13 +444,13 @@ async function getTemplateRecords(templateId) {
251
444
  getTemplateRecords(1); // 查询模板ID为1的上传记录
252
445
  ```
253
446
 
254
- ### 5. 根据文件业务编码获取详情
447
+ ### 9. 根据文件业务编码获取详情
255
448
 
256
449
  **方法**: `detail(code: string): Promise<AiformFileDetailResponse>`
257
450
 
258
451
  **接口路径**: `GET /api/v2/aiform/file/detail/{code}`
259
452
 
260
- **功能**: 根据文件业务编码获取解析结果详情。
453
+ **功能**: 根据文件业务编码获取解析结果和预签名访问链接。
261
454
 
262
455
  **参数**:
263
456
  - `code` (string): 文件业务编码,必填
@@ -267,7 +460,16 @@ getTemplateRecords(1); // 查询模板ID为1的上传记录
267
460
  interface AiformFileDetailResponse {
268
461
  code: number; // 状态码
269
462
  message: string; // 提示信息
270
- data: any; // 解析结果详情
463
+ data: AiformParseResultVO; // 解析结果详情
464
+ }
465
+
466
+ interface AiformParseResultVO {
467
+ id: number; // 解析结果记录ID
468
+ content: string; // markdown 解析的表格内容
469
+ unclears: string[]; // 疑似不清晰处的描述说明
470
+ description: string; // 整体解析说明
471
+ parseResult: string; // 解析结果(兼容旧数据或解析失败时的原始结果)
472
+ accessUrl: string; // 预签名访问链接(有效期7天)
271
473
  }
272
474
  ```
273
475
 
@@ -281,6 +483,8 @@ async function getFileDetail(code) {
281
483
 
282
484
  if (response.code === 200) {
283
485
  console.log('文件详情:', response.data);
486
+ console.log('解析内容:', response.data.content);
487
+ console.log('访问链接:', response.data.accessUrl);
284
488
  }
285
489
  } catch (error) {
286
490
  console.error('获取文件详情失败:', error.message);
@@ -288,17 +492,237 @@ async function getFileDetail(code) {
288
492
  }
289
493
 
290
494
  // 调用示例
291
- getFileDetail('FILE_20240101_001'); // 查询业务编码为FILE_20240101_001的文件详情
495
+ getFileDetail('a1b2c3d4-e5f6-7890-abcd-ef1234567890');
292
496
  ```
293
497
 
294
- ### 6. 轮询文件解析状态
498
+ ### 10. 根据reply_id获取解析结果
499
+
500
+ **方法**: `getReplyDetail(replyId: number): Promise<AiformFileDetailResponse>`
501
+
502
+ **接口路径**: `GET /api/v2/aiform/file/detail/reply/{replyId}`
503
+
504
+ **功能**: 根据 reply_id 获取该次 reply 对应的解析结果。
505
+
506
+ **参数**:
507
+ - `replyId` (number): reply 记录ID,必填
508
+
509
+ **返回值**:
510
+ ```typescript
511
+ interface AiformFileDetailResponse {
512
+ code: number; // 状态码
513
+ message: string; // 提示信息
514
+ data: AiformParseResultVO; // 解析结果详情
515
+ }
516
+ ```
517
+
518
+ **使用示例**:
519
+
520
+ ```javascript
521
+ // 获取reply对应的解析结果
522
+ async function getReplyDetail(replyId) {
523
+ try {
524
+ const response = await cpzxrobot().aiform.record.getReplyDetail(replyId);
525
+
526
+ if (response.code === 200) {
527
+ console.log('解析结果:', response.data);
528
+ }
529
+ } catch (error) {
530
+ console.error('获取解析结果失败:', error.message);
531
+ }
532
+ }
533
+
534
+ // 调用示例
535
+ getReplyDetail(123);
536
+ ```
537
+
538
+ ### 11. 根据解析结果提交反馈(reply)
539
+
540
+ **方法**: `reply(code: string, reply: string): Promise<AiformReplyResponse>`
541
+
542
+ **接口路径**: `POST /api/v2/aiform/file/reply`
543
+
544
+ **功能**: 用户根据解析结果提交反馈,让大模型对结果进行调整或修改。
545
+
546
+ **参数**:
547
+ - `code` (string): 文件业务编码,必填
548
+ - `reply` (string): 用户的修改意见/反馈内容,必填
549
+
550
+ **返回值**:
551
+ ```typescript
552
+ interface AiformReplyResponse {
553
+ code: number; // 状态码
554
+ message: string; // 提示信息
555
+ data: AiformParseResultVO; // 调整后的解析结果
556
+ }
557
+ ```
558
+
559
+ **使用示例**:
560
+
561
+ ```javascript
562
+ // 提交反馈
563
+ async function submitReply(code, feedback) {
564
+ try {
565
+ const response = await cpzxrobot().aiform.record.reply(code, feedback);
566
+ console.log('反馈提交成功:', response.data);
567
+ console.log('调整后的内容:', response.data.content);
568
+ } catch (error) {
569
+ console.error('提交反馈失败:', error.message);
570
+ }
571
+ }
572
+
573
+ // 调用示例
574
+ submitReply('a1b2c3d4-e5f6-7890-abcd-ef1234567890', '请把第3列的数据改成数字格式');
575
+ ```
576
+
577
+ ### 12. 用户确认并保存
578
+
579
+ **方法**: `confirm(id: number, content: string, headerRowCount?: number, headers?: any[]): Promise<AiformConfirmResponse>`
580
+
581
+ **接口路径**: `POST /api/v2/aiform/file/confirm`
582
+
583
+ **功能**: 用户对解析结果进行最终确认,将表格转为标准数据存入数据库。
584
+
585
+ **参数**:
586
+ - `id` (number): 解析结果记录ID,必填
587
+ - `content` (string): 表格文本,markdown 表格格式,必填
588
+ - `headerRowCount` (number): 表头行数(可选)
589
+ - `headers` (any[]): 表头单元格列表(可选,用于复杂表头)
590
+
591
+ **返回值**:
592
+ ```typescript
593
+ interface AiformConfirmResponse {
594
+ code: number; // 状态码
595
+ message: string; // 提示信息
596
+ }
597
+ ```
598
+
599
+ **使用示例**:
600
+
601
+ ```javascript
602
+ // 确认保存
603
+ async function confirmSave(parseResultId, tableContent) {
604
+ try {
605
+ const response = await cpzxrobot().aiform.record.confirm(parseResultId, tableContent);
606
+ console.log('确认保存成功:', response.message);
607
+ } catch (error) {
608
+ console.error('确认保存失败:', error.message);
609
+ }
610
+ }
611
+
612
+ // 调用示例
613
+ const tableContent = '| 序号 | 栋舍 | 栏位 |\n| --- | --- | --- |\n| 1 | A栋 | 1栏 |';
614
+ confirmSave(123, tableContent);
615
+
616
+ // 带复杂表头的确认
617
+ async function confirmWithHeaders(parseResultId, tableContent) {
618
+ const headers = [
619
+ {row: 0, col: 0, rowSpan: 3, colSpan: 1, value: '栏位'},
620
+ {row: 0, col: 1, rowSpan: 3, colSpan: 1, value: '耳号'},
621
+ {row: 0, col: 2, rowSpan: 3, colSpan: 1, value: '异常情况'},
622
+ {row: 0, col: 3, rowSpan: 2, colSpan: 3, value: '治疗及采样记录'},
623
+ {row: 2, col: 3, rowSpan: 1, colSpan: 1, value: '时间'},
624
+ {row: 2, col: 4, rowSpan: 1, colSpan: 1, value: '体温'},
625
+ {row: 2, col: 5, rowSpan: 1, colSpan: 1, value: '方案'}
626
+ ];
627
+
628
+ try {
629
+ const response = await cpzxrobot().aiform.record.confirm(parseResultId, tableContent, undefined, headers);
630
+ console.log('确认保存成功:', response.message);
631
+ } catch (error) {
632
+ console.error('确认保存失败:', error.message);
633
+ }
634
+ }
635
+ ```
636
+
637
+ ### 13. 查询文件的reply调整历史
638
+
639
+ **方法**: `getReplyList(code: string): Promise<AiformReplyListResponse>`
640
+
641
+ **接口路径**: `GET /api/v2/aiform/file/reply/list/{code}`
642
+
643
+ **功能**: 根据文件业务编码查询该文件的所有 reply 调整历史记录,按创建时间倒序。
644
+
645
+ **参数**:
646
+ - `code` (string): 文件业务编码,必填
647
+
648
+ **返回值**:
649
+ ```typescript
650
+ interface AiformReplyListResponse {
651
+ code: number; // 状态码
652
+ message: string; // 提示信息
653
+ data: AiformRecordReply[]; // reply 记录列表
654
+ }
655
+
656
+ interface AiformRecordReply {
657
+ id: number; // 主键
658
+ recordId: number; // 记录ID,关联 aiform_record
659
+ reply: string; // 用户的修改意见/反馈内容
660
+ createUserId: number; // 创建用户ID
661
+ createTime: string; // 创建时间
662
+ }
663
+ ```
664
+
665
+ **使用示例**:
666
+
667
+ ```javascript
668
+ // 查询reply历史
669
+ async function getReplyHistory(code) {
670
+ try {
671
+ const response = await cpzxrobot().aiform.record.getReplyList(code);
672
+ console.log('Reply历史:', response.data);
673
+ } catch (error) {
674
+ console.error('获取Reply历史失败:', error.message);
675
+ }
676
+ }
677
+
678
+ // 调用示例
679
+ getReplyHistory('a1b2c3d4-e5f6-7890-abcd-ef1234567890');
680
+ ```
681
+
682
+ ### 14. 根据文件code删除记录
683
+
684
+ **方法**: `delete(code: string): Promise<any>`
685
+
686
+ **接口路径**: `POST /api/v2/aiform/file/delete/{code}`
687
+
688
+ **功能**: 根据文件业务编码删除记录,级联删除关联的标准数据、解析结果、reply、文件等。
689
+
690
+ **参数**:
691
+ - `code` (string): 文件业务编码,必填
692
+
693
+ **返回值**:
694
+ ```typescript
695
+ interface AiformFileDeleteResponse {
696
+ code: number; // 状态码
697
+ message: string; // 提示信息
698
+ }
699
+ ```
700
+
701
+ **使用示例**:
702
+
703
+ ```javascript
704
+ // 删除文件记录
705
+ async function deleteRecord(code) {
706
+ try {
707
+ const response = await cpzxrobot().aiform.record.delete(code);
708
+ console.log('删除成功:', response.message);
709
+ } catch (error) {
710
+ console.error('删除失败:', error.message);
711
+ }
712
+ }
713
+
714
+ // 调用示例
715
+ deleteRecord('a1b2c3d4-e5f6-7890-abcd-ef1234567890');
716
+ ```
717
+
718
+ ### 15. 轮询文件解析状态
295
719
 
296
720
  **功能**: 上传文件后,需要轮询文件状态以确认解析进度。
297
721
 
298
722
  **使用示例**:
299
723
 
300
724
  ```javascript
301
- async function trackFileStatus(templateId, fileId) {
725
+ async function trackFileStatus(templateId, fileCode) {
302
726
  let status = 0; // 初始状态
303
727
  let attempts = 0;
304
728
  const maxAttempts = 30; // 最多轮询30次
@@ -308,7 +732,7 @@ async function trackFileStatus(templateId, fileId) {
308
732
  while (status !== 2 && attempts < maxAttempts) {
309
733
  try {
310
734
  const response = await cpzxrobot().aiform.record.list(templateId);
311
- const fileRecord = response.data.find(record => record.id === fileId);
735
+ const fileRecord = response.data.find(record => record.code === fileCode);
312
736
 
313
737
  if (fileRecord) {
314
738
  status = fileRecord.status;
@@ -345,6 +769,10 @@ async function trackFileStatus(templateId, fileId) {
345
769
  - `模板内容不能为空` - 未提供content参数
346
770
  - `文件不能为空` - 未提供file参数
347
771
  - `模板ID不能为空` - 未提供templateId参数
772
+ - `文件业务编码不能为空` - 未提供code参数
773
+ - `反馈内容不能为空` - 未提供reply参数
774
+ - `解析结果记录ID不能为空` - 未提供id参数
775
+ - `表格内容不能为空` - 未提供content参数
348
776
 
349
777
  2. **API错误**:
350
778
  - 当API返回非200状态码时,会抛出包含错误信息的异常
@@ -374,8 +802,7 @@ try {
374
802
 
375
803
  try {
376
804
  // 尝试上传文件
377
- const file = document.getElementById('fileInput').files[0];
378
- const response = await cpzxrobot().aiform.record.upload(file, 1);
805
+ const response = await cpzxrobot().aiform.record.upload(1, false);
379
806
  console.log('上传成功:', response.data);
380
807
  } catch (error) {
381
808
  console.error('上传失败:', error.message);
@@ -391,11 +818,27 @@ try {
391
818
 
392
819
  try {
393
820
  // 尝试获取文件详情
394
- const response = await cpzxrobot().aiform.record.detail('FILE_20240101_001');
821
+ const response = await cpzxrobot().aiform.record.detail('a1b2c3d4-e5f6-7890-abcd-ef1234567890');
395
822
  console.log('文件详情:', response.data);
396
823
  } catch (error) {
397
824
  console.error('获取文件详情失败:', error.message);
398
825
  }
826
+
827
+ try {
828
+ // 尝试提交反馈
829
+ const response = await cpzxrobot().aiform.record.reply('a1b2c3d4-e5f6-7890-abcd-ef1234567890', '请修正表格格式');
830
+ console.log('反馈提交成功:', response.data);
831
+ } catch (error) {
832
+ console.error('提交反馈失败:', error.message);
833
+ }
834
+
835
+ try {
836
+ // 尝试确认保存
837
+ const response = await cpzxrobot().aiform.record.confirm(123, '| 列1 | 列2 |\n| --- | --- |\n| 值1 | 值2 |');
838
+ console.log('确认保存成功:', response.message);
839
+ } catch (error) {
840
+ console.error('确认保存失败:', error.message);
841
+ }
399
842
  ```
400
843
 
401
844
  ## 完整使用示例
@@ -414,7 +857,7 @@ async function manageAITemplates() {
414
857
  if (listResponse.code === 200) {
415
858
  console.log(`找到 ${listResponse.data.length} 个模板:`);
416
859
  listResponse.data.forEach((template, index) => {
417
- console.log(` ${index + 1}. ${template.name} (ID: ${template.id})`);
860
+ console.log(` ${index + 1}. ${template.name} (ID: ${template.id}, 状态: ${template.status === 2 ? '已解析' : '未解析'})`);
418
861
  });
419
862
  }
420
863
 
@@ -424,7 +867,15 @@ async function manageAITemplates() {
424
867
  factoryId: factoryId,
425
868
  name: "新增测试模板",
426
869
  content: "## 测试模板\n\n这是一个测试模板",
427
- attention: "测试用模板"
870
+ attention: {
871
+ hasFixedContent: false,
872
+ fixedContentList: [],
873
+ hasFixedRowContent: true,
874
+ rowContent: "测试行内容",
875
+ hasFixedColumnContent: false,
876
+ columnContent: "",
877
+ otherNotes: ""
878
+ }
428
879
  });
429
880
  console.log(`新增结果: ${createResponse.message}`);
430
881
 
@@ -448,7 +899,7 @@ async function manageAITemplates() {
448
899
  factoryId: factoryId,
449
900
  name: `${lastTemplate.name} (已更新)`,
450
901
  content: lastTemplate.content + '\n\n更新时间: ' + new Date().toLocaleString(),
451
- attention: lastTemplate.attention + ' - 已更新'
902
+ attention: lastTemplate.attention
452
903
  });
453
904
  console.log(`修改结果: ${updateResponse.message}`);
454
905
  }
@@ -470,6 +921,47 @@ async function manageAITemplates() {
470
921
 
471
922
  // 执行操作
472
923
  manageAITemplates();
924
+
925
+ // 文件上传和解析流程
926
+ async function processFileUpload() {
927
+ try {
928
+ const record = cpzxrobot().aiform.record;
929
+ const templateId = 1;
930
+
931
+ console.log('=== 文件上传和解析流程 ===');
932
+
933
+ // 1. 上传文件
934
+ console.log('\n1. 上传文件:');
935
+ const uploadResponse = await record.upload(templateId, false);
936
+ console.log(`上传成功,业务编码: ${uploadResponse.data.code}`);
937
+
938
+ // 2. 轮询解析状态
939
+ console.log('\n2. 轮询解析状态:');
940
+ await trackFileStatus(templateId, uploadResponse.data.code);
941
+
942
+ // 3. 获取解析结果
943
+ console.log('\n3. 获取解析结果:');
944
+ const detailResponse = await record.detail(uploadResponse.data.code);
945
+ console.log('解析内容:', detailResponse.data.content);
946
+ console.log('访问链接:', detailResponse.data.accessUrl);
947
+
948
+ // 4. 提交反馈(如果需要)
949
+ console.log('\n4. 提交反馈:');
950
+ const replyResponse = await record.reply(uploadResponse.data.code, '请将表格格式调整为标准格式');
951
+ console.log('反馈处理结果:', replyResponse.data.content);
952
+
953
+ // 5. 确认保存
954
+ console.log('\n5. 确认保存:');
955
+ const confirmResponse = await record.confirm(detailResponse.data.id, replyResponse.data.content);
956
+ console.log('确认保存结果:', confirmResponse.message);
957
+
958
+ } catch (error) {
959
+ console.error('流程执行失败:', error.message);
960
+ }
961
+ }
962
+
963
+ // 执行文件处理流程
964
+ // processFileUpload();
473
965
  ```
474
966
 
475
967
  ## 注意事项
@@ -479,6 +971,9 @@ manageAITemplates();
479
971
  3. **参数验证**: 所有必填参数必须提供,否则会抛出错误
480
972
  4. **错误处理**: 建议使用 try-catch 捕获可能的错误
481
973
  5. **网络请求**: 这些接口是异步网络请求,需要使用 `async/await` 或 Promise 处理
974
+ 6. **解析耗时**: 表格图片解析可能耗时较长,建议使用轮询机制监控解析状态
975
+ 7. **文件上传**: 上传表格图片时,模板ID和工厂ID至少需要传一个
976
+ 8. **历史版本**: 模板支持多版本管理,可通过历史接口查看和恢复历史版本
482
977
 
483
978
  ## 版本信息
484
979
 
@@ -487,6 +982,33 @@ manageAITemplates();
487
982
 
488
983
  ## 接口变更说明
489
984
 
490
- - **新增接口**: `cpzxrobot().aiform.record.detail(code)` - 根据文件业务编码获取解析结果详情
491
- - **变更接口**: `cpzxrobot().aiform.record.upload()` - 不再需要传递File参数,改为内部处理文件选择
492
- - **变更接口**: `cpzxrobot().aiform.record.list()` - 返回精简版文件记录,去掉了内容字段
985
+ - **新增接口**: `cpzxrobot().aiform.template.delete(templateId)` - 删除模板
986
+ - **新增接口**: `cpzxrobot().aiform.template.history(templateId)` - 查询模板解析历史快照
987
+ - **新增接口**: `cpzxrobot().aiform.template.publishHistory(templateId, snapshotVersion)` - 按版本号将历史发布到主表
988
+ - **变更接口**: `cpzxrobot().aiform.template.uploadTemplateImage()` - 支持同时传templateId和factoryId,二选一即可
989
+ - **新增接口**: `cpzxrobot().aiform.record.getReplyDetail(replyId)` - 根据reply_id获取解析结果
990
+ - **新增接口**: `cpzxrobot().aiform.record.reply(code, reply)` - 根据解析结果提交反馈
991
+ - **新增接口**: `cpzxrobot().aiform.record.confirm(id, content, headerRowCount?, headers?)` - 用户确认并保存
992
+ - **新增接口**: `cpzxrobot().aiform.record.getReplyList(code)` - 查询文件的reply调整历史
993
+ - **新增接口**: `cpzxrobot().aiform.record.delete(code)` - 根据文件code删除记录
994
+ - **变更接口**: `cpzxrobot().aiform.record.upload()` - 新增watermark参数
995
+ - **变更接口**: `cpzxrobot().aiform.record.list()` - 返回精简版文件记录,包含code字段
996
+ - **变更接口**: `cpzxrobot().aiform.record.detail()` - 返回更详细的解析结果,包含content、unclears、description等字段
997
+
998
+ ## 典型业务流程
999
+
1000
+ 1. **模板管理流程**:
1001
+ - 创建模板:`template.save()` 或通过 `template.uploadTemplateImage()` 上传图片自动创建
1002
+ - 查询模板:`template.list()`
1003
+ - 修改模板:`template.save()`
1004
+ - 删除模板:`template.delete()`
1005
+ - 管理历史版本:`template.history()` 和 `template.publishHistory()`
1006
+
1007
+ 2. **文件解析流程**:
1008
+ - 上传文件:`record.upload()`
1009
+ - 轮询状态:`record.list()`
1010
+ - 获取详情:`record.detail()`
1011
+ - 提交反馈:`record.reply()`
1012
+ - 确认保存:`record.confirm()`
1013
+ - 查询历史:`record.getReplyList()`
1014
+ - 删除记录:`record.delete()`