@cpzxrobot/sdk 1.2.12 → 1.2.14

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/device_gateway.ts CHANGED
@@ -7,6 +7,59 @@ import type {
7
7
  DeviceV2,
8
8
  Factory,
9
9
  } from ".";
10
+
11
+ class DeviceFault {
12
+ category: string;
13
+ time: Date;
14
+ resolved: boolean;
15
+ repeated?: number;
16
+ value?: any;
17
+ message?: string;
18
+
19
+ constructor(params: {
20
+ category: string;
21
+ time: Date;
22
+ resolved: boolean;
23
+ repeated?: number;
24
+ value?: any;
25
+ message?: string;
26
+ });
27
+ constructor(values: string[], columns: string[]);
28
+ constructor(paramsOrValues: any, columns?: string[]) {
29
+ if (Array.isArray(paramsOrValues)) {
30
+ // 处理values和columns的构造函数
31
+ const values = paramsOrValues;
32
+ const params: any = {};
33
+ for (let i = 0; i < columns!.length; i++) {
34
+ const column = columns![i];
35
+ const value = values[i];
36
+
37
+ if (column === 'category') params.category = value;
38
+ else if (column === 'time') params.time = new Date(value);
39
+ else if (column === 'resolved') params.resolved = value === 'true';
40
+ else if (column === 'repeated') params.repeated = parseInt(value);
41
+ else if (column === 'value') params.value = value;
42
+ else if (column === 'message') params.message = value;
43
+ }
44
+
45
+ this.category = params.category;
46
+ this.time = params.time;
47
+ this.resolved = params.resolved;
48
+ this.repeated = params.repeated;
49
+ this.value = params.value;
50
+ this.message = params.message;
51
+ } else {
52
+ // 处理原始对象参数的构造函数
53
+ const params = paramsOrValues;
54
+ this.category = params.category;
55
+ this.time = params.time;
56
+ this.resolved = params.resolved;
57
+ this.repeated = params.repeated;
58
+ this.value = params.value;
59
+ this.message = params.message;
60
+ }
61
+ }
62
+ }
10
63
  import { FeedTowerGateway } from "./device_types/feedtower";
11
64
  import { ElectricMeterGateway } from "./device_types/electricmeter";
12
65
  import { NormalGateway } from "./device_types/normal_type";
@@ -55,7 +108,7 @@ export class DeviceGateway extends Object {
55
108
  workshopId?: number;
56
109
  factoryId?: number;
57
110
  companyId?: number;
58
- },params:any= undefined) => {
111
+ }, params: any = undefined) => {
59
112
  let axios = await this.context.ready;
60
113
  var url = `/api/v2/device/list`;
61
114
  if (params) {
@@ -76,7 +129,7 @@ export class DeviceGateway extends Object {
76
129
  });
77
130
  },
78
131
 
