@wdywdy/electric-open-platform 0.0.0-stage → 1.0.0
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/LICENSE +21 -0
- package/README.md +585 -2
- package/dist/cjs/client.js +173 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/core/api.js +518 -0
- package/dist/cjs/core/api.js.map +1 -0
- package/dist/cjs/core/auth.js +293 -0
- package/dist/cjs/core/auth.js.map +1 -0
- package/dist/cjs/core/crypto.js +160 -0
- package/dist/cjs/core/crypto.js.map +1 -0
- package/dist/cjs/core/errors.js +114 -0
- package/dist/cjs/core/errors.js.map +1 -0
- package/dist/cjs/core/http.js +70 -0
- package/dist/cjs/core/http.js.map +1 -0
- package/dist/cjs/core/models.js +105 -0
- package/dist/cjs/core/models.js.map +1 -0
- package/dist/cjs/core/push.js +79 -0
- package/dist/cjs/core/push.js.map +1 -0
- package/dist/cjs/core/router.js +124 -0
- package/dist/cjs/core/router.js.map +1 -0
- package/dist/cjs/core/runtime.js +37 -0
- package/dist/cjs/core/runtime.js.map +1 -0
- package/dist/cjs/core/sign.js +75 -0
- package/dist/cjs/core/sign.js.map +1 -0
- package/dist/cjs/core/storage.js +152 -0
- package/dist/cjs/core/storage.js.map +1 -0
- package/dist/cjs/core/transport-fetch.js +57 -0
- package/dist/cjs/core/transport-fetch.js.map +1 -0
- package/dist/cjs/core/transport.js +41 -0
- package/dist/cjs/core/transport.js.map +1 -0
- package/dist/cjs/core/types.js +5 -0
- package/dist/cjs/core/types.js.map +1 -0
- package/dist/cjs/index.js +111 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/esm/client.d.ts +73 -0
- package/dist/esm/client.js +169 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/core/api.d.ts +377 -0
- package/dist/esm/core/api.js +506 -0
- package/dist/esm/core/api.js.map +1 -0
- package/dist/esm/core/auth.d.ts +69 -0
- package/dist/esm/core/auth.js +289 -0
- package/dist/esm/core/auth.js.map +1 -0
- package/dist/esm/core/crypto.d.ts +24 -0
- package/dist/esm/core/crypto.js +154 -0
- package/dist/esm/core/crypto.js.map +1 -0
- package/dist/esm/core/errors.d.ts +86 -0
- package/dist/esm/core/errors.js +108 -0
- package/dist/esm/core/errors.js.map +1 -0
- package/dist/esm/core/http.d.ts +24 -0
- package/dist/esm/core/http.js +56 -0
- package/dist/esm/core/http.js.map +1 -0
- package/dist/esm/core/models.d.ts +441 -0
- package/dist/esm/core/models.js +102 -0
- package/dist/esm/core/models.js.map +1 -0
- package/dist/esm/core/push.d.ts +54 -0
- package/dist/esm/core/push.js +74 -0
- package/dist/esm/core/push.js.map +1 -0
- package/dist/esm/core/router.d.ts +44 -0
- package/dist/esm/core/router.js +120 -0
- package/dist/esm/core/router.js.map +1 -0
- package/dist/esm/core/runtime.d.ts +23 -0
- package/dist/esm/core/runtime.js +33 -0
- package/dist/esm/core/runtime.js.map +1 -0
- package/dist/esm/core/sign.d.ts +54 -0
- package/dist/esm/core/sign.js +67 -0
- package/dist/esm/core/sign.js.map +1 -0
- package/dist/esm/core/storage.d.ts +73 -0
- package/dist/esm/core/storage.js +141 -0
- package/dist/esm/core/storage.js.map +1 -0
- package/dist/esm/core/transport-fetch.d.ts +2 -0
- package/dist/esm/core/transport-fetch.js +54 -0
- package/dist/esm/core/transport-fetch.js.map +1 -0
- package/dist/esm/core/transport.d.ts +23 -0
- package/dist/esm/core/transport.js +36 -0
- package/dist/esm/core/transport.js.map +1 -0
- package/dist/esm/core/types.d.ts +76 -0
- package/dist/esm/core/types.js +2 -0
- package/dist/esm/core/types.js.map +1 -0
- package/dist/esm/index.d.ts +37 -0
- package/dist/esm/index.js +47 -0
- package/dist/esm/index.js.map +1 -0
- package/package.json +63 -4
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ThirdPartyDeviceApi = exports.SceneApi = exports.StatsApi = exports.AlarmApi = exports.ControlApi = exports.ChannelApi = exports.BoxApi = exports.ProjectApi = void 0;
|
|
4
|
+
exports.parseThirdPartyData = parseThirdPartyData;
|
|
5
|
+
const models_js_1 = require("./models.js");
|
|
6
|
+
/** Shared helpers so every module treats `projectCode` and limits identically. */
|
|
7
|
+
class ApiBase {
|
|
8
|
+
constructor(client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
call(method, params = {}, projectCode) {
|
|
12
|
+
return this.client.call(method, { params, projectCode });
|
|
13
|
+
}
|
|
14
|
+
/** Normalises a comma list / array into the platform's comma-joined string. */
|
|
15
|
+
static list(value) {
|
|
16
|
+
if (value === undefined)
|
|
17
|
+
return undefined;
|
|
18
|
+
const arr = Array.isArray(value) ? value : value.split(',');
|
|
19
|
+
const cleaned = arr.map((s) => s.trim()).filter(Boolean);
|
|
20
|
+
if (cleaned.length === 0)
|
|
21
|
+
return undefined;
|
|
22
|
+
return cleaned.join(',');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** 项目信息:GET_PROJECT_INFO / MODIFY_PROJECT_INFO */
|
|
26
|
+
class ProjectApi extends ApiBase {
|
|
27
|
+
getInfo(projectCode) {
|
|
28
|
+
return this.call('GET_PROJECT_INFO', {}, projectCode);
|
|
29
|
+
}
|
|
30
|
+
modifyInfo(fields) {
|
|
31
|
+
const { projectCode, ...rest } = fields;
|
|
32
|
+
return this.call('MODIFY_PROJECT_INFO', rest, projectCode);
|
|
33
|
+
}
|
|
34
|
+
/** 项目日统计 GET_PROJECT_DAY_STATS */
|
|
35
|
+
dayStats(args) {
|
|
36
|
+
return this.call('GET_PROJECT_DAY_STATS', { year: args.year, month: args.month, day: args.day }, args.projectCode);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.ProjectApi = ProjectApi;
|
|
40
|
+
/** 设备:GET_BOXES / GET_BOX / GET_BOX_POSITION_TREE / MODIFY_BOX_INFO … */
|
|
41
|
+
class BoxApi extends ApiBase {
|
|
42
|
+
list(args = {}) {
|
|
43
|
+
const { projectCode, ...rest } = args;
|
|
44
|
+
return this.call('GET_BOXES', rest, projectCode);
|
|
45
|
+
}
|
|
46
|
+
/** Only online (-1 未连接 / 0 离线 / 1 在线). */
|
|
47
|
+
async listOnline(args = {}) {
|
|
48
|
+
const all = await this.list(args);
|
|
49
|
+
return all.filter((b) => b.online === 1);
|
|
50
|
+
}
|
|
51
|
+
get(mac, projectCode) {
|
|
52
|
+
return this.call('GET_BOX', { mac }, projectCode);
|
|
53
|
+
}
|
|
54
|
+
positionTree(projectCode) {
|
|
55
|
+
return this.call('GET_BOX_POSITION_TREE', {}, projectCode);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* GET_BOX_PROPERTIES — 设备节点属性 (暂仅支持微断/A 系列设备).
|
|
59
|
+
*
|
|
60
|
+
* `nodeType` is **required** by the platform; the documented value for the
|
|
61
|
+
* communication module is `COMM`. `addr` optionally targets one circuit.
|
|
62
|
+
*/
|
|
63
|
+
properties(args) {
|
|
64
|
+
return this.call('GET_BOX_PROPERTIES', { mac: args.mac, nodeType: args.nodeType ?? 'COMM', addr: args.addr }, args.projectCode);
|
|
65
|
+
}
|
|
66
|
+
modifyProperties(args) {
|
|
67
|
+
const { mac, params = {}, projectCode } = args;
|
|
68
|
+
return this.call('MODIFY_BOX_PROPERTIES', { mac, ...params }, projectCode);
|
|
69
|
+
}
|
|
70
|
+
modifyInfo(args) {
|
|
71
|
+
const { projectCode, ...rest } = args;
|
|
72
|
+
return this.call('MODIFY_BOX_INFO', rest, projectCode);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 调节上报频率 SET_BOX_REALTIME_RATE.
|
|
76
|
+
* `rate` is seconds between uploads — 5..180 for UDP modules, 5..600 for HTTP.
|
|
77
|
+
*/
|
|
78
|
+
setRealtimeRate(args) {
|
|
79
|
+
if (args.rate < 5) {
|
|
80
|
+
throw new Error('rate 必须 >= 5 秒');
|
|
81
|
+
}
|
|
82
|
+
const mac = ApiBase.list(args.mac);
|
|
83
|
+
if (!mac)
|
|
84
|
+
throw new Error('mac 不能为空');
|
|
85
|
+
return this.call('SET_BOX_REALTIME_RATE', { mac, enable: args.enable ? 'true' : 'false', rate: args.rate }, args.projectCode);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 设备在线轨迹 GET_BOX_ONLINE_HISTORY.
|
|
89
|
+
*
|
|
90
|
+
* Note the platform wants `startTime` / `endTime` here — **not** the
|
|
91
|
+
* `start`/`end` pair used by GET_BOX_ALARM. Format `yyyy-MM-dd HH:mm`;
|
|
92
|
+
* only the last ~6 months are retained.
|
|
93
|
+
*/
|
|
94
|
+
onlineHistory(args) {
|
|
95
|
+
return this.call('GET_BOX_ONLINE_HISTORY', {
|
|
96
|
+
mac: args.mac,
|
|
97
|
+
startTime: toAlarmTime(args.startTime),
|
|
98
|
+
endTime: toAlarmTime(args.endTime),
|
|
99
|
+
page: args.page ?? 1,
|
|
100
|
+
pageSize: args.pageSize ?? 100,
|
|
101
|
+
}, args.projectCode);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.BoxApi = BoxApi;
|
|
105
|
+
/** 线路/节点:实时状态、有效节点、分合闸控制 */
|
|
106
|
+
class ChannelApi extends ApiBase {
|
|
107
|
+
/**
|
|
108
|
+
* GET_BOX_CHANNELS_REALTIME.
|
|
109
|
+
*
|
|
110
|
+
* Accepts 1..20 macs. The platform returns a **different shape** for one mac
|
|
111
|
+
* (flat channel array) than for many (array of `{ mac, channelList }`); this
|
|
112
|
+
* method always normalises to {@link BoxRealtime}[] so UI code never branches.
|
|
113
|
+
*/
|
|
114
|
+
async realtime(args) {
|
|
115
|
+
const macList = (Array.isArray(args.mac) ? args.mac : args.mac.split(',')).map((m) => m.trim()).filter(Boolean);
|
|
116
|
+
if (macList.length === 0)
|
|
117
|
+
throw new Error('mac 不能为空');
|
|
118
|
+
if (macList.length > 20)
|
|
119
|
+
throw new Error('GET_BOX_CHANNELS_REALTIME 一次最多 20 个设备');
|
|
120
|
+
const raw = await this.call('GET_BOX_CHANNELS_REALTIME', { mac: macList.join(',') }, args.projectCode);
|
|
121
|
+
return normaliseRealtime(raw, macList);
|
|
122
|
+
}
|
|
123
|
+
/** Flattened convenience: every circuit of every requested device. */
|
|
124
|
+
async realtimeChannels(args) {
|
|
125
|
+
const boxes = await this.realtime(args);
|
|
126
|
+
const out = [];
|
|
127
|
+
for (const box of boxes) {
|
|
128
|
+
for (const ch of box.channelList)
|
|
129
|
+
out.push({ ...ch, mac: box.mac });
|
|
130
|
+
}
|
|
131
|
+
return out;
|
|
132
|
+
}
|
|
133
|
+
/** GET_BOX_CHANNELS — the list of valid circuits (title/oc/updateTime only). */
|
|
134
|
+
async list(args) {
|
|
135
|
+
const params = {};
|
|
136
|
+
if (args.param?.length) {
|
|
137
|
+
params.param = JSON.stringify(args.param);
|
|
138
|
+
}
|
|
139
|
+
else if (args.mac) {
|
|
140
|
+
params.mac = ApiBase.list(args.mac);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
throw new Error('mac 与 param 必须传其一');
|
|
144
|
+
}
|
|
145
|
+
return this.call('GET_BOX_CHANNELS', params, args.projectCode);
|
|
146
|
+
}
|
|
147
|
+
/** GET_BOX_CHANNELS_OC — 开关状态(比 realtime 轻量)。 */
|
|
148
|
+
channelsOc(args) {
|
|
149
|
+
return this.call('GET_BOX_CHANNELS_OC', { mac: ApiBase.list(args.mac) }, args.projectCode);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 历史节点数据 GET_BOX_CHANNELS_REALTIME_HISTORY.
|
|
153
|
+
*
|
|
154
|
+
* 平台**仅支持按天**查询:参数是 `date`(yyyy-MM-dd,默认当天),
|
|
155
|
+
* 不是开始/结束区间。
|
|
156
|
+
*/
|
|
157
|
+
history(args) {
|
|
158
|
+
if (args.date && !/^\d{4}-\d{2}-\d{2}$/.test(args.date)) {
|
|
159
|
+
throw new Error('date 格式应为 yyyy-MM-dd');
|
|
160
|
+
}
|
|
161
|
+
return this.call('GET_BOX_CHANNELS_REALTIME_HISTORY', {
|
|
162
|
+
mac: args.mac,
|
|
163
|
+
date: args.date,
|
|
164
|
+
addr: args.addr,
|
|
165
|
+
isReturnTotal: args.isReturnTotal === undefined ? undefined : args.isReturnTotal ? 'true' : 'false',
|
|
166
|
+
page: args.page ?? 1,
|
|
167
|
+
pageSize: args.pageSize ?? 100,
|
|
168
|
+
}, args.projectCode);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
exports.ChannelApi = ChannelApi;
|
|
172
|
+
function normaliseRealtime(raw, requested) {
|
|
173
|
+
if (!Array.isArray(raw))
|
|
174
|
+
return [];
|
|
175
|
+
const first = raw[0];
|
|
176
|
+
const isWrapped = !!first && Array.isArray(first.channelList);
|
|
177
|
+
if (isWrapped) {
|
|
178
|
+
return raw.map((b) => ({
|
|
179
|
+
mac: b.mac,
|
|
180
|
+
channelList: (b.channelList ?? []).map((ch) => ({ ...ch, mac: ch.mac ?? b.mac })),
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
// Single-mac shape: the platform omits `mac`, so use what was requested.
|
|
184
|
+
const mac = requested[0];
|
|
185
|
+
return [
|
|
186
|
+
{
|
|
187
|
+
mac,
|
|
188
|
+
channelList: raw.map((ch) => ({ ...ch, mac: ch.mac ?? mac })),
|
|
189
|
+
},
|
|
190
|
+
];
|
|
191
|
+
}
|
|
192
|
+
/** 控制:PUT_BOX_CONTROL / BATCH_BOX_CONTROL */
|
|
193
|
+
class ControlApi extends ApiBase {
|
|
194
|
+
/**
|
|
195
|
+
* Generic control dispatcher.
|
|
196
|
+
*
|
|
197
|
+
* `PUT_BOX_CONTROL` takes `cmd` plus a flat set of `value1..value5` (and, for
|
|
198
|
+
* device/timer commands, dotted keys such as `device.autoid`).
|
|
199
|
+
*/
|
|
200
|
+
control(args) {
|
|
201
|
+
return this.call('PUT_BOX_CONTROL', {
|
|
202
|
+
mac: args.mac,
|
|
203
|
+
cmd: args.cmd,
|
|
204
|
+
...args.options,
|
|
205
|
+
}, args.projectCode);
|
|
206
|
+
}
|
|
207
|
+
/** 合闸/分闸. Addresses are 1-based circuit addresses. */
|
|
208
|
+
switchCircuit(args) {
|
|
209
|
+
const addr = Array.isArray(args.addr) ? args.addr.join(',') : String(args.addr);
|
|
210
|
+
return this.control({
|
|
211
|
+
mac: args.mac,
|
|
212
|
+
cmd: 'OCSWITCH',
|
|
213
|
+
options: {
|
|
214
|
+
value1: args.action,
|
|
215
|
+
value2: addr,
|
|
216
|
+
...(args.skipWhenAbnormalLock ? { value3: 'ABNORMAL_LOCK_CHECK' } : {}),
|
|
217
|
+
},
|
|
218
|
+
projectCode: args.projectCode,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/** 批量控制 BATCH_BOX_CONTROL */
|
|
222
|
+
batchSwitch(args) {
|
|
223
|
+
return this.call('BATCH_BOX_CONTROL', { cmd: 'OCSWITCH', value1: args.action, param: JSON.stringify(args.items) }, args.projectCode);
|
|
224
|
+
}
|
|
225
|
+
/** 改线路名称 / 功率限定 (SWITCHSET) */
|
|
226
|
+
updateCircuit(args) {
|
|
227
|
+
const options = { value1: args.addr, value2: args.title ?? '' };
|
|
228
|
+
if (args.maxPowerW !== undefined)
|
|
229
|
+
options.value4 = args.maxPowerW;
|
|
230
|
+
if (args.overCurrentThreshold !== undefined)
|
|
231
|
+
options.value5 = args.overCurrentThreshold;
|
|
232
|
+
return this.control({ mac: args.mac, cmd: 'SWITCHSET', options, projectCode: args.projectCode });
|
|
233
|
+
}
|
|
234
|
+
/** 远程锁定/解锁一条线路 */
|
|
235
|
+
remoteLock(args) {
|
|
236
|
+
return this.control({
|
|
237
|
+
mac: args.mac,
|
|
238
|
+
cmd: 'REMOTE_SWITCH_LOCK',
|
|
239
|
+
options: { value1: args.addr, value2: args.locked ? 'true' : 'false' },
|
|
240
|
+
projectCode: args.projectCode,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
/** 对异常分闸锁定的线路执行远程解锁 */
|
|
244
|
+
unlockAbnormal(args) {
|
|
245
|
+
return this.control({
|
|
246
|
+
mac: args.mac,
|
|
247
|
+
cmd: 'ABNORMAL_SWITCH_UNLOCK',
|
|
248
|
+
options: { value1: args.addr },
|
|
249
|
+
projectCode: args.projectCode,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
/** 线路/设备显隐标记 */
|
|
253
|
+
setVisibility(args) {
|
|
254
|
+
return this.control({
|
|
255
|
+
mac: args.mac,
|
|
256
|
+
cmd: 'SETVISIBILITY',
|
|
257
|
+
options: { value1: args.addr, value2: args.visible ? 1 : 0 },
|
|
258
|
+
projectCode: args.projectCode,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/** 是否允许控制标记 */
|
|
262
|
+
setControl(args) {
|
|
263
|
+
return this.control({
|
|
264
|
+
mac: args.mac,
|
|
265
|
+
cmd: 'SETCONTROL',
|
|
266
|
+
options: { value1: args.addr, value2: args.controllable ? 1 : 0 },
|
|
267
|
+
projectCode: args.projectCode,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
/** 自动漏电自检 */
|
|
271
|
+
setAutoLeakage(args) {
|
|
272
|
+
return this.control({
|
|
273
|
+
mac: args.mac,
|
|
274
|
+
cmd: 'SETAUTOLEAK',
|
|
275
|
+
options: { value1: args.enable ? 'true' : 'false', value2: args.day, value3: args.hour, value4: args.minute },
|
|
276
|
+
projectCode: args.projectCode,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/** 设备定时配置 GET_CFG_TIMER (autoid = 0 返回全部) */
|
|
280
|
+
getTimers(args) {
|
|
281
|
+
return this.call('GET_CFG_TIMER', { mac: args.mac, autoid: args.autoid ?? 0 }, args.projectCode);
|
|
282
|
+
}
|
|
283
|
+
/** 漏电自检记录 GET_CFG_LKICHK */
|
|
284
|
+
getLeakageCheck(args) {
|
|
285
|
+
return this.call('GET_CFG_LKICHK', { mac: args.mac }, args.projectCode);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
exports.ControlApi = ControlApi;
|
|
289
|
+
/** 告警 */
|
|
290
|
+
class AlarmApi extends ApiBase {
|
|
291
|
+
/**
|
|
292
|
+
* GET_BOX_ALARM.
|
|
293
|
+
*
|
|
294
|
+
* Platform limits: `start` within the last month, `end - start` <= 48 h, and
|
|
295
|
+
* these windows are **storage time**, not alarm time.
|
|
296
|
+
*/
|
|
297
|
+
async list(args) {
|
|
298
|
+
const start = toAlarmTime(args.start);
|
|
299
|
+
const end = toAlarmTime(args.end);
|
|
300
|
+
assertWindows(start, end);
|
|
301
|
+
const data = await this.call('GET_BOX_ALARM', {
|
|
302
|
+
start,
|
|
303
|
+
end,
|
|
304
|
+
mac: args.mac,
|
|
305
|
+
page: args.page ?? 1,
|
|
306
|
+
pageSize: args.pageSize ?? 50,
|
|
307
|
+
type: args.type ?? 'W',
|
|
308
|
+
includeCalm: args.includeCalm ? 'true' : 'false',
|
|
309
|
+
}, args.projectCode);
|
|
310
|
+
if (Array.isArray(data)) {
|
|
311
|
+
// Defensive: some deployments return a bare array.
|
|
312
|
+
return { total: data.length, page: 1, totalPage: 1, datas: data };
|
|
313
|
+
}
|
|
314
|
+
const page = (data ?? {});
|
|
315
|
+
return {
|
|
316
|
+
total: page.total ?? 0,
|
|
317
|
+
page: page.page ?? 1,
|
|
318
|
+
totalPage: page.totalPage ?? 1,
|
|
319
|
+
datas: page.datas ?? [],
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
/** Walks every page of a window (capped by `maxPages`). */
|
|
323
|
+
async listAll(args) {
|
|
324
|
+
const maxPages = args.maxPages ?? 20;
|
|
325
|
+
const first = await this.list({ ...args, page: 1 });
|
|
326
|
+
const all = [...first.datas];
|
|
327
|
+
const pages = Math.min(first.totalPage, maxPages);
|
|
328
|
+
for (let p = 2; p <= pages; p++) {
|
|
329
|
+
const next = await this.list({ ...args, page: p });
|
|
330
|
+
all.push(...next.datas);
|
|
331
|
+
}
|
|
332
|
+
return all;
|
|
333
|
+
}
|
|
334
|
+
/** 按告警类型/设备过滤 (client side — the API has no such filter). */
|
|
335
|
+
async byType(args) {
|
|
336
|
+
const { typeNumbers, ...rest } = args;
|
|
337
|
+
const rows = await this.listAll(rest);
|
|
338
|
+
const set = new Set(typeNumbers);
|
|
339
|
+
return rows.filter((r) => set.has(r.typeNumber));
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* 告警维护记录 GET_ALARM_MAINTENANCE.
|
|
343
|
+
* `alarmId` 支持单个或数组(平台最多 20 个,逗号分隔)。
|
|
344
|
+
*/
|
|
345
|
+
maintenance(args) {
|
|
346
|
+
return this.call('GET_ALARM_MAINTENANCE', { alarmId: toIdList(args.alarmId, 'GET_ALARM_MAINTENANCE') }, args.projectCode);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* 催办/处理告警 ALARM_URGED.
|
|
350
|
+
* 注意 `mac` 是必填项(文档与旧实现不一致处,已按平台实测修正)。
|
|
351
|
+
*/
|
|
352
|
+
urged(args) {
|
|
353
|
+
return this.call('ALARM_URGED', { mac: args.mac, alarmId: toIdList(args.alarmId, 'ALARM_URGED') }, args.projectCode);
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* 设备维保工单处理历史 GET_BOX_MAINTENANCE_HISTORY.
|
|
357
|
+
* `start`/`end` 必填(yyyy-MM-dd HH:mm):start 需在最近一个月内,end 不得晚于今天。
|
|
358
|
+
*/
|
|
359
|
+
boxMaintenanceHistory(args) {
|
|
360
|
+
if (args.pageSize !== undefined && (args.pageSize < 1 || args.pageSize > 100)) {
|
|
361
|
+
throw new Error('pageSize 取值范围 1~100');
|
|
362
|
+
}
|
|
363
|
+
return this.call('GET_BOX_MAINTENANCE_HISTORY', {
|
|
364
|
+
mac: args.mac,
|
|
365
|
+
start: toAlarmTime(args.start),
|
|
366
|
+
end: toAlarmTime(args.end),
|
|
367
|
+
page: args.page ?? 1,
|
|
368
|
+
pageSize: args.pageSize ?? 100,
|
|
369
|
+
}, args.projectCode);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
exports.AlarmApi = AlarmApi;
|
|
373
|
+
/**
|
|
374
|
+
* 把单个/多个 ID 归一化为平台要求的逗号串。
|
|
375
|
+
* 平台限制每条请求最多 20 个 ID。
|
|
376
|
+
*/
|
|
377
|
+
function toIdList(value, method) {
|
|
378
|
+
const list = (Array.isArray(value) ? value : String(value).split(',')).map((v) => String(v).trim()).filter(Boolean);
|
|
379
|
+
if (list.length === 0)
|
|
380
|
+
throw new Error(`${method}: alarmId 不能为空`);
|
|
381
|
+
if (list.length > 20)
|
|
382
|
+
throw new Error(`${method}: alarmId 一次最多 20 个`);
|
|
383
|
+
return list.join(',');
|
|
384
|
+
}
|
|
385
|
+
function toAlarmTime(value) {
|
|
386
|
+
if (typeof value === 'string')
|
|
387
|
+
return value;
|
|
388
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
389
|
+
return (`${value.getFullYear()}-${pad(value.getMonth() + 1)}-${pad(value.getDate())}` +
|
|
390
|
+
` ${pad(value.getHours())}:${pad(value.getMinutes())}`);
|
|
391
|
+
}
|
|
392
|
+
function assertWindows(start, end) {
|
|
393
|
+
const s = new Date(start.replace(' ', 'T'));
|
|
394
|
+
const e = new Date(end.replace(' ', 'T'));
|
|
395
|
+
if (Number.isNaN(s.getTime()) || Number.isNaN(e.getTime())) {
|
|
396
|
+
throw new Error('start/end 格式应为 yyyy-MM-dd HH:mm');
|
|
397
|
+
}
|
|
398
|
+
if (e <= s)
|
|
399
|
+
throw new Error('end 必须大于 start');
|
|
400
|
+
if (e.getTime() - s.getTime() > 48 * 3600 * 1000) {
|
|
401
|
+
throw new Error('end 与 start 的间隔不能超过 48 小时');
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* 统计.
|
|
406
|
+
*
|
|
407
|
+
* 方法名是 `GET_BOXES_*`(BOX + ES),**不是** `GET_BOXS_*`。
|
|
408
|
+
* 两者只差一个字母,但平台对错误拼写的回答是「接口名称(X)无效!」,
|
|
409
|
+
* 极易被误判成「接口未开通」。已对真实服务器逐个验证过。
|
|
410
|
+
*/
|
|
411
|
+
class StatsApi extends ApiBase {
|
|
412
|
+
period(method, args) {
|
|
413
|
+
return this.call(method, { mac: ApiBase.list(args.mac), year: args.year, month: args.month, day: args.day }, args.projectCode);
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* 日区间统计 GET_BOXES_DAY_STATS.
|
|
417
|
+
* 不传 `day` 时返回当月每天的数据。
|
|
418
|
+
*/
|
|
419
|
+
day(args) {
|
|
420
|
+
return this.period('GET_BOXES_DAY_STATS', args);
|
|
421
|
+
}
|
|
422
|
+
/** 小时区间统计 GET_BOXES_HOUR_STATS. */
|
|
423
|
+
hour(args) {
|
|
424
|
+
return this.period('GET_BOXES_HOUR_STATS', args);
|
|
425
|
+
}
|
|
426
|
+
/** 月区间统计 GET_BOXES_MON_STATS. */
|
|
427
|
+
month(args) {
|
|
428
|
+
return this.call('GET_BOXES_MON_STATS', { mac: ApiBase.list(args.mac), year: args.year }, args.projectCode);
|
|
429
|
+
}
|
|
430
|
+
/** Sum of `electricity` for a day across circuits (addr=0 row is the device total). */
|
|
431
|
+
totalElectricity(stats) {
|
|
432
|
+
const deviceTotal = stats.find((s) => s.addr === 0);
|
|
433
|
+
if (deviceTotal && typeof deviceTotal.electricity === 'number')
|
|
434
|
+
return deviceTotal.electricity;
|
|
435
|
+
return stats.reduce((sum, s) => sum + (s.electricity ?? 0), 0);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
exports.StatsApi = StatsApi;
|
|
439
|
+
/** 场景/定时 (服务端触发) */
|
|
440
|
+
class SceneApi extends ApiBase {
|
|
441
|
+
list(projectCode) {
|
|
442
|
+
return this.call('SCENE_SERVICE', { cmd: 'SCENE_QUERY' }, projectCode);
|
|
443
|
+
}
|
|
444
|
+
execute(args) {
|
|
445
|
+
return this.call('SCENE_SERVICE', { cmd: 'SCENE_EXEC', sceneId: args.sceneId, ...(args.params ?? {}) }, args.projectCode);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
exports.SceneApi = SceneApi;
|
|
449
|
+
/**
|
|
450
|
+
* 第三方设备(烟感/燃气/水表/温湿度等,即 equipmentType ≠ 1/2 的设备)。
|
|
451
|
+
*
|
|
452
|
+
* 这些设备没有「线路」概念,状态通过 GET_THR_DEVICE_STATUS 按消息类型返回。
|
|
453
|
+
*/
|
|
454
|
+
class ThirdPartyDeviceApi extends ApiBase {
|
|
455
|
+
/**
|
|
456
|
+
* 获取第三方设备状态 GET_THR_DEVICE_STATUS.
|
|
457
|
+
*
|
|
458
|
+
* @param args.equipmentType 必填,且必须是**第三方**设备类型
|
|
459
|
+
* (4/5/6/7/10/11/12/13/14/16/29/39/42/45)。传 1 或 2 会被平台以
|
|
460
|
+
* 「设备类型无效!」拒绝——微断请用 {@link ChannelApi.realtime}。
|
|
461
|
+
* @param args.dataType 仅智能水表(16)必填:0 实时抄表 / 1 时间范围
|
|
462
|
+
* @param args.startDate / endDate `dataType=1` 时必填,格式 yyyy-MM-dd
|
|
463
|
+
*/
|
|
464
|
+
status(args) {
|
|
465
|
+
const type = Number(args.equipmentType);
|
|
466
|
+
if (type === 1 || type === 2) {
|
|
467
|
+
throw new Error('equipmentType 1(微断)/ 2(电气火灾)不支持 GET_THR_DEVICE_STATUS,请使用 channel.realtime()');
|
|
468
|
+
}
|
|
469
|
+
if (type === models_js_1.ThirdPartyEquipmentType.SmartWaterMeter && args.dataType === undefined) {
|
|
470
|
+
throw new Error('智能水表(equipmentType=16)必须指定 dataType(0 实时 / 1 时间范围)');
|
|
471
|
+
}
|
|
472
|
+
if (args.dataType === models_js_1.MeterQueryType.Range && (!args.startDate || !args.endDate)) {
|
|
473
|
+
throw new Error('dataType=1 时必须提供 startDate 与 endDate(yyyy-MM-dd)');
|
|
474
|
+
}
|
|
475
|
+
return this.call('GET_THR_DEVICE_STATUS', {
|
|
476
|
+
mac: args.mac,
|
|
477
|
+
equipmentType: type,
|
|
478
|
+
dataType: args.dataType,
|
|
479
|
+
startDate: args.startDate,
|
|
480
|
+
endDate: args.endDate,
|
|
481
|
+
}, args.projectCode);
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* 同上,但把每条记录的 `data` JSON 字符串解析成对象,
|
|
485
|
+
* 便于直接绑定到 UI(解析失败时保留原始字符串)。
|
|
486
|
+
*/
|
|
487
|
+
async statusParsed(args) {
|
|
488
|
+
const rows = await this.status(args);
|
|
489
|
+
return rows.map((r) => ({ ...r, data: parseThirdPartyData(r.data) }));
|
|
490
|
+
}
|
|
491
|
+
/** 列出项目中某类型的第三方设备(从 GET_BOXES 过滤)。 */
|
|
492
|
+
async listDevices(args) {
|
|
493
|
+
const boxes = await this.call('GET_BOXES', { equipmentType: Number(args.equipmentType) }, args.projectCode);
|
|
494
|
+
return boxes.filter((b) => Number(b.equipmentType) === Number(args.equipmentType));
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
exports.ThirdPartyDeviceApi = ThirdPartyDeviceApi;
|
|
498
|
+
/**
|
|
499
|
+
* 解析第三方设备 status 的 `data` 字段。
|
|
500
|
+
* 该字段是 JSON 字符串;个别设备会返回纯数字(如 `"0"`),此时原样返回。
|
|
501
|
+
*/
|
|
502
|
+
function parseThirdPartyData(raw) {
|
|
503
|
+
if (typeof raw !== 'string')
|
|
504
|
+
return raw;
|
|
505
|
+
const text = raw.trim();
|
|
506
|
+
if (!text)
|
|
507
|
+
return null;
|
|
508
|
+
try {
|
|
509
|
+
return JSON.parse(text);
|
|
510
|
+
}
|
|
511
|
+
catch {
|
|
512
|
+
// 纯数字/布尔字面量也算合法负载
|
|
513
|
+
if (/^-?\d+(\.\d+)?$/.test(text))
|
|
514
|
+
return Number(text);
|
|
515
|
+
return text;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/core/api.ts"],"names":[],"mappings":"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"}
|