@cpzxrobot/sdk 1.3.113 → 1.3.115

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,254 @@
1
+ # AI报表模板接口使用说明
2
+
3
+ ## 概述
4
+
5
+ AI报表模板接口用于管理工厂的AI报表模板,包括查询模板列表、新增和修改模板等功能。
6
+
7
+ ## 接口基础信息
8
+
9
+ **Base URL**: `/api/v2/aiform/template`
10
+
11
+ ## 如何使用
12
+
13
+ 通过 `cpzxrobot().aiform.template` 访问AI报表模板相关功能。
14
+
15
+ ## 可用方法
16
+
17
+ ### 1. 查询模板列表
18
+
19
+ **方法**: `list(factoryId: number): Promise<AiformTemplateListResponse>`
20
+
21
+ **接口路径**: `GET /api/v2/aiform/template/list/{factoryId}`
22
+
23
+ **功能**: 根据工厂ID查询该工厂下的所有AI报表模板
24
+
25
+ **参数**:
26
+ - `factoryId` (number): 工厂ID,必填
27
+
28
+ **返回值**:
29
+ ```typescript
30
+ interface AiformTemplateListResponse {
31
+ code: number; // 状态码
32
+ message: string; // 提示信息
33
+ data: AiformTemplate[]; // 模板列表
34
+ }
35
+
36
+ interface AiformTemplate {
37
+ id: number; // 模板ID
38
+ factoryId: number; // 工厂ID
39
+ name: string; // 模板名称
40
+ content: string; // 模板内容
41
+ attention?: string; // 注意事项
42
+ }
43
+ ```
44
+
45
+ **使用示例**:
46
+
47
+ ```javascript
48
+ // 查询工厂1001的模板列表
49
+ const response = await cpzxrobot().aiform.template.list(1001);
50
+
51
+ if (response.code === 200) {
52
+ const templates = response.data;
53
+ console.log(`找到 ${templates.length} 个模板:`);
54
+
55
+ templates.forEach(template => {
56
+ console.log(`ID: ${template.id}, 名称: ${template.name}`);
57
+ console.log(`内容: ${template.content.substring(0, 100)}...`);
58
+ if (template.attention) {
59
+ console.log(`注意事项: ${template.attention}`);
60
+ }
61
+ });
62
+ } else {
63
+ console.error('获取模板列表失败:', response.message);
64
+ }
65
+ ```
66
+
67
+ ### 2. 新增或修改模板
68
+
69
+ **方法**: `save(request: AiformTemplateSaveRequest): Promise<AiformTemplateSaveResponse>`
70
+
71
+ **接口路径**: `POST /api/v2/aiform/template/save`
72
+
73
+ **功能**: 新增或修改AI报表模板。当请求体中包含 `id` 时执行修改操作,不包含 `id` 时执行新增操作。
74
+
75
+ **请求参数**:
76
+ ```typescript
77
+ interface AiformTemplateSaveRequest {
78
+ id?: number; // 模板ID(传则修改,不传则新增)
79
+ factoryId: number; // 工厂ID,必填
80
+ name: string; // 模板名称,必填
81
+ content: string; // 模板内容,必填
82
+ attention?: string; // 注意事项,可选
83
+ }
84
+ ```
85
+
86
+ **返回值**:
87
+ ```typescript
88
+ interface AiformTemplateSaveResponse {
89
+ code: number; // 状态码
90
+ message: string; // 提示信息
91
+ }
92
+ ```
93
+
94
+ **使用示例**:
95
+
96
+ #### 新增模板
97
+
98
+ ```javascript
99
+ // 新增模板
100
+ const response = await cpzxrobot().aiform.template.save({
101
+ factoryId: 1001,
102
+ name: "生产日报模板",
103
+ content: "## 生产日报\n\n日期: {{date}}\n\n产量: {{production}}\n\n质量: {{quality}}",
104
+ attention: "请确保填写真实数据"
105
+ });
106
+
107
+ if (response.code === 200) {
108
+ console.log('模板创建成功');
109
+ } else {
110
+ console.error('模板创建失败:', response.message);
111
+ }
112
+ ```
113
+
114
+ #### 修改模板
115
+
116
+ ```javascript
117
+ // 修改模板
118
+ const response = await cpzxrobot().aiform.template.save({
119
+ id: 1, // 模板ID
120
+ factoryId: 1001,
121
+ name: "生产日报模板(更新版)",
122
+ content: "## 生产日报\n\n日期: {{date}}\n\n产量: {{production}}\n\n质量: {{quality}}\n\n备注: {{remark}}",
123
+ attention: "请确保填写真实数据,新增加了备注字段"
124
+ });
125
+
126
+ if (response.code === 200) {
127
+ console.log('模板更新成功');
128
+ } else {
129
+ console.error('模板更新失败:', response.message);
130
+ }
131
+ ```
132
+
133
+ ## 错误处理
134
+
135
+ ### 常见错误
136
+
137
+ 1. **参数验证错误**:
138
+ - `工厂ID不能为空` - 未提供factoryId参数
139
+ - `模板名称不能为空` - 未提供name参数
140
+ - `模板内容不能为空` - 未提供content参数
141
+
142
+ 2. **API错误**:
143
+ - 当API返回非200状态码时,会抛出包含错误信息的异常
144
+
145
+ ### 错误处理示例
146
+
147
+ ```javascript
148
+ try {
149
+ // 尝试获取模板列表
150
+ const response = await cpzxrobot().aiform.template.list(1001);
151
+ console.log('模板列表:', response.data);
152
+ } catch (error) {
153
+ console.error('操作失败:', error.message);
154
+ }
155
+
156
+ try {
157
+ // 尝试保存模板
158
+ const response = await cpzxrobot().aiform.template.save({
159
+ factoryId: 1001,
160
+ name: "测试模板",
161
+ content: "模板内容"
162
+ });
163
+ console.log('保存成功:', response.message);
164
+ } catch (error) {
165
+ console.error('保存失败:', error.message);
166
+ }
167
+ ```
168
+
169
+ ## 完整使用示例
170
+
171
+ ```javascript
172
+ async function manageAITemplates() {
173
+ try {
174
+ const aiform = cpzxrobot().aiform.template;
175
+ const factoryId = 1001;
176
+
177
+ console.log('=== 管理AI报表模板 ===');
178
+
179
+ // 1. 获取模板列表
180
+ console.log('\n1. 获取模板列表:');
181
+ const listResponse = await aiform.list(factoryId);
182
+ if (listResponse.code === 200) {
183
+ console.log(`找到 ${listResponse.data.length} 个模板:`);
184
+ listResponse.data.forEach((template, index) => {
185
+ console.log(` ${index + 1}. ${template.name} (ID: ${template.id})`);
186
+ });
187
+ }
188
+
189
+ // 2. 新增模板
190
+ console.log('\n2. 新增模板:');
191
+ const createResponse = await aiform.save({
192
+ factoryId: factoryId,
193
+ name: "新增测试模板",
194
+ content: "## 测试模板\n\n这是一个测试模板",
195
+ attention: "测试用模板"
196
+ });
197
+ console.log(`新增结果: ${createResponse.message}`);
198
+
199
+ // 3. 再次获取模板列表
200
+ console.log('\n3. 再次获取模板列表:');
201
+ const updatedListResponse = await aiform.list(factoryId);
202
+ if (updatedListResponse.code === 200) {
203
+ console.log(`现在有 ${updatedListResponse.data.length} 个模板:`);
204
+ updatedListResponse.data.forEach((template, index) => {
205
+ console.log(` ${index + 1}. ${template.name} (ID: ${template.id})`);
206
+ });
207
+ }
208
+
209
+ // 4. 修改最后一个模板
210
+ if (updatedListResponse.data.length > 0) {
211
+ const lastTemplate = updatedListResponse.data[updatedListResponse.data.length - 1];
212
+ console.log(`\n4. 修改模板: ${lastTemplate.name}`);
213
+
214
+ const updateResponse = await aiform.save({
215
+ id: lastTemplate.id,
216
+ factoryId: factoryId,
217
+ name: `${lastTemplate.name} (已更新)`,
218
+ content: lastTemplate.content + '\n\n更新时间: ' + new Date().toLocaleString(),
219
+ attention: lastTemplate.attention + ' - 已更新'
220
+ });
221
+ console.log(`修改结果: ${updateResponse.message}`);
222
+ }
223
+
224
+ // 5. 最终模板列表
225
+ console.log('\n5. 最终模板列表:');
226
+ const finalListResponse = await aiform.list(factoryId);
227
+ if (finalListResponse.code === 200) {
228
+ console.log(`最终有 ${finalListResponse.data.length} 个模板:`);
229
+ finalListResponse.data.forEach((template, index) => {
230
+ console.log(` ${index + 1}. ${template.name} (ID: ${template.id})`);
231
+ });
232
+ }
233
+
234
+ } catch (error) {
235
+ console.error('操作失败:', error.message);
236
+ }
237
+ }
238
+
239
+ // 执行操作
240
+ manageAITemplates();
241
+ ```
242
+
243
+ ## 注意事项
244
+
245
+ 1. **权限要求**: 使用这些接口需要具有相应的工厂管理权限
246
+ 2. **模板内容**: 模板内容支持使用模板变量(如 `{{date}}`),具体变量格式请参考AI报表系统的相关文档
247
+ 3. **参数验证**: 所有必填参数必须提供,否则会抛出错误
248
+ 4. **错误处理**: 建议使用 try-catch 捕获可能的错误
249
+ 5. **网络请求**: 这些接口是异步网络请求,需要使用 `async/await` 或 Promise 处理
250
+
251
+ ## 版本信息
252
+
253
+ - **SDK版本**: 1.3.113+
254
+ - **接口版本**: v2
@@ -0,0 +1,126 @@
1
+ import type {
2
+ Cpzxrobot,
3
+ AiformTemplateListResponse,
4
+ AiformTemplateSaveRequest,
5
+ AiformTemplateSaveResponse,
6
+ AiformFileUploadResponse,
7
+ AiformFileListResponse,
8
+ } from ".";
9
+
10
+ export class AiformGateway extends Object {
11
+ context: Cpzxrobot
12
+
13
+ constructor(context: Cpzxrobot) {
14
+ super()
15
+ this.context = context
16
+ }
17
+
18
+ get template() {
19
+ return {
20
+ /**
21
+ * 按工厂ID查询模板列表
22
+ * @param factoryId 工厂ID
23
+ * @returns Promise 包含模板列表
24
+ */
25
+ list: async (factoryId?: number): Promise<AiformTemplateListResponse> => {
26
+ const axios = await this.context.ready;
27
+
28
+ // 参数验证
29
+ if (!factoryId) {
30
+ var selectedFarm = await this.context.user.getSelectedFarm();
31
+ factoryId = selectedFarm.id;
32
+ }
33
+
34
+ return axios.get(`/api/v2/aiform/template/list/${factoryId}`).then((res) => {
35
+ if (res.data.code !== 200) {
36
+ throw new Error(res.data.message || '获取模板列表失败');
37
+ }
38
+ return res.data;
39
+ });
40
+ },
41
+
42
+ /**
43
+ * 新增或修改模板
44
+ * @param request 模板保存请求参数
45
+ * @returns Promise 包含保存结果
46
+ */
47
+ save: async (request: AiformTemplateSaveRequest): Promise<AiformTemplateSaveResponse> => {
48
+ const axios = await this.context.ready;
49
+
50
+ // 参数验证
51
+ if (!request.factoryId) {
52
+ var selectedFarm = await this.context.user.getSelectedFarm();
53
+ request.factoryId = selectedFarm.id;
54
+ }
55
+ if (!request.name) {
56
+ throw new Error('模板名称不能为空');
57
+ }
58
+ if (!request.content) {
59
+ throw new Error('模板内容不能为空');
60
+ }
61
+
62
+ return axios.post(`/api/v2/aiform/template/save`, request).then((res) => {
63
+ if (res.data.code !== 200) {
64
+ throw new Error(res.data.message || '保存模板失败');
65
+ }
66
+ return res.data;
67
+ });
68
+ },
69
+ };
70
+ }
71
+
72
+ get record() {
73
+ return {
74
+ /**
75
+ * 上传表格图片
76
+ * @param file 表格图片文件
77
+ * @param templateId 关联的模板ID
78
+ * @returns Promise 包含文件记录信息
79
+ */
80
+ upload: async (file: File, templateId: number): Promise<AiformFileUploadResponse> => {
81
+ const axios = await this.context.ready;
82
+
83
+ // 参数验证
84
+ if (!file) {
85
+ throw new Error('文件不能为空');
86
+ }
87
+ if (!templateId) {
88
+ throw new Error('模板ID不能为空');
89
+ }
90
+
91
+ return axios.upload(`/api/v2/aiform/file/upload`,{
92
+ title: "请选择要解析的表格图片",
93
+ data: {
94
+ templateId,
95
+ }
96
+ }).then((res) => {
97
+ if (res.data.code !== 200) {
98
+ throw new Error(res.data.message || '上传文件失败');
99
+ }
100
+ return res.data;
101
+ });
102
+ },
103
+
104
+ /**
105
+ * 根据模板ID查询上传记录
106
+ * @param templateId 模板ID
107
+ * @returns Promise 包含文件记录列表
108
+ */
109
+ list: async (templateId: number): Promise<AiformFileListResponse> => {
110
+ const axios = await this.context.ready;
111
+
112
+ // 参数验证
113
+ if (!templateId) {
114
+ throw new Error('模板ID不能为空');
115
+ }
116
+
117
+ return axios.get(`/api/v2/aiform/file/list/${templateId}`).then((res) => {
118
+ if (res.data.code !== 200) {
119
+ throw new Error(res.data.message || '获取文件列表失败');
120
+ }
121
+ return res.data;
122
+ });
123
+ },
124
+ };
125
+ }
126
+ }
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AiformGateway = void 0;
13
+ class AiformGateway extends Object {
14
+ constructor(context) {
15
+ super();
16
+ this.context = context;
17
+ }
18
+ get template() {
19
+ return {
20
+ /**
21
+ * 按工厂ID查询模板列表
22
+ * @param factoryId 工厂ID
23
+ * @returns Promise 包含模板列表
24
+ */
25
+ list: (factoryId) => __awaiter(this, void 0, void 0, function* () {
26
+ const axios = yield this.context.ready;
27
+ // 参数验证
28
+ if (!factoryId) {
29
+ var selectedFarm = yield this.context.user.getSelectedFarm();
30
+ factoryId = selectedFarm.id;
31
+ }
32
+ return axios.get(`/api/v2/aiform/template/list/${factoryId}`).then((res) => {
33
+ if (res.data.code !== 200) {
34
+ throw new Error(res.data.message || '获取模板列表失败');
35
+ }
36
+ return res.data;
37
+ });
38
+ }),
39
+ /**
40
+ * 新增或修改模板
41
+ * @param request 模板保存请求参数
42
+ * @returns Promise 包含保存结果
43
+ */
44
+ save: (request) => __awaiter(this, void 0, void 0, function* () {
45
+ const axios = yield this.context.ready;
46
+ // 参数验证
47
+ if (!request.factoryId) {
48
+ var selectedFarm = yield this.context.user.getSelectedFarm();
49
+ request.factoryId = selectedFarm.id;
50
+ }
51
+ if (!request.name) {
52
+ throw new Error('模板名称不能为空');
53
+ }
54
+ if (!request.content) {
55
+ throw new Error('模板内容不能为空');
56
+ }
57
+ return axios.post(`/api/v2/aiform/template/save`, request).then((res) => {
58
+ if (res.data.code !== 200) {
59
+ throw new Error(res.data.message || '保存模板失败');
60
+ }
61
+ return res.data;
62
+ });
63
+ }),
64
+ };
65
+ }
66
+ get record() {
67
+ return {
68
+ /**
69
+ * 上传表格图片
70
+ * @param file 表格图片文件
71
+ * @param templateId 关联的模板ID
72
+ * @returns Promise 包含文件记录信息
73
+ */
74
+ upload: (file, templateId) => __awaiter(this, void 0, void 0, function* () {
75
+ const axios = yield this.context.ready;
76
+ // 参数验证
77
+ if (!file) {
78
+ throw new Error('文件不能为空');
79
+ }
80
+ if (!templateId) {
81
+ throw new Error('模板ID不能为空');
82
+ }
83
+ return axios.upload(`/api/v2/aiform/file/upload`, {
84
+ title: "请选择要解析的表格图片",
85
+ data: {
86
+ templateId,
87
+ }
88
+ }).then((res) => {
89
+ if (res.data.code !== 200) {
90
+ throw new Error(res.data.message || '上传文件失败');
91
+ }
92
+ return res.data;
93
+ });
94
+ }),
95
+ /**
96
+ * 根据模板ID查询上传记录
97
+ * @param templateId 模板ID
98
+ * @returns Promise 包含文件记录列表
99
+ */
100
+ list: (templateId) => __awaiter(this, void 0, void 0, function* () {
101
+ const axios = yield this.context.ready;
102
+ // 参数验证
103
+ if (!templateId) {
104
+ throw new Error('模板ID不能为空');
105
+ }
106
+ return axios.get(`/api/v2/aiform/file/list/${templateId}`).then((res) => {
107
+ if (res.data.code !== 200) {
108
+ throw new Error(res.data.message || '获取文件列表失败');
109
+ }
110
+ return res.data;
111
+ });
112
+ }),
113
+ };
114
+ }
115
+ }
116
+ exports.AiformGateway = AiformGateway;
package/dist/index.js CHANGED
@@ -55,6 +55,7 @@ const production_gateway_1 = require("./production_gateway");
55
55
  const purchase_gateway_1 = require("./purchase_gateway");