79
- preview: async (type:String, sn:any) => {
132
+ preview: async (type: String, sn: any) => {
80
133
  let axios = await this.context.ready;
81
134
 
82
135
  return axios.get(`/api/v2/device/iotValue/${type}/${sn}`).then((res) => {
@@ -215,11 +268,55 @@ export class DeviceGateway extends Object {
215
268
  return this.normalFilter.getData(id, args);
216
269
  }
217
270
 
218
- async validate(serialNumbers: string[],type: string = "pywl") {
271
+ async validate(serialNumbers: string[], type: string = "pywl") {
219
272
  let axios = await this.context.ready;
220
273
  return axios.post(`/api/v2/device/validateSerialNumber`, {
221
274
  serialNumbers,
222
275
  type,
223
276
  });
224
277
  }
278
+
279
+ async faults(deviceId: number, startTime: Date, endTime: Date): Promise<DeviceFault[]> {
280
+ let axios = await this.context.ready;
281
+ const startTimeRfc3339 = startTime.toISOString();
282
+ const endTimeRfc3339 = endTime.toISOString();
283
+
284
+ const response = await axios.get(
285
+ `/api/v1/device/${deviceId}/faults?start=${startTimeRfc3339}&stop=${endTimeRfc3339}`
286
+ );
287
+
288
+ const json = response.data;
289
+ var faultsData = json.faults as string;
290
+
291
+ // #group,false,false,true,true,false,false,true,true,true,true,true,true
292
+ // #datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,boolean,string,string,string,string,string,string
293
+ // #default,last,,,,,,,,,,,
294
+ // ,result,table,_start,_stop,_time,_value,DeviceId,_field,_measurement,category,field,status
295
+ // ,,0,2025-04-20T22:07:43.623582865Z,2025-04-21T04:07:43.623582865Z,2025-04-21T00:27:00Z,false,004a05c1-7b5b-471c-ab68-f583039ddcfe,bool_value,DeviceStatus,离线报警,online,fault
296
+ // ,,0,2025-04-20T22:07:43.623582865Z,2025-04-21T04:07:43.623582865Z,2025-04-21T00:30:00Z,true,004a05c1-7b5b-471c-ab68-f583039ddcfe,bool_value,DeviceStatus,离线报警,online,fault
297
+ // ,,1,2025-04-20T22:07:43.623582865Z,2025-04-21T04:07:43.623582865Z,2025-04-21T00:27:00Z,false,004a05c1-7b5b-471c-ab68-f583039ddcfe,repeated,DeviceStatus,离线报警,online,fault
298
+ // ,,1,2025-04-20T22:07:43.623582865Z,2025-04-21T04:07:43.623582865Z,2025-04-21T00:30:00Z,false,004a05c1-7b5b-471c-ab68-f583039ddcfe,repeated,DeviceStatus,离线报警,online,fault
299
+ // ,,2,2025-04-20T22:07:43.623582865Z,2025-04-21T04:07:43.623582865Z,2025-04-21T00:27:00Z,false,004a05c1-7b5b-471c-ab68-f583039ddcfe,resolved,DeviceStatus,离线报警,online,fault
300
+ // ,,2,2025-04-20T22:07:43.623582865Z,2025-04-21T04:07:43.623582865Z,2025-04-21T00:30:00Z,true,004a05c1-7b5b-471c-ab68-f583039ddcfe,resolved,DeviceStatus,离线报警,online,fault
301
+
302
+ faultsData = faultsData.replace(/\r/g, "");
303
+ var arr = faultsData.split("\n");
304
+ var inAnnotation = false;
305
+ var columns: string[] = [];
306
+ var faults: DeviceFault[] = [];
307
+ for (var i = 0; i < arr.length; i++) {
308
+ var values = arr[i].split(",");
309
+ if (arr[i].startsWith("#")) {
310
+ } else if (arr[i] != "") {
311
+ if (inAnnotation) {
312
+ inAnnotation = false;
313
+ columns = values;
314
+ } else {
315
+ faults.push(new DeviceFault(values, columns));
316
+ }
317
+ }
318
+ }
319
+ return faults;
320
+
321
+ }
225
322
  }
@@ -1,3 +1,4 @@
1
1
  # 分类型的设备获取类
2
2
 
3
3
  ## 最简易模型参考[这里](./normal.ts)
4
+
@@ -2,6 +2,47 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DeviceGateway = void 0;
4
4
  const device_type_gateway_1 = require("./device_type_gateway");
5
+ class DeviceFault {
6
+ constructor(paramsOrValues, columns) {
7
+ if (Array.isArray(paramsOrValues)) {
8
+ // 处理values和columns的构造函数
9
+ const values = paramsOrValues;
10
+ const params = {};
11
+ for (let i = 0; i < columns.length; i++) {
12
+ const column = columns[i];
13
+ const value = values[i];
14
+ if (column === 'category')
15
+ params.category = value;
16
+ else if (column === 'time')
17
+ params.time = new Date(value);
18
+ else if (column === 'resolved')
19
+ params.resolved = value === 'true';
20
+ else if (column === 'repeated')
21
+ params.repeated = parseInt(value);
22
+ else if (column === 'value')
23
+ params.value = value;
24
+ else if (column === 'message')
25
+ params.message = value;
26
+ }
27
+ this.category = params.category;
28
+ this.time = params.time;
29
+ this.resolved = params.resolved;
30
+ this.repeated = params.repeated;
31
+ this.value = params.value;
32
+ this.message = params.message;
33
+ }
34
+ else {
35
+ // 处理原始对象参数的构造函数
36
+ const params = paramsOrValues;
37
+ this.category = params.category;
38
+ this.time = params.time;
39
+ this.resolved = params.resolved;
40
+ this.repeated = params.repeated;
41
+ this.value = params.value;
42
+ this.message = params.message;
43
+ }
44
+ }
45
+ }
5
46
  const feedtower_1 = require("./device_types/feedtower");
6
47
  const electricmeter_1 = require("./device_types/electricmeter");
7
48
  const normal_type_1 = require("./device_types/normal_type");
@@ -154,5 +195,43 @@ class DeviceGateway extends Object {
154
195
  type,
155
196
  });
156
197
  }
198
+ async faults(deviceId, startTime, endTime) {
199
+ let axios = await this.context.ready;
200
+ const startTimeRfc3339 = startTime.toISOString();
201
+ const endTimeRfc3339 = endTime.toISOString();
202
+ const response = await axios.get(`/api/v1/device/${deviceId}/faults?start=${startTimeRfc3339}&stop=${endTimeRfc3339}`);
203
+ const json = response.data;
204
+ var faultsData = json.faults;
205
+ // #group,false,false,true,true,false,false,true,true,true,true,true,true
206
+ // #datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,boolean,string,string,string,string,string,string
207
+ // #default,last,,,,,,,,,,,
208
+ // ,result,table,_start,_stop,_time,_value,DeviceId,_field,_measurement,category,field,status
209
+ // ,,0,2025-04-20T22:07:43.623582865Z,2025-04-21T04:07:43.623582865Z,2025-04-21T00:27:00Z,false,004a05c1-7b5b-471c-ab68-f583039ddcfe,bool_value,DeviceStatus,离线报警,online,fault
210
+ // ,,0,2025-04-20T22:07:43.623582865Z,2025-04-21T04:07:43.623582865Z,2025-04-21T00:30:00Z,true,004a05c1-7b5b-471c-ab68-f583039ddcfe,bool_value,DeviceStatus,离线报警,online,fault
211
+ // ,,1,2025-04-20T22:07:43.623582865Z,2025-04-21T04:07:43.623582865Z,2025-04-21T00:27:00Z,false,004a05c1-7b5b-471c-ab68-f583039ddcfe,repeated,DeviceStatus,离线报警,online,fault
212
+ // ,,1,2025-04-20T22:07:43.623582865Z,2025-04-21T04:07:43.623582865Z,2025-04-21T00:30:00Z,false,004a05c1-7b5b-471c-ab68-f583039ddcfe,repeated,DeviceStatus,离线报警,online,fault
213
+ // ,,2,2025-04-20T22:07:43.623582865Z,2025-04-21T04:07:43.623582865Z,2025-04-21T00:27:00Z,false,004a05c1-7b5b-471c-ab68-f583039ddcfe,resolved,DeviceStatus,离线报警,online,fault
214
+ // ,,2,2025-04-20T22:07:43.623582865Z,2025-04-21T04:07:43.623582865Z,2025-04-21T00:30:00Z,true,004a05c1-7b5b-471c-ab68-f583039ddcfe,resolved,DeviceStatus,离线报警,online,fault
215
+ faultsData = faultsData.replace(/\r/g, "");
216
+ var arr = faultsData.split("\n");
217
+ var inAnnotation = false;
218
+ var columns = [];
219
+ var faults = [];
220
+ for (var i = 0; i < arr.length; i++) {
221
+ var values = arr[i].split(",");
222
+ if (arr[i].startsWith("#")) {
223
+ }
224
+ else if (arr[i] != "") {
225
+ if (inAnnotation) {
226
+ inAnnotation = false;
227
+ columns = values;
228
+ }
229
+ else {
230
+ faults.push(new DeviceFault(values, columns));
231
+ }
232
+ }
233
+ }
234
+ return faults;
235
+ }
157
236
  }
158
237
  exports.DeviceGateway = DeviceGateway;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cpzxrobot/sdk",
3
- "version": "1.2.12",
3
+ "version": "1.2.14",
4
4
  "description": "提供给上海正芯数智APP第三方H5应用使用的SDK",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
package/readme.md CHANGED
@@ -1,22 +1,618 @@
1
- # 正芯数智SDK
1
+ # 正芯数智SDK 文档
2
2
 
3
+ ## 目录
4
+ - [概述](#概述)
5
+ - [快速开始](#快速开始)
6
+ - [安装](#安装)
7
+ - [初始化](#初始化)
8
+ - [开发环境配置](#开发环境配置)
9
+ - [核心功能模块](#核心功能模块)
10
+ - [接口参考](#接口参考)
11
+ - [工厂管理](#工厂管理)
12
+ - [设备管理](#设备管理)
13
+ - [摄像头管理](#摄像头管理)
14
+ - [保温灯管理](#保温灯管理)
15
+ - [用户管理](#用户管理)
16
+ - [项目管理](#项目管理)
17
+ - [合同管理](#合同管理)
18
+ - [日志管理](#日志管理)
19
+ - [附录](#附录)
20
+ - [通用参数说明](#通用参数说明)
21
+ - [错误处理](#错误处理)
22
+ - [常见错误码](#常见错误码)
23
+
24
+ ## 概述
3
25
  这是提供给上海正芯数智APP第三方H5应用使用的SDK模块,包含相关物联网设备的获取方式和接口功能
4
26
 
5
- ## 1、使用方式
27
+ ## 快速开始
28
+ ### 安装
29
+ ```bash
30
+ npm i @cpzxrobot/sdk
31
+ ```
32
+
33
+ ### 初始化
34
+ ```javascript
35
+ import cpzxrobot from "@cpzxrobot/sdk"
6
36
 
37
+ cpzxrobot({
38
+ devAuth: "从上海正芯获得的开发临时token",
39
+ appCode: "上海正芯分配的App Code",
40
+ selectedFarm: {
41
+ code: "xxxx",
42
+ company_code: "xxxx",
43
+ id: 123456,
44
+ name: "自定义用户测试的工厂,请从后台根据业务选择合适的工厂",
45
+ },
46
+ selectedUnit: {
47
+ id: 123456,
48
+ name: "自定义用户测试的单元,请从后台根据业务选择合适的单元",
49
+ workshopName: 'A栋'
50
+ },
51
+ });
7
52
  ```
8
- npm i @cpzxrobot/sdk
53
+
54
+ ### 开发环境配置
55
+ 如果出现CORS问题,请配置代理:
56
+ ```javascript
57
+ // vite.config.js
58
+ server: {
59
+ proxy: {
60
+ "/api": {
61
+ target: "https://www.cpzxrobot.com/",
62
+ changeOrigin: true,
63
+ },
64
+ },
65
+ }
9
66
  ```
10
67
 
11
- ## 2、开发指南
68
+ ## 核心功能模块
69
+ 1. 工厂管理
70
+ 2. 设备管理
71
+ 3. 摄像头管理
72
+ 4. 料塔管理
73
+ 5. 保温灯管理
74
+ 6. 用户管理
75
+ 7. 项目管理
76
+ 8. 合同管理
77
+ 9. 客户管理
78
+ 10. 公司管理
79
+ 11. 车辆管理
80
+ 12. 新闻管理
81
+ 13. 日志管理
12
82
 
13
- ### 2.1、引入包
83
+ ## 接口参考
84
+ ### 工厂管理
85
+ #### 获取工厂信息
86
+ ```javascript
87
+ cpzxrobot().factory.workshops(factory_id)
88
+ ```
89
+ 参数:
90
+ - factory_id: 工厂id
14
91
 
92
+ #### 获取工厂单元
93
+ ```javascript
94
+ cpzxrobot().factory.units(factory_id)
15
95
  ```
16
- import cpzxrobot from "@cpzxrobot/sdk"
96
+ 参数:
97
+ - factory_id: 工厂id
98
+
99
+ ### 设备管理
100
+ #### 设备基础接口
101
+ ```javascript
102
+ // 获取设备列表
103
+ cpzxrobot().device.list()
104
+
105
+ // 获取单个设备数据
106
+ cpzxrobot().device.data(deviceId)
107
+
108
+ // 验证设备有效性
109
+ cpzxrobot().device.validate(serialNumbers)
110
+
111
+ // 获取设备报警阈值
112
+ cpzxrobot().device.thresholdConfig.list()
113
+
114
+ // 获取设备报警列表
115
+
116
+ ## faults函数说明
117
+
118
+ 获取设备故障记录
119
+
120
+ ### 参数
121
+ - `deviceId`: number - 设备ID
122
+ - `startTime`: Date - 开始时间
123
+ - `endTime`: Date - 结束时间
124
+
125
+ ### 返回值
126
+ Promise<DeviceFault[]> - 按时间排序的故障记录数组
127
+
128
+ ### 使用示例
129
+ ```typescript
130
+ const faults = await cpzxrobot().device.faults(
131
+ 123,
132
+ new Date('2023-01-01'),
133
+ new Date('2023-01-31')
134
+ );
135
+
136
+ faults.forEach(fault => {
137
+ console.log(`时间: ${fault.time}, 类别: ${fault.category}`);
138
+ });
17
139
  ```
18
140
 
19
- ### 2.2、配置开发信息
141
+ ### DeviceFault接口
142
+ ```typescript
143
+ interface DeviceFault {
144
+ category: string; // 故障类别
145
+ time: Date; // 发生时间
146
+ resolved: boolean; // 是否已解决
147
+ repeated?: number; // 重复次数(可选)
148
+ value?: any; // 故障值(可选)
149
+ message?: string; // 故障消息(可选)
150
+ }
151
+ ```
152
+
153
+ #### 料塔设备接口
154
+ ```javascript
155
+ // 获取料塔列表
156
+ cpzxrobot().device.feedTower.list()
157
+ cpzxrobot().device.feedTower.v2.list()
158
+
159
+ // 料塔清零
160
+ cpzxrobot().device.feedTower.v2.adzero(towerId)
161
+
162
+ // 获取料塔统计
163
+ cpzxrobot().device.feedTower.stat(towerId)
164
+
165
+ // 料塔报警参数
166
+ cpzxrobot().device.feedTower.setAlarmParam(params)
167
+ cpzxrobot().device.feedTower.getAlarmParam(towerId)
168
+ cpzxrobot().device.feedTower.updateAlarmParam(params)
169
+ ```
170
+
171
+ #### 设备管理V2接口
172
+ ```javascript
173
+ // 设备增删改查
174
+ cpzxrobot().device.v2.add(deviceInfo)
175
+ cpzxrobot().device.v2.update(deviceInfo)
176
+ cpzxrobot().device.v2.list(params)
177
+ cpzxrobot().device.v2.delete(deviceId)
178
+ ```
179
+
180
+ #### 设备故障记录
181
+ ```javascript
182
+ // 获取设备故障记录
183
+ cpzxrobot().device.faults(deviceId, startTime, endTime)
184
+ ```
185
+
186
+ ### 摄像头管理
187
+ #### 摄像头搜索
188
+ ```javascript
189
+ // 按单元搜索
190
+ cpzxrobot().camera.search({unit_id: unitId})
191
+
192
+ // 按工厂搜索
193
+ cpzxrobot().camera.search({factory_id: factoryId})
194
+
195
+ // 按车间搜索
196
+ cpzxrobot().camera.search({workshop_id: workshopId})
197
+ ```
198
+
199
+ #### 摄像头控制
200
+ ```javascript
201
+ // 控制摄像头移动
202
+ cpzxrobot().camera.control({
203
+ cameraId: string,
204
+ direction: 'left'|'right'|'up'|'down',
205
+ start: boolean, // 开始移动
206
+ stop: boolean // 停止移动
207
+ })
208
+
209
+ // 默认3秒自动停止
210
+ cpzxrobot().camera.control({
211
+ cameraId: string,
212
+ direction: 'left'|'right'|'up'|'down'
213
+ })
214
+ ```
215
+
216
+ #### 摄像头状态获取
217
+ ```javascript
218
+ // 获取摄像头实时画面
219
+ cpzxrobot().camera.liveView(cameraId)
220
+
221
+ // 获取摄像头信息
222
+ cpzxrobot().camera.info(cameraId)
223
+
224
+ // 获取摄像头历史记录
225
+ cpzxrobot().camera.history(cameraId, startTime, endTime)
226
+ ```
227
+
228
+ ### 保温灯管理
229
+ #### 保温灯配置管理
230
+ ```javascript
231
+ // 添加保温灯配置
232
+ cpzxrobot().pigfarm.heatlamp.add(unitId, {
233
+ name: string,
234
+ dayAge: number,
235
+ temperature: number
236
+ })
237
+
238
+ // 获取保温灯列表
239
+ cpzxrobot().pigfarm.heatlamp.list(unitId)
240
+
241
+ // 获取保温灯详情
242
+ cpzxrobot().pigfarm.heatlamp.get(heatlampId)
243
+
244
+ // 更新保温灯配置
245
+ cpzxrobot().pigfarm.heatlamp.update({
246
+ id: number,
247
+ name?: string,
248
+ dayAge?: number,
249
+ temperature?: number
250
+ })
251
+ ```
252
+
253
+ #### 保温灯状态控制
254
+ ```javascript
255
+ // 设置保温灯工作日龄
256
+ cpzxrobot().pigfarm.heatlamp.set(heatlampId, {
257
+ action: "dayage",
258
+ argc: number // 天数
259
+ })
260
+
261
+ // 开关保温灯
262
+ cpzxrobot().pigfarm.heatlamp.switch(heatlampId, {
263
+ action: "on"|"off"
264
+ })
265
+
266
+ // 按单元批量控制
267
+ cpzxrobot().pigfarm.heatlamp.switchByUnit(unitId, {
268
+ action: "on"|"off"
269
+ })
270
+
271
+ // 获取任务状态
272
+ cpzxrobot().pigfarm.heatlamp.taskStatus(taskId)
273
+ ```
274
+
275
+ #### 保温灯模板管理
276
+ ```javascript
277
+ // 添加保温灯模板
278
+ cpzxrobot().pigfarm.heatlamp.template.add({
279
+ name: string,
280
+ stages: Array<{
281
+ dayAge: number,
282
+ temperature: number
283
+ }>
284
+ })
285
+
286
+ // 获取模板列表
287
+ cpzxrobot().pigfarm.heatlamp.template.list()
288
+ ```
289
+
290
+ #### 单元统计信息
291
+ ```javascript
292
+ // 获取单元统计信息
293
+ cpzxrobot().pigfarm.unitStat(unitId)
294
+
295
+ // 获取单元阈值配置
296
+ cpzxrobot().unit.thresholdConfig.get(unitId)
297
+
298
+ // 绑定单元阈值配置
299
+ cpzxrobot().unit.thresholdConfig.bind(unitId, config)
300
+ ```
301
+
302
+ ### 用户管理
303
+ #### 用户基础操作
304
+ ```javascript
305
+ // 添加用户
306
+ cpzxrobot().user.add({
307
+ name: string,
308
+ mobile: string,
309
+ roleId: number,
310
+ factoryId: number
311
+ })
312
+
313
+ // 更新用户信息
314
+ cpzxrobot().user.update(userId, {
315
+ name?: string,
316
+ mobile?: string,
317
+ roleId?: number
318
+ })
319
+
320
+ // 获取用户列表
321
+ cpzxrobot().user.list({
322
+ factoryId: number,
323
+ page?: number,
324
+ size?: number
325
+ })
326
+
327
+ // 获取用户详情
328
+ cpzxrobot().user.info(userId)
329
+
330
+ // 按角色获取用户
331
+ cpzxrobot().user.listByRole({
332
+ companyId: number,
333
+ roleId: number
334
+ })
335
+ ```
336
+
337
+ #### 用户审批流程
338
+ ```javascript
339
+ // 获取审批列表
340
+ cpzxrobot().user.approval.list({
341
+ userId: number,
342
+ status: 'pending'|'approved'|'rejected'
343
+ })
344
+
345
+ // 获取审批数量
346
+ cpzxrobot().user.approval.count({
347
+ userId: number,
348
+ status: 'pending'|'approved'|'rejected'
349
+ })
350
+
351
+ // 提交审批
352
+ cpzxrobot().user.approval.submit({
353
+ userId: number,
354
+ type: string,
355
+ content: string
356
+ })
357
+ ```
358
+
359
+ #### 用户考勤管理
360
+ ```javascript
361
+ // 添加签到记录
362
+ cpzxrobot().user.checkin.add({
363
+ userId: number,
364
+ address: string
365
+ })
366
+
367
+ // 获取签到记录
368
+ cpzxrobot().user.checkin.list({
369
+ userId: number,
370
+ date: string // YYYY-MM-DD
371
+ })
372
+ ```
373
+
374
+ #### 用户工作报告
375
+ ```javascript
376
+ // 获取工作报告列表
377
+ cpzxrobot().user.workReport.list(userId)
378
+
379
+ // 添加工作报告
380
+ cpzxrobot().user.workReport.add({
381
+ userId: number,
382
+ content: string
383
+ })
384
+
385
+ // 更新工作报告
386
+ cpzxrobot().user.workReport.update(reportId, {
387
+ content: string
388
+ })
389
+ ```
390
+
391
+ #### 用户统计分析
392
+ ```javascript
393
+ // 全国用户统计
394
+ cpzxrobot().user.stat.china()
395
+
396
+ // 按地区统计
397
+ cpzxrobot().user.listByProvince(province)
398
+ cpzxrobot().user.listByCity(city)
399
+
400
+ // 部门关系查询
401
+ cpzxrobot().user.position.leader() // 获取领导信息
402
+ cpzxrobot().user.position.team() // 获取下属团队
403
+ ```
404
+
405
+ ### 项目管理
406
+ #### 项目基础信息
407
+ ```javascript
408
+ // 获取项目列表
409
+ cpzxrobot().project.list({
410
+ factoryId: number,
411
+ page?: number,
412
+ size?: number
413
+ })
414
+
415
+ // 获取项目详情
416
+ cpzxrobot().project.get(projectId)
417
+
418
+ // 全国项目统计
419
+ cpzxrobot().project.stat.china()
420
+
421
+ // 按地区统计
422
+ cpzxrobot().project.listByProvince(province)
423
+ ```
424
+
425
+ #### 项目反馈管理
426
+ ```javascript
427
+ // 获取反馈列表
428
+ cpzxrobot().project.feedback.list(projectId)
429
+
430
+ // 添加项目反馈
431
+ cpzxrobot().project.feedback.add({
432
+ projectId: number,
433
+ content: string
434
+ })
435
+
436
+ // 回复项目反馈
437
+ cpzxrobot().project.feedback.reply({
438
+ feedbackId: number,
439
+ content: string
440
+ })
441
+ ```
442
+
443
+ #### 项目询盘管理
444
+ ```javascript
445
+ // 获取询盘列表
446
+ cpzxrobot().project.inquiry.list(projectId)
447
+
448
+ // 添加询盘
449
+ cpzxrobot().project.inquiry.add({
450
+ projectId: number,
451
+ content: string
452
+ })
453
+
454
+ // 询盘审批
455
+ cpzxrobot().project.inquiry.approval({
456
+ inquiryId: number,
457
+ opinion: string
458
+ })
459
+
460
+ // 导出询盘
461
+ cpzxrobot().project.inquiry.export({
462
+ projectId: number,
463
+ fileName?: string
464
+ })
465
+ ```
466
+
467
+ #### 项目资源管理
468
+ ```javascript
469
+ // 获取项目文档
470
+ cpzxrobot().project.document.list(projectId)
471
+
472
+ // 获取物料到货
473
+ cpzxrobot().project.material.list(projectId)
474
+
475
+ // 获取施工队信息
476
+ cpzxrobot().project.constructionTeam.list(projectId)
477
+
478
+ // 获取考勤记录
479
+ cpzxrobot().project.attendance.list(projectId)
480
+ ```
481
+
482
+ #### 项目关联产品
483
+ ```javascript
484
+ // 获取产品列表
485
+ cpzxrobot().product.list({
486
+ factoryId: number,
487
+ page?: number,
488
+ size?: number
489
+ })
490
+
491
+ // 产品报价管理
492
+ cpzxrobot().product.price.list(productId)
493
+ cpzxrobot().product.price.add({
494
+ productId: number,
495
+ price: number,
496
+ currency: string
497
+ })
498
+ ```
499
+
500
+ ### 合同管理
501
+ #### 合同基础操作
502
+ ```javascript
503
+ // 获取合同列表
504
+ cpzxrobot().contract.list({
505
+ factoryId: number,
506
+ page?: number,
507
+ size?: number
508
+ })
509
+
510
+ // 获取合同详情
511
+ cpzxrobot().contract.get(contractId)
512
+
513
+ // 添加合同
514
+ cpzxrobot().contract.add({
515
+ projectId: number,
516
+ contractType: number,
517
+ amount: number,
518
+ startDate: string, // YYYY-MM-DD
519
+ endDate: string, // YYYY-MM-DD
520
+ content: string
521
+ })
522
+
523
+ // 导出合同
524
+ cpzxrobot().contract.export({
525
+ contractId: number,
526
+ fileName?: string
527
+ })
528
+ ```
529
+
530
+ #### 合同审批流程
531
+ ```javascript
532
+ // 提交合同审批
533
+ cpzxrobot().contract.approval({
534
+ contractId: number,
535
+ opinion: string
536
+ })
537
+
538
+ // 重新提交审批
539
+ cpzxrobot().contract.restart({
540
+ contractId: number,
541
+ reason: string
542
+ })
543
+
544
+ // 获取合同类型列表
545
+ cpzxrobot().contract.types(factoryId)
546
+ ```
547
+
548
+ #### 合同关联信息
549
+ ```javascript
550
+ // 获取客户列表
551
+ cpzxrobot().customer.list({
552
+ factoryId: number,
553
+ page?: number,
554
+ size?: number
555
+ })
556
+
557
+ // 获取客户详情
558
+ cpzxrobot().customer.get(customerId)
559
+
560
+ // 添加客户
561
+ cpzxrobot().customer.add({
562
+ name: string,
563
+ type: number,
564
+ contact: string,
565
+ mobile: string,
566
+ factoryId: number
567
+ })
568
+
569
+ // 客户拜访记录
570
+ cpzxrobot().customer.visit.add({
571
+ customerId: number,
572
+ content: string
573
+ })
574
+
575
+ // 获取客户拜访列表
576
+ cpzxrobot().customer.visit.list({
577
+ customerId: number,
578
+ page?: number
579
+ })
580
+ ```
581
+
582
+ #### 公司管理
583
+ ```javascript
584
+ // 获取公司列表
585
+ cpzxrobot().company.list({
586
+ page?: number,
587
+ size?: number
588
+ })
589
+
590
+ // 公司营收统计
591
+ cpzxrobot().company.revenue.list({
592
+ year?: number,
593
+ month?: number
594
+ })
595
+
596
+ // 公司排名
597
+ cpzxrobot().company.rank.byRevenue()
598
+ cpzxrobot().company.rank.byProfit()
599
+ cpzxrobot().company.rank.byOrder()
600
+ ```
601
+
602
+ #### 车辆管理
603
+ ```javascript
604
+ // 全国车辆统计
605
+ cpzxrobot().car.stat.china()
606
+
607
+ // 按地区统计
608
+ cpzxrobot().car.listByProvince(province)
609
+ cpzxrobot().car.listByCity(city)
610
+ cpzxrobot().car.listByDistrict(district)
611
+
612
+ // 获取车辆运单
613
+ cpzxrobot().car.orders(factoryId)
614
+ cpzxrobot().car.ordersByFactory(factoryId)
615
+ ```
20
616
  ```
21
617
  cpzxrobot({
22
618
  devAuth: "从上海正芯获得的开发临时token",
@@ -326,7 +922,7 @@ heatlamp 属性提供了一组方法,用于管理猪场的热灯配置。它
326
922
 
327
923
  1. **获取任务列表**
328
924
  ```typescript
329
- cpzxrobot().task.list(unitId: number)
925
+ cpzxrobot().robot.task.list(unitId: number)
330
926
  ```
331
927
  - 描述:获取指定单元的巡检任务列表
332
928
  - 参数:`unitId` - 单元ID
@@ -335,7 +931,7 @@ heatlamp 属性提供了一组方法,用于管理猪场的热灯配置。它
335
931
 
336
932
  2. **新增任务**
337
933
  ```typescript
338
- cpzxrobot().task.add(data: any)
934
+ cpzxrobot().robot.task.add(data: any)
339
935
  ```
340
936
  - 描述:添加新的巡检任务
341
937
  - 参数:`data` - 包含任务信息的对象
@@ -344,7 +940,7 @@ heatlamp 属性提供了一组方法,用于管理猪场的热灯配置。它
344
940
 
345
941
  3. **修改任务**
346
942
  ```typescript
347
- cpzxrobot().task.update(data: any)
943
+ cpzxrobot().robot.task.update(data: any)
348
944
  ```
349
945
  - 描述:更新现有的巡检任务
350
946
  - 参数:`data` - 包含更新信息的对象
@@ -353,7 +949,7 @@ heatlamp 属性提供了一组方法,用于管理猪场的热灯配置。它
353
949
 
354
950
  4. **删除任务**
355
951
  ```typescript
356
- cpzxrobot().task.delete(id: number)
952
+ cpzxrobot().robot.task.delete(id: number)
357
953
  ```
358
954
  - 描述:删除指定的巡检任务
359
955
  - 参数:`id` - 任务ID
@@ -362,7 +958,7 @@ heatlamp 属性提供了一组方法,用于管理猪场的热灯配置。它
362
958
 
363
959
  5. **下发任务**
364
960
  ```typescript
365
- cpzxrobot().task.dispatch(taskId: number)
961
+ cpzxrobot().robot.task.dispatch(taskId: number)
366
962
  ```
367
963
  - 描述:下发指定的巡检任务
368
964
  - 参数:`taskId` - 任务ID
@@ -373,7 +969,7 @@ heatlamp 属性提供了一组方法,用于管理猪场的热灯配置。它
373
969
 
374
970
  1. **获取巡检结果**
375
971
  ```typescript
376
- cpzxrobot().record.list(taskId: number)
972
+ cpzxrobot().robot.record.list(taskId: number)
377
973
  ```
378
974
  - 描述:获取指定巡检任务的结果列表
379
975
  - 参数:`taskId` - 任务ID
@@ -382,3 +978,119 @@ heatlamp 属性提供了一组方法,用于管理猪场的热灯配置。它
382
978
 
383
979
  注意:对于POST请求的接口,body参数统一使用 `any` 类型,具体参数结构需要根据实际API要求进行定义。
384
980
 
981
+
982
+
983
+ ## 日志管理
984
+ ### 操作日志
985
+ ```javascript
986
+ // 查询操作日志
987
+ cpzxrobot().logs.operations({
988
+ userId?: number,
989
+ module?: string,
990
+ action?: string,
991
+ startTime?: string, // YYYY-MM-DD
992
+ endTime?: string, // YYYY-MM-DD
993
+ page?: number,
994
+ size?: number
995
+ })
996
+
997
+ // 获取设备操作日志
998
+ cpzxrobot().device.logs({
999
+ deviceId: number,
1000
+ startTime?: string,
1001
+ endTime?: string
1002
+ })
1003
+ ```
1004
+
1005
+ ### 报警日志
1006
+ ```javascript
1007
+ // 添加报警信息
1008
+ cpzxrobot().news.alarm.add({
1009
+ deviceId: number,
1010
+ type: string,
1011
+ level: 'info'|'warning'|'error',
1012
+ message: string
1013
+ })
1014
+
1015
+ // 获取报警列表
1016
+ cpzxrobot().news.alarm.list({
1017
+ deviceId?: number,
1018
+ type?: string,
1019
+ resolved?: boolean,
1020
+ startTime?: string,
1021
+ endTime?: string,
1022
+ page?: number,
1023
+ size?: number
1024
+ })
1025
+
1026
+ // 标记报警为已处理
1027
+ cpzxrobot().news.alarm.resolve(alarmId)
1028
+ ```
1029
+
1030
+ ### 系统日志
1031
+ ```javascript
1032
+ // 获取系统运行日志
1033
+ cpzxrobot().logs.system({
1034
+ level?: 'info'|'warning'|'error',
1035
+ startTime?: string,
1036
+ endTime?: string,
1037
+ page?: number,
1038
+ size?: number
1039
+ })
1040
+
1041
+ // 获取API调用日志
1042
+ cpzxrobot().logs.api({
1043
+ path?: string,
1044
+ statusCode?: number,
1045
+ startTime?: string,
1046
+ endTime?: string
1047
+ })
1048
+
1049
+ // 获取登录日志
1050
+ cpzxrobot().logs.login({
1051
+ userId?: number,
1052
+ success?: boolean,
1053
+ startTime?: string,
1054
+ endTime?: string
1055
+ })
1056
+ ```
1057
+
1058
+ ### 巡检任务日志
1059
+ ```javascript
1060
+ // 获取巡检任务日志
1061
+ cpzxrobot().robot.task.logs({
1062
+ taskId?: number,
1063
+ unitId?: number,
1064
+ status?: 'pending'|'in_progress'|'completed'|'failed',
1065
+ startTime?: string,
1066
+ endTime?: string
1067
+ })
1068
+
1069
+ // 获取巡检记录详情
1070
+ cpzxrobot().robot.record.details(recordId)
1071
+ ```
1072
+
1073
+ ## 附录
1074
+ ### 通用参数说明
1075
+ - 所有列表查询接口都支持以下分页参数:
1076
+ - page: 页码(从1开始)
1077
+ - size: 每页数量(默认10)
1078
+ - 时间范围参数格式: YYYY-MM-DD
1079
+ - 所有ID参数均为数字类型
1080
+
1081
+ ### 错误处理
1082
+ 所有接口调用错误都会返回统一格式:
1083
+ ```javascript
1084
+ {
1085
+ code: number, // 错误码
1086
+ message: string, // 错误信息
1087
+ details?: any // 错误详情(可选)
1088
+ }
1089
+ ```
1090
+
1091
+ ### 常见错误码
1092
+ - 400: 参数错误
1093
+ - 401: 未授权
1094
+ - 403: 权限不足
1095
+ - 404: 资源不存在
1096
+ - 500: 服务器错误