56
56
  const warehouse_gateway_1 = require("./warehouse_gateway");
57
57
  const sparepart_gateway_1 = require("./sparepart_gateway");
58
+ const aiform_gateway_1 = require("./aiform_gateway");
58
59
  class Cpzxrobot {
59
60
  constructor(appCode, baseUrl, initSelectedFactory, initSelectedUnit) {
60
61
  this.pigfarm = new pigfarm_gateway_1.PigfarmGateway(this);
@@ -76,6 +77,7 @@ class Cpzxrobot {
76
77
  this.construction = new construction_gateway_1.ConstructionGateway(this);
77
78
  this.system = new system_gateway_1.SystemGateway(this);
78
79
  this.production = new production_gateway_1.ProductionGateway(this);
80
+ this.aiform = new aiform_gateway_1.AiformGateway(this);
79
81
  this.sseCallbacks = {};
80
82
  //获取当前浏览器的域名
81
83
  this.ready = new Promise((resolve, reject) => {
package/index.ts CHANGED
@@ -30,6 +30,7 @@ import { ProductionGateway } from "./production_gateway";
30
30
  import { PurchaseGateway } from "./purchase_gateway";
31
31
  import { WarehouseGateway } from "./warehouse_gateway";
32
32
  import { SparePartGateway } from "./sparepart_gateway";
33
+ import { AiformGateway } from "./aiform_gateway";
33
34
 
34
35
  export class Cpzxrobot {
35
36
  private static factorySelectorLoaded = false;
@@ -74,6 +75,7 @@ export class Cpzxrobot {
74
75
  purchase!: PurchaseGateway;
75
76
  warehouse!: WarehouseGateway;
76
77
  sparepart!: SparePartGateway;
78
+ aiform: AiformGateway = new AiformGateway(this);
77
79
  sseCallbacks: {
78
80
  [key: string]: (data: any) => void;
79
81
  } = {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cpzxrobot/sdk",
3
- "version": "1.3.113",
3
+ "version": "1.3.115",
4
4
  "description": "提供给上海正芯数智APP第三方H5应用使用的SDK",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
package/types.d.ts CHANGED
@@ -805,6 +805,118 @@ interface ActivatedFactoriesResponse {
805
805
  message: string;
806
806
  }
807
807
 
808
+ /**
809
+ * AI报表模板接口
810
+ */
811
+ interface AiformTemplate {
812
+ /** 模板ID */
813
+ id: number;
814
+ /** 工厂ID */
815
+ factoryId: number;
816
+ /** 模板名称 */
817
+ name: string;
818
+ /** 模板内容 */
819
+ content: string;
820
+ /** 注意事项 */
821
+ attention?: string;
822
+ }
823
+
824
+ /**
825
+ * AI报表模板列表响应接口
826
+ */
827
+ interface AiformTemplateListResponse {
828
+ /** 响应码 */
829
+ code: number;
830
+ /** 提示信息 */
831
+ message: string;
832
+ /** 模板列表 */
833
+ data: AiformTemplate[];
834
+ }
835
+
836
+ /**
837
+ * AI报表模板保存请求接口
838
+ */
839
+ interface AiformTemplateSaveRequest {
840
+ /** 模板ID(传则修改,不传则新增) */
841
+ id?: number;
842
+ /** 工厂ID */
843
+ factoryId: number;
844
+ /** 模板名称 */
845
+ name: string;
846
+ /** 模板内容 */
847
+ content: string;
848
+ /** 注意事项 */
849
+ attention?: string;
850
+ }
851
+
852
+ /**
853
+ * AI报表模板保存响应接口
854
+ */
855
+ interface AiformTemplateSaveResponse {
856
+ /** 响应码 */
857
+ code: number;
858
+ /** 提示信息 */
859
+ message: string;
860
+ }
861
+
862
+ /**
863
+ * 文件记录接口(通用文件表 app_v2_file)
864
+ */
865
+ interface File {
866
+ /** 文件记录ID */
867
+ id: number;
868
+ /** 业务编码 */
869
+ code?: string;
870
+ /** 关联业务ID(此处为模板ID) */
871
+ tableKey: number;
872
+ /** 关联业务表名(固定值 aiform_template) */
873
+ tableName: string;
874
+ /** 原始文件名 */
875
+ fileName: string;
876
+ /** 存储文件名(系统统一生成) */
877
+ storageName: string;
878
+ /** MinIO存储路径 */
879
+ fileUrl: string;
880
+ /** 预签名访问链接(动态生成,有效期7天,不存数据库) */
881
+ accessUrl: string;
882
+ /** 文件扩展名 */
883
+ fileExt: string;
884
+ /** 存储服务(minio) */
885
+ server: string;
886
+ /** 文件类型(image) */
887
+ type: string;
888
+ /** 状态:0-已上传 1-解析中 2-已解析 */
889
+ status: number;
890
+ /** 创建时间 */
891
+ createTime: string;
892
+ /** 更新时间 */
893
+ updateTime: string;
894
+ }
895
+
896
+ /**
897
+ * 文件上传响应接口
898
+ */
899
+ interface AiformFileUploadResponse {
900
+ /** 响应码 */
901
+ code: number;
902
+ /** 提示信息 */
903
+ message: string;
904
+ /** 文件记录 */
905
+ data: File;
906
+ }
907
+
908
+ /**
909
+ * 文件列表响应接口
910
+ */
911
+ interface AiformFileListResponse {
912
+ /** 响应码 */
913
+ code: number;
914
+ /** 提示信息 */
915
+ message: string;
916
+ /** 文件记录列表 */
917
+ data: File[];
918
+ }
919
+
808
920
  declare class Cpzxrobot {
809
921
  transport: TransportGateway;
810
922
  ready: Promise<MyAxiosInstance>;
@@ -908,6 +1020,13 @@ declare module "@cpzxrobot/sdk" {
908
1020
  ActiveAlarmRuleRequest,
909
1021
  ActiveAlarmRuleResponse,
910
1022
  ActivatedFactoriesResponse,
1023
+ AiformTemplate,
1024
+ AiformTemplateListResponse,
1025
+ AiformTemplateSaveRequest,
1026
+ AiformTemplateSaveResponse,
1027
+ File,
1028
+ AiformFileUploadResponse,
1029
+ AiformFileListResponse,
911
1030
  AlarmRuleDetail,
912
1031
  AlarmRuleListResponse,
913
1032
  AlarmRuleDetailResponse,