@idm-plugin/vessel 1.0.4 → 1.0.6
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/dist/alert/src/index.d.ts +1 -0
- package/dist/index.js +153 -149
- package/dist/index.umd.cjs +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,60 +1,61 @@
|
|
|
1
1
|
var C = Object.defineProperty;
|
|
2
|
-
var O = (
|
|
3
|
-
var q = (
|
|
2
|
+
var O = (M, c, e) => c in M ? C(M, c, { enumerable: !0, configurable: !0, writable: !0, value: e }) : M[c] = e;
|
|
3
|
+
var q = (M, c, e) => (O(M, typeof c != "symbol" ? c + "" : c, e), e);
|
|
4
4
|
import Y from "got";
|
|
5
5
|
import * as W from "log4js";
|
|
6
6
|
import p from "moment";
|
|
7
|
-
const
|
|
7
|
+
const j = W.getLogger();
|
|
8
|
+
j.level = "info";
|
|
8
9
|
class V {
|
|
9
10
|
/**
|
|
10
11
|
* 解析AIS状态码
|
|
11
12
|
* @param status
|
|
12
13
|
*/
|
|
13
14
|
parseStatus(c) {
|
|
14
|
-
let
|
|
15
|
+
let e, n;
|
|
15
16
|
switch (c) {
|
|
16
17
|
case 0:
|
|
17
|
-
|
|
18
|
+
e = "在航(主机推动)", n = "The engine is in use";
|
|
18
19
|
break;
|
|
19
20
|
case 1:
|
|
20
|
-
|
|
21
|
+
e = "锚泊", n = "Anchored";
|
|
21
22
|
break;
|
|
22
23
|
case 2:
|
|
23
|
-
|
|
24
|
+
e = "失控", n = "Not operated";
|
|
24
25
|
break;
|
|
25
26
|
case 3:
|
|
26
|
-
|
|
27
|
+
e = "操纵受限", n = "Limited airworthiness";
|
|
27
28
|
break;
|
|
28
29
|
case 4:
|
|
29
|
-
|
|
30
|
+
e = "吃水受限", n = "Limited by ship's draft";
|
|
30
31
|
break;
|
|
31
32
|
case 5:
|
|
32
|
-
|
|
33
|
+
e = "靠泊", n = "Mooring";
|
|
33
34
|
break;
|
|
34
35
|
case 6:
|
|
35
|
-
|
|
36
|
+
e = "搁浅", n = "Stranded";
|
|
36
37
|
break;
|
|
37
38
|
case 7:
|
|
38
|
-
|
|
39
|
+
e = "捕捞作业", n = "Engaged in fishing";
|
|
39
40
|
break;
|
|
40
41
|
case 8:
|
|
41
|
-
|
|
42
|
+
e = "靠帆船提供动力", n = "Sailing";
|
|
42
43
|
break;
|
|
43
44
|
default:
|
|
44
|
-
|
|
45
|
+
e = "未定义", n = "Undefined";
|
|
45
46
|
}
|
|
46
|
-
return { labelCn:
|
|
47
|
+
return { labelCn: e, labelEn: n };
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
|
-
class
|
|
50
|
-
constructor(
|
|
50
|
+
class B extends V {
|
|
51
|
+
constructor(e, n) {
|
|
51
52
|
super();
|
|
52
53
|
q(this, "clientId");
|
|
53
54
|
q(this, "clientSecret");
|
|
54
55
|
q(this, "token");
|
|
55
|
-
this.clientId =
|
|
56
|
+
this.clientId = e, this.clientSecret = n;
|
|
56
57
|
}
|
|
57
|
-
async authToken(
|
|
58
|
+
async authToken(e = {}) {
|
|
58
59
|
const n = "https://svc.data.myvessel.cn/ada/oauth/token", a = {
|
|
59
60
|
searchParams: {
|
|
60
61
|
client_id: this.clientId,
|
|
@@ -62,7 +63,7 @@ class G extends V {
|
|
|
62
63
|
grant_type: "client_credentials"
|
|
63
64
|
}
|
|
64
65
|
}, o = await Y.post(n, a).json();
|
|
65
|
-
|
|
66
|
+
j.info("[%s] fetch access token from: %s - %j", e.requestId, n, o), o.error || (this.token = {
|
|
66
67
|
accessToken: o.access_token,
|
|
67
68
|
tokenType: o.token_type,
|
|
68
69
|
expiresIn: o.expires_in,
|
|
@@ -71,20 +72,20 @@ class G extends V {
|
|
|
71
72
|
issuedAt: p().utc().format()
|
|
72
73
|
});
|
|
73
74
|
}
|
|
74
|
-
async realTimePosition(
|
|
75
|
+
async realTimePosition(e, n = {}) {
|
|
75
76
|
var d, h, f;
|
|
76
77
|
(!this.token || p().diff(p(this.token.issuedAt), "seconds") > ((d = this.token) == null ? void 0 : d.expiresIn) - 300) && await this.authToken(n);
|
|
77
78
|
const a = "https://svc.data.myvessel.cn/sdc/v1/vessels/status/location/unit", o = {
|
|
78
79
|
headers: {
|
|
79
80
|
Authorization: `${(h = this.token) == null ? void 0 : h.tokenType} ${(f = this.token) == null ? void 0 : f.accessToken}`
|
|
80
81
|
},
|
|
81
|
-
searchParams: { mmsi:
|
|
82
|
+
searchParams: { mmsi: e }
|
|
82
83
|
};
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
if (
|
|
86
|
-
return
|
|
87
|
-
const t =
|
|
84
|
+
j.info("[%s] fetch realtime position from: %s - %j", n.requestId, a, o);
|
|
85
|
+
const s = await Y.get(a, o).json();
|
|
86
|
+
if (s.code)
|
|
87
|
+
return j.warn("[%s] fetch realtime position failed: %j", n.requestId, a, { message: s.message, status: s.status, code: s.code }), s;
|
|
88
|
+
const t = s.data;
|
|
88
89
|
for (const m in t)
|
|
89
90
|
!isNaN(t[m]) && Number(t[m]) !== 1 / 0 && (t[m] = Number(t[m]));
|
|
90
91
|
const r = p(`${t.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
@@ -113,35 +114,35 @@ class G extends V {
|
|
|
113
114
|
utc: r.utc().format()
|
|
114
115
|
};
|
|
115
116
|
}
|
|
116
|
-
async trajectory(
|
|
117
|
+
async trajectory(e, n, a, o, s = !0, t = {}) {
|
|
117
118
|
(!this.token || p().diff(p(this.token.issuedAt), "seconds") > this.token.expiresIn - 300) && await this.authToken(t);
|
|
118
|
-
const r = await this.realTimePosition(
|
|
119
|
+
const r = await this.realTimePosition(e, t), i = p(n), d = p(a), h = [];
|
|
119
120
|
for (; d.diff(i, "day", !0) > 30; )
|
|
120
|
-
await this.trajectoryIn30Day(
|
|
121
|
-
return await this.trajectoryIn30Day(
|
|
121
|
+
await this.trajectoryIn30Day(e, i, i.clone().add(30, "day"), r, o, h, t), i.add(30, "day");
|
|
122
|
+
return await this.trajectoryIn30Day(e, i, d, r, o, h, t), h;
|
|
122
123
|
}
|
|
123
|
-
async trajectoryIn30Day(
|
|
124
|
-
var u, b, w, k,
|
|
124
|
+
async trajectoryIn30Day(e, n, a, o, s, t, r = {}) {
|
|
125
|
+
var u, b, w, k, I;
|
|
125
126
|
const i = "https://svc.data.myvessel.cn/sdc/v1/vessels/status/track", d = {
|
|
126
127
|
headers: {
|
|
127
128
|
Authorization: `${(u = this.token) == null ? void 0 : u.tokenType} ${(b = this.token) == null ? void 0 : b.accessToken}`
|
|
128
129
|
},
|
|
129
130
|
json: {
|
|
130
|
-
mmsi:
|
|
131
|
+
mmsi: e,
|
|
131
132
|
startTime: n.utcOffset(8).format("YYYY-MM-DD HH:mm:ss"),
|
|
132
133
|
endTime: a.utcOffset(8).format("YYYY-MM-DD HH:mm:ss")
|
|
133
134
|
}
|
|
134
135
|
};
|
|
135
|
-
|
|
136
|
+
j.info("[%s] fetch trajectory from: %s - %j", r.requestId, i, d);
|
|
136
137
|
const h = await Y.post(i, d).json();
|
|
137
138
|
if (h.code)
|
|
138
|
-
return
|
|
139
|
+
return j.warn("[%s] fetch trajectory failed: %j", r.requestId, i, { message: h.message, status: h.status, code: h.code }), h;
|
|
139
140
|
let f = -1;
|
|
140
141
|
const m = p(`${(k = (w = h.data) == null ? void 0 : w[0]) == null ? void 0 : k.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
141
|
-
return (
|
|
142
|
+
return (I = h.data) == null || I.forEach((g) => {
|
|
142
143
|
for (const N in g)
|
|
143
144
|
!isNaN(g[N]) && Number(g[N]) !== 1 / 0 && (g[N] = Number(g[N]));
|
|
144
|
-
const
|
|
145
|
+
const v = p(`${g.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00"), S = g.eta ? p(`${g.eta} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00") : void 0, l = g.status, { labelCn: H, labelEn: _ } = this.parseStatus(l), R = {
|
|
145
146
|
mmsi: g.mmsi,
|
|
146
147
|
imo: o == null ? void 0 : o.imo,
|
|
147
148
|
lat: g.lat,
|
|
@@ -153,34 +154,34 @@ class G extends V {
|
|
|
153
154
|
status: l,
|
|
154
155
|
eta: S == null ? void 0 : S.unix(),
|
|
155
156
|
destination: g.dest,
|
|
156
|
-
positionTime:
|
|
157
|
+
positionTime: v.unix(),
|
|
157
158
|
labelCn: H,
|
|
158
159
|
labelEn: _,
|
|
159
160
|
method: "trajectory",
|
|
160
161
|
vendor: "myVessel",
|
|
161
|
-
utc:
|
|
162
|
-
}, E = Math.floor(
|
|
162
|
+
utc: v.utc().format()
|
|
163
|
+
}, E = Math.floor(v.diff(m, "minute", !0) / (s || 1));
|
|
163
164
|
E !== f && (f = E, t.push(R));
|
|
164
165
|
}), t;
|
|
165
166
|
}
|
|
166
167
|
}
|
|
167
|
-
class
|
|
168
|
-
constructor(
|
|
168
|
+
class U extends V {
|
|
169
|
+
constructor(e) {
|
|
169
170
|
super();
|
|
170
171
|
q(this, "token");
|
|
171
|
-
this.token =
|
|
172
|
+
this.token = e;
|
|
172
173
|
}
|
|
173
|
-
async realTimePosition(
|
|
174
|
+
async realTimePosition(e, n = {}) {
|
|
174
175
|
const a = "https://api.hifleet.com/position/position/get/token", o = {
|
|
175
176
|
searchParams: {
|
|
176
|
-
mmsi:
|
|
177
|
+
mmsi: e,
|
|
177
178
|
usertoken: this.token
|
|
178
179
|
}
|
|
179
|
-
},
|
|
180
|
-
|
|
181
|
-
const t =
|
|
180
|
+
}, s = await Y.post(a, o).json();
|
|
181
|
+
j.info("[%s] fetch realtime position from: %s - %j", n.requestId, a, o);
|
|
182
|
+
const t = s == null ? void 0 : s.list;
|
|
182
183
|
if (!t)
|
|
183
|
-
return
|
|
184
|
+
return j.warn("[%s] fetch realtime position failed: %j", n.requestId, a, s), s;
|
|
184
185
|
for (const m in t)
|
|
185
186
|
!isNaN(t[m]) && Number(t[m]) !== 1 / 0 && (t[m] = Number(t[m]));
|
|
186
187
|
t.status = t.sp > 3 ? 0 : 1;
|
|
@@ -210,11 +211,11 @@ class B extends V {
|
|
|
210
211
|
vendor: "hifleet"
|
|
211
212
|
};
|
|
212
213
|
}
|
|
213
|
-
async search(
|
|
214
|
+
async search(e, n = {}) {
|
|
214
215
|
let a = "https://www.hifleet.com/hifleetapi/searchVesselOL.do";
|
|
215
216
|
const o = {
|
|
216
217
|
searchParams: {
|
|
217
|
-
keyword:
|
|
218
|
+
keyword: e
|
|
218
219
|
},
|
|
219
220
|
headers: {
|
|
220
221
|
Referer: "https://www.hifleet.com",
|
|
@@ -222,27 +223,27 @@ class B extends V {
|
|
|
222
223
|
Host: "www.hifleet.com"
|
|
223
224
|
}
|
|
224
225
|
};
|
|
225
|
-
let
|
|
226
|
-
|
|
227
|
-
for (const r in
|
|
228
|
-
!isNaN(
|
|
226
|
+
let s = await Y.post(a, o).json();
|
|
227
|
+
j.info("[%s] fetch vessel props from: %s - %j", n.requestId, a, o), s instanceof Array && (s = s[0]);
|
|
228
|
+
for (const r in s)
|
|
229
|
+
!isNaN(s[r]) && Number(s[r]) !== 1 / 0 && (s[r] = Number(s[r]));
|
|
229
230
|
const t = {
|
|
230
|
-
mmsi:
|
|
231
|
-
name:
|
|
232
|
-
imo:
|
|
233
|
-
callSign:
|
|
234
|
-
length:
|
|
235
|
-
breadth:
|
|
236
|
-
draught:
|
|
231
|
+
mmsi: s.m,
|
|
232
|
+
name: s.n,
|
|
233
|
+
imo: s.i,
|
|
234
|
+
callSign: s.c,
|
|
235
|
+
length: s.l,
|
|
236
|
+
breadth: s.b,
|
|
237
|
+
draught: s.dr
|
|
237
238
|
};
|
|
238
|
-
return a = "https://www.hifleet.com/hifleetapi/sameShipSearch.do",
|
|
239
|
+
return a = "https://www.hifleet.com/hifleetapi/sameShipSearch.do", s = await Y.post(a, o).json(), j.info("[%s] fetch vessel dead weight from: %s - %j", n.requestId, a, o), s instanceof Array && (s = s[0]), s && (t.deadweight = Number(s.dwt)), t;
|
|
239
240
|
}
|
|
240
|
-
async trajectory(
|
|
241
|
-
var g,
|
|
242
|
-
const r = await this.realTimePosition(
|
|
241
|
+
async trajectory(e, n, a, o, s = !0, t = {}) {
|
|
242
|
+
var g, v, S;
|
|
243
|
+
const r = await this.realTimePosition(e, t);
|
|
243
244
|
let i = p(n);
|
|
244
245
|
const d = p(a), h = p();
|
|
245
|
-
if (
|
|
246
|
+
if (s) {
|
|
246
247
|
let l = d.diff(i, "d", !0);
|
|
247
248
|
l < 0 ? i = d.clone().subtract(40, "d") : l < 30 ? i.subtract(10, "d") : l < 60 ? i.subtract(5, "d") : i = d.clone().subtract(80, "d"), l = h.diff(d, "d", !0), d.add(l > 10 ? 240 : l * 24, "h");
|
|
248
249
|
}
|
|
@@ -250,16 +251,16 @@ class B extends V {
|
|
|
250
251
|
searchParams: {
|
|
251
252
|
endtime: d.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),
|
|
252
253
|
starttime: i.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),
|
|
253
|
-
mmsi:
|
|
254
|
+
mmsi: e,
|
|
254
255
|
usertoken: this.token
|
|
255
256
|
}
|
|
256
257
|
}, m = "https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token", u = await Y.get(m, f).json();
|
|
257
|
-
|
|
258
|
+
j.info("[%s] fetch trajectory from: %s - %j", t.requestId, m, f);
|
|
258
259
|
let b;
|
|
259
|
-
u && (b = ((
|
|
260
|
+
u && (b = ((v = (g = u.ships) == null ? void 0 : g.offors) == null ? void 0 : v.ship) || [], b.length || j.warn("[%s] fetch trajectory failed: %j", t.requestId, u));
|
|
260
261
|
const w = [];
|
|
261
262
|
let k = -1;
|
|
262
|
-
const
|
|
263
|
+
const I = p(`${(S = b == null ? void 0 : b[0]) == null ? void 0 : S.ti} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
263
264
|
for (const l of b) {
|
|
264
265
|
for (const x in l)
|
|
265
266
|
!isNaN(l[x]) && Number(l[x]) !== 1 / 0 && (l[x] = Number(l[x]));
|
|
@@ -282,29 +283,29 @@ class B extends V {
|
|
|
282
283
|
labelEn: _,
|
|
283
284
|
method: "trajectory",
|
|
284
285
|
vendor: "hifleet"
|
|
285
|
-
}, N = Math.floor(H.diff(
|
|
286
|
+
}, N = Math.floor(H.diff(I, "minute", !0) / (o || 1));
|
|
286
287
|
N !== k && (k = N, w.push(E));
|
|
287
288
|
}
|
|
288
289
|
return w;
|
|
289
290
|
}
|
|
290
291
|
}
|
|
291
|
-
class
|
|
292
|
-
constructor(
|
|
292
|
+
class J extends V {
|
|
293
|
+
constructor(e) {
|
|
293
294
|
super();
|
|
294
295
|
q(this, "token");
|
|
295
|
-
this.token =
|
|
296
|
+
this.token = e;
|
|
296
297
|
}
|
|
297
|
-
async realTimePosition(
|
|
298
|
+
async realTimePosition(e, n = {}) {
|
|
298
299
|
const a = {
|
|
299
300
|
searchParams: {
|
|
300
|
-
id:
|
|
301
|
+
id: e,
|
|
301
302
|
k: this.token,
|
|
302
303
|
enc: 1
|
|
303
304
|
}
|
|
304
|
-
}, o = "https://api.shipxy.com/apicall/GetSingleShip",
|
|
305
|
-
if (
|
|
306
|
-
return
|
|
307
|
-
const t =
|
|
305
|
+
}, o = "https://api.shipxy.com/apicall/GetSingleShip", s = await Y.get(o, a).json();
|
|
306
|
+
if (j.info("[%s] fetch realtime position from: %s - %j", n.requestId, o, a), (s == null ? void 0 : s.status) !== 0)
|
|
307
|
+
return s;
|
|
308
|
+
const t = s.data[0];
|
|
308
309
|
for (const f in t)
|
|
309
310
|
!isNaN(t[f]) && Number(t[f]) !== 1 / 0 && (t[f] = Number(t[f]));
|
|
310
311
|
const { labelCn: r, labelEn: i } = await this.parseStatus(t.navistat), d = p.unix(t.lasttime);
|
|
@@ -331,11 +332,11 @@ class U extends V {
|
|
|
331
332
|
vendor: "shipxy"
|
|
332
333
|
};
|
|
333
334
|
}
|
|
334
|
-
async trajectory(
|
|
335
|
-
var
|
|
336
|
-
const r = await this.realTimePosition(
|
|
335
|
+
async trajectory(e, n, a, o, s = !0, t = {}) {
|
|
336
|
+
var I;
|
|
337
|
+
const r = await this.realTimePosition(e, t), i = p(n), d = p(a), h = "https://api.shipxy.com/apicall/GetShipTrack", f = {
|
|
337
338
|
searchParams: {
|
|
338
|
-
id:
|
|
339
|
+
id: e,
|
|
339
340
|
k: this.token,
|
|
340
341
|
enc: 1,
|
|
341
342
|
cut: 0,
|
|
@@ -343,59 +344,59 @@ class U extends V {
|
|
|
343
344
|
etm: d.unix()
|
|
344
345
|
}
|
|
345
346
|
}, m = await Y.get(h, f).json();
|
|
346
|
-
if (
|
|
347
|
+
if (j.info("[%s] fetch trajectory from: %s - %j", t.requestId, h, f), (m == null ? void 0 : m.status) !== 0)
|
|
347
348
|
return m;
|
|
348
|
-
const u = m == null ? void 0 : m.points, b = [], w = p.unix((
|
|
349
|
+
const u = m == null ? void 0 : m.points, b = [], w = p.unix((I = u[0]) == null ? void 0 : I.utc);
|
|
349
350
|
let k = -1;
|
|
350
351
|
for (const g of u) {
|
|
351
|
-
const
|
|
352
|
+
const v = p.unix(g.utc), S = {
|
|
352
353
|
imo: r == null ? void 0 : r.imo,
|
|
353
|
-
mmsi:
|
|
354
|
+
mmsi: e,
|
|
354
355
|
sog: Math.round(g.sog * 3600 / 1e3 / 1852 * 100) / 100,
|
|
355
356
|
cog: Math.round(g.cog / 100 * 100) / 100,
|
|
356
357
|
lat: Math.round(g.lat / 1e6 * 1e5) / 1e5,
|
|
357
358
|
lng: Math.round(g.lon / 1e6 * 1e5) / 1e5,
|
|
358
|
-
positionTime:
|
|
359
|
-
utc:
|
|
359
|
+
positionTime: v.unix(),
|
|
360
|
+
utc: v.utc().format(),
|
|
360
361
|
method: "trajectory",
|
|
361
362
|
vendor: "shipxy"
|
|
362
|
-
}, l = Math.floor(
|
|
363
|
+
}, l = Math.floor(v.diff(w, "minute", !0) / (o || 1));
|
|
363
364
|
l !== k && (k = l, b.push(S));
|
|
364
365
|
}
|
|
365
366
|
return b;
|
|
366
367
|
}
|
|
367
368
|
}
|
|
368
|
-
class
|
|
369
|
-
constructor(
|
|
369
|
+
class Q extends V {
|
|
370
|
+
constructor(e) {
|
|
370
371
|
super();
|
|
371
372
|
q(this, "token");
|
|
372
|
-
this.token =
|
|
373
|
+
this.token = e;
|
|
373
374
|
}
|
|
374
|
-
async getShipId(
|
|
375
|
+
async getShipId(e, n = {}) {
|
|
375
376
|
const a = {
|
|
376
377
|
headers: {
|
|
377
378
|
appKey: this.token
|
|
378
379
|
},
|
|
379
380
|
json: {
|
|
380
|
-
mmsiList:
|
|
381
|
+
mmsiList: e
|
|
381
382
|
}
|
|
382
|
-
}, o = "https://api3.myships.com/sp/ships/getShipIdByMMSI",
|
|
383
|
-
return
|
|
383
|
+
}, o = "https://api3.myships.com/sp/ships/getShipIdByMMSI", s = await Y.post(o, a).json();
|
|
384
|
+
return j.info("[%s] fetch ship id from: %s - %j", n.requestId, o, a), s.code !== "0" ? s : s.data[0].shipId;
|
|
384
385
|
}
|
|
385
|
-
async getShipInfo(
|
|
386
|
+
async getShipInfo(e, n = {}) {
|
|
386
387
|
const a = {
|
|
387
388
|
headers: {
|
|
388
389
|
appKey: this.token
|
|
389
390
|
},
|
|
390
391
|
json: {
|
|
391
|
-
shipId:
|
|
392
|
+
shipId: e
|
|
392
393
|
}
|
|
393
|
-
}, o = "https://api3.myships.com/sp/ships/aissta",
|
|
394
|
-
if (
|
|
395
|
-
return
|
|
396
|
-
const t =
|
|
394
|
+
}, o = "https://api3.myships.com/sp/ships/aissta", s = await Y.post(o, a).json();
|
|
395
|
+
if (j.info("[%s] fetch ship info from: %s - %j", n.requestId, o, a), s.code !== "0")
|
|
396
|
+
return s;
|
|
397
|
+
const t = s.data;
|
|
397
398
|
let r = t.imo;
|
|
398
|
-
return
|
|
399
|
+
return e === "407170" && (r = "9198379", j.warn("[%s] ship(%s) imo error: %s, should be %s", n.requestId, e, t.imo, r)), {
|
|
399
400
|
mmsi: t.mmsi,
|
|
400
401
|
name: t.shipnameEn,
|
|
401
402
|
imo: r,
|
|
@@ -405,23 +406,23 @@ class J extends V {
|
|
|
405
406
|
draught: (t.draught || 100) / 10
|
|
406
407
|
};
|
|
407
408
|
}
|
|
408
|
-
async realTimePosition(
|
|
409
|
-
const a = await this.getShipId(
|
|
409
|
+
async realTimePosition(e, n = {}) {
|
|
410
|
+
const a = await this.getShipId(e, n), o = await this.getShipInfo(a, n), s = {
|
|
410
411
|
headers: {
|
|
411
412
|
appKey: this.token
|
|
412
413
|
},
|
|
413
414
|
json: {
|
|
414
415
|
shipId: a
|
|
415
416
|
}
|
|
416
|
-
}, t = "https://api3.myships.com/sp/ships/position/latest", r = await Y.post(t,
|
|
417
|
-
|
|
417
|
+
}, t = "https://api3.myships.com/sp/ships/position/latest", r = await Y.post(t, s).json();
|
|
418
|
+
j.info("[%s] fetch realtime position from: %s - %j", n.requestId, t, s);
|
|
418
419
|
const i = r.data[0];
|
|
419
420
|
for (const u in i)
|
|
420
421
|
!isNaN(i[u]) && Number(i[u]) !== 1 / 0 && (i[u] = Number(i[u]));
|
|
421
422
|
const { labelCn: d, labelEn: h } = await this.parseStatus(i.aisNavStatus), f = p.unix(i.posTime);
|
|
422
423
|
return {
|
|
423
424
|
...o,
|
|
424
|
-
mmsi:
|
|
425
|
+
mmsi: e,
|
|
425
426
|
lat: Math.round(i.lat / 1e4 / 60 * 1e5) / 1e5,
|
|
426
427
|
lng: Math.round(i.lon / 1e4 / 60 * 1e5) / 1e5,
|
|
427
428
|
sog: Math.round(i.sog / 10 * 100) / 100,
|
|
@@ -437,54 +438,55 @@ class J extends V {
|
|
|
437
438
|
vendor: "myship"
|
|
438
439
|
};
|
|
439
440
|
}
|
|
440
|
-
async trajectory(
|
|
441
|
-
const r = p(n), i = p(a), d = await this.getShipId(
|
|
441
|
+
async trajectory(e, n, a, o, s = !0, t = {}) {
|
|
442
|
+
const r = p(n), i = p(a), d = await this.getShipId(e), h = await this.getShipInfo(d), f = [];
|
|
442
443
|
for (; i.diff(r, "day", !0) > 30; )
|
|
443
|
-
await this.trajectoryIn30Day(d, r.unix(), r.add(30, "day").unix(), h,
|
|
444
|
-
return await this.trajectoryIn30Day(d, r.unix(), i.unix(), h,
|
|
444
|
+
await this.trajectoryIn30Day(d, r.unix(), r.add(30, "day").unix(), h, e, o, f);
|
|
445
|
+
return await this.trajectoryIn30Day(d, r.unix(), i.unix(), h, e, o, f), f;
|
|
445
446
|
}
|
|
446
|
-
async trajectoryIn30Day(
|
|
447
|
+
async trajectoryIn30Day(e, n, a, o, s, t, r, i = {}) {
|
|
447
448
|
var w;
|
|
448
449
|
const d = {
|
|
449
450
|
headers: {
|
|
450
451
|
appKey: this.token
|
|
451
452
|
},
|
|
452
453
|
json: {
|
|
453
|
-
shipId:
|
|
454
|
+
shipId: e,
|
|
454
455
|
startTime: n,
|
|
455
456
|
endTime: a
|
|
456
457
|
}
|
|
457
458
|
}, h = "https://api3.myships.com/sp/ships/position/history", f = await Y.post(h, d).json();
|
|
458
|
-
if (
|
|
459
|
-
return
|
|
459
|
+
if (j.info("[%s] fetch trajectory from: %s - %j", i.requestId, h, d), f.code !== "0")
|
|
460
|
+
return j.warn("[%s] invoke myship trajectory failed: %j", i.requestId, f), f;
|
|
460
461
|
const m = f.data;
|
|
461
462
|
for (const k in m)
|
|
462
463
|
!isNaN(m[k]) && Number(m[k]) !== 1 / 0 && (m[k] = Number(m[k]));
|
|
463
464
|
const u = p.unix((w = m[0]) == null ? void 0 : w.posTime);
|
|
464
465
|
let b = -1;
|
|
465
466
|
for (const k of m) {
|
|
466
|
-
const
|
|
467
|
+
const I = p.unix(k.posTime), g = {
|
|
467
468
|
imo: o == null ? void 0 : o.imo,
|
|
468
|
-
mmsi:
|
|
469
|
+
mmsi: s,
|
|
469
470
|
lat: Math.round(k.lat / 1e4 / 60 * 1e5) / 1e5,
|
|
470
471
|
lng: Math.round(k.lon / 1e4 / 60 * 1e5) / 1e5,
|
|
471
472
|
sog: Math.round(k.sog / 10 * 100) / 100,
|
|
472
473
|
cog: Math.round(k.cog / 10 * 100) / 100,
|
|
473
474
|
hdg: Math.round(k.heading * 100) / 100,
|
|
474
475
|
rot: Math.round(k.rot * 100) / 100,
|
|
475
|
-
positionTime:
|
|
476
|
-
utc:
|
|
476
|
+
positionTime: I.unix(),
|
|
477
|
+
utc: I.utc().format(),
|
|
477
478
|
method: "trajectory",
|
|
478
479
|
vendor: "myship"
|
|
479
|
-
},
|
|
480
|
-
|
|
480
|
+
}, v = Math.floor(I.diff(u, "minute", !0) / (t || 1));
|
|
481
|
+
v !== b && (b = v, r.push(g));
|
|
481
482
|
}
|
|
482
483
|
return r;
|
|
483
484
|
}
|
|
484
485
|
}
|
|
485
486
|
const $ = W.getLogger();
|
|
486
|
-
|
|
487
|
-
|
|
487
|
+
$.level = "info";
|
|
488
|
+
var K = /* @__PURE__ */ ((M) => (M.NOTICE = "NOTICE", M.WARN = "WARN", M.HEAVY = "HEAVY", M.SEVERE = "SEVERE", M.ERROR = "ERROR", M.FATAL = "FATAL", M))(K || {});
|
|
489
|
+
class L {
|
|
488
490
|
/**
|
|
489
491
|
* 解析告警规则, 多规则场景
|
|
490
492
|
* @param rule
|
|
@@ -493,24 +495,24 @@ class Q {
|
|
|
493
495
|
*
|
|
494
496
|
* @param options
|
|
495
497
|
*/
|
|
496
|
-
parsePrinciple(c,
|
|
498
|
+
parsePrinciple(c, e = {}) {
|
|
497
499
|
var t, r, i;
|
|
498
|
-
$.info("[%s] parse rule: %s",
|
|
500
|
+
$.info("[%s] parse rule: %s", e.requestId, c);
|
|
499
501
|
const n = new RegExp("(?<=\\[)(.+)(?=\\])", "g"), a = c.match(n) ? (t = c.match(n)) == null ? void 0 : t[0] : void 0, o = a == null ? void 0 : a.split(";");
|
|
500
502
|
if (!o)
|
|
501
503
|
return;
|
|
502
|
-
const
|
|
504
|
+
const s = {};
|
|
503
505
|
for (let d = 0; d < (o == null ? void 0 : o.length); d++) {
|
|
504
506
|
const h = (i = (r = o[d].match(n)) == null ? void 0 : r[0]) == null ? void 0 : i.split("],");
|
|
505
507
|
if (d === 0 && !h)
|
|
506
|
-
|
|
508
|
+
s.scope = o[0];
|
|
507
509
|
else if (h)
|
|
508
510
|
for (let f = 0, m = h.length; f < m; f++) {
|
|
509
511
|
const u = this.parseRule(h[f]);
|
|
510
|
-
u && (
|
|
512
|
+
u && (s[u.level] ? u.key ? s[u.level][u == null ? void 0 : u.key] = u : s[u.level] = u : u.key ? s[u.level] = { [u == null ? void 0 : u.key]: u } : s[u.level] = u);
|
|
511
513
|
}
|
|
512
514
|
}
|
|
513
|
-
return
|
|
515
|
+
return s;
|
|
514
516
|
}
|
|
515
517
|
/**
|
|
516
518
|
* 解析单一告警规则
|
|
@@ -518,10 +520,10 @@ class Q {
|
|
|
518
520
|
* @param rule
|
|
519
521
|
* @param options
|
|
520
522
|
*/
|
|
521
|
-
parseRule(c,
|
|
522
|
-
var
|
|
523
|
-
$.info("[%s] parse rule: %s",
|
|
524
|
-
const n = new RegExp("(?<=\\[)(.+?)(?=\\])", "g"), a = (
|
|
523
|
+
parseRule(c, e = {}) {
|
|
524
|
+
var s;
|
|
525
|
+
$.info("[%s] parse rule: %s", e.requestId, c), c = c.startsWith("[") ? c : `[${c}`, c = c.endsWith("]") ? c : `${c}]`;
|
|
526
|
+
const n = new RegExp("(?<=\\[)(.+?)(?=\\])", "g"), a = (s = c == null ? void 0 : c.match(n)) == null ? void 0 : s[0], o = a == null ? void 0 : a.split(",");
|
|
525
527
|
if (o)
|
|
526
528
|
return { operator: o[0], number: Number(o[1]), level: o[2], time: Number(o[3]), key: o[4] };
|
|
527
529
|
}
|
|
@@ -531,23 +533,25 @@ class Q {
|
|
|
531
533
|
* @param principle 告警规则
|
|
532
534
|
* @param options
|
|
533
535
|
*/
|
|
534
|
-
checkWeather(c,
|
|
535
|
-
var u, b, w, k,
|
|
536
|
-
let a = 0, o = 0,
|
|
537
|
-
const r = ((b = (u =
|
|
536
|
+
checkWeather(c, e, n = {}) {
|
|
537
|
+
var u, b, w, k, I, g, v, S, l, H, _, R, E, N, x;
|
|
538
|
+
let a = 0, o = 0, s = 0, t = 0;
|
|
539
|
+
const r = ((b = (u = e == null ? void 0 : e.SEVERE) == null ? void 0 : u.sigWave) == null ? void 0 : b.number) * 1.6, i = (k = (w = e == null ? void 0 : e.SEVERE) == null ? void 0 : w.sigWave) == null ? void 0 : k.number, d = (g = (I = e == null ? void 0 : e.HEAVY) == null ? void 0 : I.sigWave) == null ? void 0 : g.number, h = ((S = (v = e == null ? void 0 : e.SEVERE) == null ? void 0 : v.wind) == null ? void 0 : S.number) + 2, f = (H = (l = e == null ? void 0 : e.SEVERE) == null ? void 0 : l.wind) == null ? void 0 : H.number, m = (R = (_ = e == null ? void 0 : e.HEAVY) == null ? void 0 : _.wind) == null ? void 0 : R.number;
|
|
538
540
|
for (let A = 1; A < (c == null ? void 0 : c.length); A++) {
|
|
539
541
|
const y = c[A], T = (N = (E = y == null ? void 0 : y.meteo) == null ? void 0 : E.wave) == null ? void 0 : N.sig, D = (x = y == null ? void 0 : y.meteo) == null ? void 0 : x.wind, P = p(y.eta).diff(p(c[A - 1].eta), "hour", !0);
|
|
540
|
-
t = P > t ? P : t, $.info("[%s] check sig.wave: %j", n.requestId, { ...T, dgThd4Wv: r, svThd4Wv: i, hvThd4Wv: d }), (T == null ? void 0 : T.height) >= r ? y.isDangerous = !0 : (T == null ? void 0 : T.height) >= i ? y.isSevere = !0 : (T == null ? void 0 : T.height) >= d && (y.isHeavy = !0), $.info("[%s] check wind: %j", n.requestId, { ...D, dgThd4Wd: h, svThd4Wd: f, hvThd4Wd: m }), (D == null ? void 0 : D.scale) >= h ? (y.isDangerous = !0, delete y.isSevere, delete y.isHeavy) : (D == null ? void 0 : D.scale) > f ? (y.isDangerous || (y.isSevere = !0), delete y.isHeavy) : (D == null ? void 0 : D.scale) === m && !y.isDangerous && !y.isSevere && (y.isHeavy = !0), a += y.isDangerous ? P : 0, o += y.isSevere ? P : 0,
|
|
542
|
+
t = P > t ? P : t, $.info("[%s] check sig.wave: %j", n.requestId, { ...T, dgThd4Wv: r, svThd4Wv: i, hvThd4Wv: d }), (T == null ? void 0 : T.height) >= r ? y.isDangerous = !0 : (T == null ? void 0 : T.height) >= i ? y.isSevere = !0 : (T == null ? void 0 : T.height) >= d && (y.isHeavy = !0), $.info("[%s] check wind: %j", n.requestId, { ...D, dgThd4Wd: h, svThd4Wd: f, hvThd4Wd: m }), (D == null ? void 0 : D.scale) >= h ? (y.isDangerous = !0, delete y.isSevere, delete y.isHeavy) : (D == null ? void 0 : D.scale) > f ? (y.isDangerous || (y.isSevere = !0), delete y.isHeavy) : (D == null ? void 0 : D.scale) === m && !y.isDangerous && !y.isSevere && (y.isHeavy = !0), a += y.isDangerous ? P : 0, o += y.isSevere ? P : 0, s += y.isHeavy ? P : 0, A === 1 && (c[0].isDangerous = y.isDangerous, c[0].isSevere = y.isSevere, c[0].isHeavy = y.isHeavy);
|
|
541
543
|
}
|
|
542
|
-
return a = Math.round(a * 100) / 100, o = Math.round(o * 100) / 100,
|
|
544
|
+
return a = Math.round(a * 100) / 100, o = Math.round(o * 100) / 100, s = Math.round(s * 100) / 100, t = Math.round(t), { sample: c, dangerous: a, severe: o, heavy: s, step: t < 3 ? 3 : t, wind: { dgThd4Wd: h, svThd4Wd: f, hvThd4Wd: m }, sig: { dgThd4Wv: r, svThd4Wv: i, hvThd4Wv: d } };
|
|
543
545
|
}
|
|
544
546
|
}
|
|
547
|
+
const X = new L();
|
|
545
548
|
export {
|
|
546
549
|
V as AISImpl,
|
|
547
|
-
|
|
550
|
+
L as AlertHelper,
|
|
548
551
|
K as AlertLevel,
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
552
|
+
U as HifleetImpl,
|
|
553
|
+
Q as MyShipImpl,
|
|
554
|
+
B as MyVesselImpl,
|
|
555
|
+
J as ShipxyImpl,
|
|
556
|
+
X as alertHelper
|
|
553
557
|
};
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(b,y){typeof exports=="object"&&typeof module<"u"?y(exports,require("got"),require("log4js"),require("moment")):typeof define=="function"&&define.amd?define(["exports","got","log4js","moment"],y):(b=typeof globalThis<"u"?globalThis:b||self,y(b["idm-plugin-rabbitmq"]={},b.got,b.log4js,b.moment))})(this,function(b,y,q,p){"use strict";var J=Object.defineProperty;var Q=(b,y,q)=>y in b?J(b,y,{enumerable:!0,configurable:!0,writable:!0,value:q}):b[y]=q;var A=(b,y,q)=>(Q(b,typeof y!="symbol"?y+"":y,q),q);function L(I){const f=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(I){for(const e in I)if(e!=="default"){const a=Object.getOwnPropertyDescriptor(I,e);Object.defineProperty(f,e,a.get?a:{enumerable:!0,get:()=>I[e]})}}return f.default=I,Object.freeze(f)}const C=L(q),M=C.getLogger();class O{parseStatus(f){let e,a;switch(f){case 0:e="在航(主机推动)",a="The engine is in use";break;case 1:e="锚泊",a="Anchored";break;case 2:e="失控",a="Not operated";break;case 3:e="操纵受限",a="Limited airworthiness";break;case 4:e="吃水受限",a="Limited by ship's draft";break;case 5:e="靠泊",a="Mooring";break;case 6:e="搁浅",a="Stranded";break;case 7:e="捕捞作业",a="Engaged in fishing";break;case 8:e="靠帆船提供动力",a="Sailing";break;default:e="未定义",a="Undefined"}return{labelCn:e,labelEn:a}}}class z extends O{constructor(e,a){super();A(this,"clientId");A(this,"clientSecret");A(this,"token");this.clientId=e,this.clientSecret=a}async authToken(e={}){const a="https://svc.data.myvessel.cn/ada/oauth/token",n={searchParams:{client_id:this.clientId,client_secret:this.clientSecret,grant_type:"client_credentials"}},o=await y.post(a,n).json();M.info("[%s] fetch access token from: %s - %j",e.requestId,a,o),o.error||(this.token={accessToken:o.access_token,tokenType:o.token_type,expiresIn:o.expires_in,scope:o.scope,jti:o.jti,issuedAt:p().utc().format()})}async realTimePosition(e,a={}){var d,c,l;(!this.token||p().diff(p(this.token.issuedAt),"seconds")>((d=this.token)==null?void 0:d.expiresIn)-300)&&await this.authToken(a);const n="https://svc.data.myvessel.cn/sdc/v1/vessels/status/location/unit",o={headers:{Authorization:`${(c=this.token)==null?void 0:c.tokenType} ${(l=this.token)==null?void 0:l.accessToken}`},searchParams:{mmsi:e}};M.info("[%s] fetch realtime position from: %s - %j",a.requestId,n,o);const s=await y.get(n,o).json();if(s.code)return M.warn("[%s] fetch realtime position failed: %j",a.requestId,n,{message:s.message,status:s.status,code:s.code}),s;const t=s.data;for(const h in t)!isNaN(t[h])&&Number(t[h])!==1/0&&(t[h]=Number(t[h]));const r=p(`${t.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:t.mmsi,name:t.vesselName,imo:t.imo,callSign:t.callsign,lat:t.lat,lng:t.lon,length:t.length,width:t.width,draught:t.currDraught,sog:t.sog,cog:t.cog,hdg:t.hdg,rot:t.rot,eta:t.eta,destination:t.dest,positionTime:r.unix(),status:t.status,labelCn:t.statusNameCn,labelEn:t.statusNameEn,method:"position",vendor:"myVessel",utc:r.utc().format()}}async trajectory(e,a,n,o,s=!0,t={}){(!this.token||p().diff(p(this.token.issuedAt),"seconds")>this.token.expiresIn-300)&&await this.authToken(t);const r=await this.realTimePosition(e,t),i=p(a),d=p(n),c=[];for(;d.diff(i,"day",!0)>30;)await this.trajectoryIn30Day(e,i,i.clone().add(30,"day"),r,o,c,t),i.add(30,"day");return await this.trajectoryIn30Day(e,i,d,r,o,c,t),c}async trajectoryIn30Day(e,a,n,o,s,t,r={}){var u,v,Y,j,S;const i="https://svc.data.myvessel.cn/sdc/v1/vessels/status/track",d={headers:{Authorization:`${(u=this.token)==null?void 0:u.tokenType} ${(v=this.token)==null?void 0:v.accessToken}`},json:{mmsi:e,startTime:a.utcOffset(8).format("YYYY-MM-DD HH:mm:ss"),endTime:n.utcOffset(8).format("YYYY-MM-DD HH:mm:ss")}};M.info("[%s] fetch trajectory from: %s - %j",r.requestId,i,d);const c=await y.post(i,d).json();if(c.code)return M.warn("[%s] fetch trajectory failed: %j",r.requestId,i,{message:c.message,status:c.status,code:c.code}),c;let l=-1;const h=p(`${(j=(Y=c.data)==null?void 0:Y[0])==null?void 0:j.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return(S=c.data)==null||S.forEach(g=>{for(const T in g)!isNaN(g[T])&&Number(g[T])!==1/0&&(g[T]=Number(g[T]));const w=p(`${g.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"),N=g.eta?p(`${g.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"):void 0,m=g.status,{labelCn:E,labelEn:P}=this.parseStatus(m),R={mmsi:g.mmsi,imo:o==null?void 0:o.imo,lat:g.lat,lng:g.lon,sog:g.sog,cog:g.cog,hdg:g.hdg,draught:g.draught,status:m,eta:N==null?void 0:N.unix(),destination:g.dest,positionTime:w.unix(),labelCn:E,labelEn:P,method:"trajectory",vendor:"myVessel",utc:w.utc().format()},x=Math.floor(w.diff(h,"minute",!0)/(s||1));x!==l&&(l=x,t.push(R))}),t}}class F extends O{constructor(e){super();A(this,"token");this.token=e}async realTimePosition(e,a={}){const n="https://api.hifleet.com/position/position/get/token",o={searchParams:{mmsi:e,usertoken:this.token}},s=await y.post(n,o).json();M.info("[%s] fetch realtime position from: %s - %j",a.requestId,n,o);const t=s==null?void 0:s.list;if(!t)return M.warn("[%s] fetch realtime position failed: %j",a.requestId,n,s),s;for(const h in t)!isNaN(t[h])&&Number(t[h])!==1/0&&(t[h]=Number(t[h]));t.status=t.sp>3?0:1;const r=t.status,{labelCn:i,labelEn:d}=this.parseStatus(r),c=p(`${t.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:t.m,name:t.n,imo:t.imonumber,callSign:t.callsign,lat:Math.round(t.la/60*1e5)/1e5,lng:Math.round(t.lo/60*1e5)/1e5,length:t.l,width:t.w,draught:t.draught,sog:t.sp,cog:t.co,hdg:t.h,rot:isNaN(t.rot)?0:t.rot,eta:/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(t.eta)?p(`${t.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00").unix():void 0,destination:t.destination,positionTime:c.unix(),utc:c.utc().format(),status:r,labelCn:i,labelEn:d,method:"position",vendor:"hifleet"}}async search(e,a={}){let n="https://www.hifleet.com/hifleetapi/searchVesselOL.do";const o={searchParams:{keyword:e},headers:{Referer:"https://www.hifleet.com",Origin:"https://www.hifleet.com",Host:"www.hifleet.com"}};let s=await y.post(n,o).json();M.info("[%s] fetch vessel props from: %s - %j",a.requestId,n,o),s instanceof Array&&(s=s[0]);for(const r in s)!isNaN(s[r])&&Number(s[r])!==1/0&&(s[r]=Number(s[r]));const t={mmsi:s.m,name:s.n,imo:s.i,callSign:s.c,length:s.l,breadth:s.b,draught:s.dr};return n="https://www.hifleet.com/hifleetapi/sameShipSearch.do",s=await y.post(n,o).json(),M.info("[%s] fetch vessel dead weight from: %s - %j",a.requestId,n,o),s instanceof Array&&(s=s[0]),s&&(t.deadweight=Number(s.dwt)),t}async trajectory(e,a,n,o,s=!0,t={}){var g,w,N;const r=await this.realTimePosition(e,t);let i=p(a);const d=p(n),c=p();if(s){let m=d.diff(i,"d",!0);m<0?i=d.clone().subtract(40,"d"):m<30?i.subtract(10,"d"):m<60?i.subtract(5,"d"):i=d.clone().subtract(80,"d"),m=c.diff(d,"d",!0),d.add(m>10?240:m*24,"h")}const l={searchParams:{endtime:d.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),starttime:i.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),mmsi:e,usertoken:this.token}},h="https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token",u=await y.get(h,l).json();M.info("[%s] fetch trajectory from: %s - %j",t.requestId,h,l);let v;u&&(v=((w=(g=u.ships)==null?void 0:g.offors)==null?void 0:w.ship)||[],v.length||M.warn("[%s] fetch trajectory failed: %j",t.requestId,u));const Y=[];let j=-1;const S=p(`${(N=v==null?void 0:v[0])==null?void 0:N.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");for(const m of v){for(const _ in m)!isNaN(m[_])&&Number(m[_])!==1/0&&(m[_]=Number(m[_]));const E=p(`${m.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");m.status=m.sp>4?0:1;const{labelEn:P,labelCn:R}=this.parseStatus(m.status),x={mmsi:m.m,name:m.n,imo:r==null?void 0:r.imo,lat:m.la,lng:m.lo,draught:m.draught,sog:m.sp,cog:m.co,hdg:m.hdg,positionTime:E.unix(),utc:E.utc().format(),status:m.status,labelCn:R,labelEn:P,method:"trajectory",vendor:"hifleet"},T=Math.floor(E.diff(S,"minute",!0)/(o||1));T!==j&&(j=T,Y.push(x))}return Y}}class G extends O{constructor(e){super();A(this,"token");this.token=e}async realTimePosition(e,a={}){const n={searchParams:{id:e,k:this.token,enc:1}},o="https://api.shipxy.com/apicall/GetSingleShip",s=await y.get(o,n).json();if(M.info("[%s] fetch realtime position from: %s - %j",a.requestId,o,n),(s==null?void 0:s.status)!==0)return s;const t=s.data[0];for(const l in t)!isNaN(t[l])&&Number(t[l])!==1/0&&(t[l]=Number(t[l]));const{labelCn:r,labelEn:i}=await this.parseStatus(t.navistat),d=p.unix(t.lasttime);return{mmsi:t.ShipID,name:t.name,imo:t.imo,callSign:t.callsign,lat:Math.round(t.lat/1e6*1e5)/1e5,lng:Math.round(t.lon/1e6*1e5)/1e5,length:Math.round(t.length/10*100)/100,width:Math.round(t.width/10*100)/100,draught:Math.round(t.draught/1e3*100)/100,sog:Math.round(t.sog*3600/1e3/1852*100)/100,cog:Math.round(t.cog/100*100)/100,hdg:Math.round(t.hdg/100*100)/100,rot:Math.round(t.rot/100*100)/100,positionTime:t.lasttime,utc:d.utc().format(),status:t.navistat,labelEn:i,labelCn:r,method:"position",vendor:"shipxy"}}async trajectory(e,a,n,o,s=!0,t={}){var S;const r=await this.realTimePosition(e,t),i=p(a),d=p(n),c="https://api.shipxy.com/apicall/GetShipTrack",l={searchParams:{id:e,k:this.token,enc:1,cut:0,btm:i.unix(),etm:d.unix()}},h=await y.get(c,l).json();if(M.info("[%s] fetch trajectory from: %s - %j",t.requestId,c,l),(h==null?void 0:h.status)!==0)return h;const u=h==null?void 0:h.points,v=[],Y=p.unix((S=u[0])==null?void 0:S.utc);let j=-1;for(const g of u){const w=p.unix(g.utc),N={imo:r==null?void 0:r.imo,mmsi:e,sog:Math.round(g.sog*3600/1e3/1852*100)/100,cog:Math.round(g.cog/100*100)/100,lat:Math.round(g.lat/1e6*1e5)/1e5,lng:Math.round(g.lon/1e6*1e5)/1e5,positionTime:w.unix(),utc:w.utc().format(),method:"trajectory",vendor:"shipxy"},m=Math.floor(w.diff(Y,"minute",!0)/(o||1));m!==j&&(j=m,v.push(N))}return v}}class B extends O{constructor(e){super();A(this,"token");this.token=e}async getShipId(e,a={}){const n={headers:{appKey:this.token},json:{mmsiList:e}},o="https://api3.myships.com/sp/ships/getShipIdByMMSI",s=await y.post(o,n).json();return M.info("[%s] fetch ship id from: %s - %j",a.requestId,o,n),s.code!=="0"?s:s.data[0].shipId}async getShipInfo(e,a={}){const n={headers:{appKey:this.token},json:{shipId:e}},o="https://api3.myships.com/sp/ships/aissta",s=await y.post(o,n).json();if(M.info("[%s] fetch ship info from: %s - %j",a.requestId,o,n),s.code!=="0")return s;const t=s.data;let r=t.imo;return e==="407170"&&(r="9198379",M.warn("[%s] ship(%s) imo error: %s, should be %s",a.requestId,e,t.imo,r)),{mmsi:t.mmsi,name:t.shipnameEn,imo:r,callSign:t.callSign,length:t.length,width:t.breadth,draught:(t.draught||100)/10}}async realTimePosition(e,a={}){const n=await this.getShipId(e,a),o=await this.getShipInfo(n,a),s={headers:{appKey:this.token},json:{shipId:n}},t="https://api3.myships.com/sp/ships/position/latest",r=await y.post(t,s).json();M.info("[%s] fetch realtime position from: %s - %j",a.requestId,t,s);const i=r.data[0];for(const u in i)!isNaN(i[u])&&Number(i[u])!==1/0&&(i[u]=Number(i[u]));const{labelCn:d,labelEn:c}=await this.parseStatus(i.aisNavStatus),l=p.unix(i.posTime);return{...o,mmsi:e,lat:Math.round(i.lat/1e4/60*1e5)/1e5,lng:Math.round(i.lon/1e4/60*1e5)/1e5,sog:Math.round(i.sog/10*100)/100,cog:Math.round(i.cog/10*100)/100,hdg:Math.round(i.heading*100)/100,rot:Math.round(i.rot*100)/100,positionTime:i.posTime,utc:l.utc().format(),status:i.aisNavStatus,labelEn:c,labelCn:d,method:"position",vendor:"myship"}}async trajectory(e,a,n,o,s=!0,t={}){const r=p(a),i=p(n),d=await this.getShipId(e),c=await this.getShipInfo(d),l=[];for(;i.diff(r,"day",!0)>30;)await this.trajectoryIn30Day(d,r.unix(),r.add(30,"day").unix(),c,e,o,l);return await this.trajectoryIn30Day(d,r.unix(),i.unix(),c,e,o,l),l}async trajectoryIn30Day(e,a,n,o,s,t,r,i={}){var Y;const d={headers:{appKey:this.token},json:{shipId:e,startTime:a,endTime:n}},c="https://api3.myships.com/sp/ships/position/history",l=await y.post(c,d).json();if(M.info("[%s] fetch trajectory from: %s - %j",i.requestId,c,d),l.code!=="0")return M.warn("[%s] invoke myship trajectory failed: %j",i.requestId,l),l;const h=l.data;for(const j in h)!isNaN(h[j])&&Number(h[j])!==1/0&&(h[j]=Number(h[j]));const u=p.unix((Y=h[0])==null?void 0:Y.posTime);let v=-1;for(const j of h){const S=p.unix(j.posTime),g={imo:o==null?void 0:o.imo,mmsi:s,lat:Math.round(j.lat/1e4/60*1e5)/1e5,lng:Math.round(j.lon/1e4/60*1e5)/1e5,sog:Math.round(j.sog/10*100)/100,cog:Math.round(j.cog/10*100)/100,hdg:Math.round(j.heading*100)/100,rot:Math.round(j.rot*100)/100,positionTime:S.unix(),utc:S.utc().format(),method:"trajectory",vendor:"myship"},w=Math.floor(S.diff(u,"minute",!0)/(t||1));w!==v&&(v=w,r.push(g))}return r}}const W=C.getLogger();var K=(I=>(I.NOTICE="NOTICE",I.WARN="WARN",I.HEAVY="HEAVY",I.SEVERE="SEVERE",I.ERROR="ERROR",I.FATAL="FATAL",I))(K||{});class U{parsePrinciple(f,e={}){var t,r,i;W.info("[%s] parse rule: %s",e.requestId,f);const a=new RegExp("(?<=\\[)(.+)(?=\\])","g"),n=f.match(a)?(t=f.match(a))==null?void 0:t[0]:void 0,o=n==null?void 0:n.split(";");if(!o)return;const s={};for(let d=0;d<(o==null?void 0:o.length);d++){const c=(i=(r=o[d].match(a))==null?void 0:r[0])==null?void 0:i.split("],");if(d===0&&!c)s.scope=o[0];else if(c)for(let l=0,h=c.length;l<h;l++){const u=this.parseRule(c[l]);u&&(s[u.level]?u.key?s[u.level][u==null?void 0:u.key]=u:s[u.level]=u:u.key?s[u.level]={[u==null?void 0:u.key]:u}:s[u.level]=u)}}return s}parseRule(f,e={}){var s;W.info("[%s] parse rule: %s",e.requestId,f),f=f.startsWith("[")?f:`[${f}`,f=f.endsWith("]")?f:`${f}]`;const a=new RegExp("(?<=\\[)(.+?)(?=\\])","g"),n=(s=f==null?void 0:f.match(a))==null?void 0:s[0],o=n==null?void 0:n.split(",");if(o)return{operator:o[0],number:Number(o[1]),level:o[2],time:Number(o[3]),key:o[4]}}checkWeather(f,e,a={}){var u,v,Y,j,S,g,w,N,m,E,P,R,x,T,_;let n=0,o=0,s=0,t=0;const r=((v=(u=e==null?void 0:e.SEVERE)==null?void 0:u.sigWave)==null?void 0:v.number)*1.6,i=(j=(Y=e==null?void 0:e.SEVERE)==null?void 0:Y.sigWave)==null?void 0:j.number,d=(g=(S=e==null?void 0:e.HEAVY)==null?void 0:S.sigWave)==null?void 0:g.number,c=((N=(w=e==null?void 0:e.SEVERE)==null?void 0:w.wind)==null?void 0:N.number)+2,l=(E=(m=e==null?void 0:e.SEVERE)==null?void 0:m.wind)==null?void 0:E.number,h=(R=(P=e==null?void 0:e.HEAVY)==null?void 0:P.wind)==null?void 0:R.number;for(let V=1;V<(f==null?void 0:f.length);V++){const k=f[V],D=(T=(x=k==null?void 0:k.meteo)==null?void 0:x.wave)==null?void 0:T.sig,H=(_=k==null?void 0:k.meteo)==null?void 0:_.wind,$=p(k.eta).diff(p(f[V-1].eta),"hour",!0);t=$>t?$:t,W.info("[%s] check sig.wave: %j",a.requestId,{...D,dgThd4Wv:r,svThd4Wv:i,hvThd4Wv:d}),(D==null?void 0:D.height)>=r?k.isDangerous=!0:(D==null?void 0:D.height)>=i?k.isSevere=!0:(D==null?void 0:D.height)>=d&&(k.isHeavy=!0),W.info("[%s] check wind: %j",a.requestId,{...H,dgThd4Wd:c,svThd4Wd:l,hvThd4Wd:h}),(H==null?void 0:H.scale)>=c?(k.isDangerous=!0,delete k.isSevere,delete k.isHeavy):(H==null?void 0:H.scale)>l?(k.isDangerous||(k.isSevere=!0),delete k.isHeavy):(H==null?void 0:H.scale)===h&&!k.isDangerous&&!k.isSevere&&(k.isHeavy=!0),n+=k.isDangerous?$:0,o+=k.isSevere?$:0,s+=k.isHeavy?$:0,V===1&&(f[0].isDangerous=k.isDangerous,f[0].isSevere=k.isSevere,f[0].isHeavy=k.isHeavy)}return n=Math.round(n*100)/100,o=Math.round(o*100)/100,s=Math.round(s*100)/100,t=Math.round(t),{sample:f,dangerous:n,severe:o,heavy:s,step:t<3?3:t,wind:{dgThd4Wd:c,svThd4Wd:l,hvThd4Wd:h},sig:{dgThd4Wv:r,svThd4Wv:i,hvThd4Wv:d}}}}b.AISImpl=O,b.AlertHelper=U,b.AlertLevel=K,b.HifleetImpl=F,b.MyShipImpl=B,b.MyVesselImpl=z,b.ShipxyImpl=G,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(b,y){typeof exports=="object"&&typeof module<"u"?y(exports,require("got"),require("log4js"),require("moment")):typeof define=="function"&&define.amd?define(["exports","got","log4js","moment"],y):(b=typeof globalThis<"u"?globalThis:b||self,y(b["idm-plugin-rabbitmq"]={},b.got,b.log4js,b.moment))})(this,function(b,y,q,p){"use strict";var Q=Object.defineProperty;var X=(b,y,q)=>y in b?Q(b,y,{enumerable:!0,configurable:!0,writable:!0,value:q}):b[y]=q;var A=(b,y,q)=>(X(b,typeof y!="symbol"?y+"":y,q),q);function z(I){const f=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(I){for(const e in I)if(e!=="default"){const a=Object.getOwnPropertyDescriptor(I,e);Object.defineProperty(f,e,a.get?a:{enumerable:!0,get:()=>I[e]})}}return f.default=I,Object.freeze(f)}const C=z(q),M=C.getLogger();M.level="info";class O{parseStatus(f){let e,a;switch(f){case 0:e="在航(主机推动)",a="The engine is in use";break;case 1:e="锚泊",a="Anchored";break;case 2:e="失控",a="Not operated";break;case 3:e="操纵受限",a="Limited airworthiness";break;case 4:e="吃水受限",a="Limited by ship's draft";break;case 5:e="靠泊",a="Mooring";break;case 6:e="搁浅",a="Stranded";break;case 7:e="捕捞作业",a="Engaged in fishing";break;case 8:e="靠帆船提供动力",a="Sailing";break;default:e="未定义",a="Undefined"}return{labelCn:e,labelEn:a}}}class F extends O{constructor(e,a){super();A(this,"clientId");A(this,"clientSecret");A(this,"token");this.clientId=e,this.clientSecret=a}async authToken(e={}){const a="https://svc.data.myvessel.cn/ada/oauth/token",n={searchParams:{client_id:this.clientId,client_secret:this.clientSecret,grant_type:"client_credentials"}},o=await y.post(a,n).json();M.info("[%s] fetch access token from: %s - %j",e.requestId,a,o),o.error||(this.token={accessToken:o.access_token,tokenType:o.token_type,expiresIn:o.expires_in,scope:o.scope,jti:o.jti,issuedAt:p().utc().format()})}async realTimePosition(e,a={}){var d,c,l;(!this.token||p().diff(p(this.token.issuedAt),"seconds")>((d=this.token)==null?void 0:d.expiresIn)-300)&&await this.authToken(a);const n="https://svc.data.myvessel.cn/sdc/v1/vessels/status/location/unit",o={headers:{Authorization:`${(c=this.token)==null?void 0:c.tokenType} ${(l=this.token)==null?void 0:l.accessToken}`},searchParams:{mmsi:e}};M.info("[%s] fetch realtime position from: %s - %j",a.requestId,n,o);const s=await y.get(n,o).json();if(s.code)return M.warn("[%s] fetch realtime position failed: %j",a.requestId,n,{message:s.message,status:s.status,code:s.code}),s;const t=s.data;for(const h in t)!isNaN(t[h])&&Number(t[h])!==1/0&&(t[h]=Number(t[h]));const r=p(`${t.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:t.mmsi,name:t.vesselName,imo:t.imo,callSign:t.callsign,lat:t.lat,lng:t.lon,length:t.length,width:t.width,draught:t.currDraught,sog:t.sog,cog:t.cog,hdg:t.hdg,rot:t.rot,eta:t.eta,destination:t.dest,positionTime:r.unix(),status:t.status,labelCn:t.statusNameCn,labelEn:t.statusNameEn,method:"position",vendor:"myVessel",utc:r.utc().format()}}async trajectory(e,a,n,o,s=!0,t={}){(!this.token||p().diff(p(this.token.issuedAt),"seconds")>this.token.expiresIn-300)&&await this.authToken(t);const r=await this.realTimePosition(e,t),i=p(a),d=p(n),c=[];for(;d.diff(i,"day",!0)>30;)await this.trajectoryIn30Day(e,i,i.clone().add(30,"day"),r,o,c,t),i.add(30,"day");return await this.trajectoryIn30Day(e,i,d,r,o,c,t),c}async trajectoryIn30Day(e,a,n,o,s,t,r={}){var u,v,Y,j,S;const i="https://svc.data.myvessel.cn/sdc/v1/vessels/status/track",d={headers:{Authorization:`${(u=this.token)==null?void 0:u.tokenType} ${(v=this.token)==null?void 0:v.accessToken}`},json:{mmsi:e,startTime:a.utcOffset(8).format("YYYY-MM-DD HH:mm:ss"),endTime:n.utcOffset(8).format("YYYY-MM-DD HH:mm:ss")}};M.info("[%s] fetch trajectory from: %s - %j",r.requestId,i,d);const c=await y.post(i,d).json();if(c.code)return M.warn("[%s] fetch trajectory failed: %j",r.requestId,i,{message:c.message,status:c.status,code:c.code}),c;let l=-1;const h=p(`${(j=(Y=c.data)==null?void 0:Y[0])==null?void 0:j.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return(S=c.data)==null||S.forEach(g=>{for(const T in g)!isNaN(g[T])&&Number(g[T])!==1/0&&(g[T]=Number(g[T]));const w=p(`${g.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"),N=g.eta?p(`${g.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"):void 0,m=g.status,{labelCn:E,labelEn:P}=this.parseStatus(m),R={mmsi:g.mmsi,imo:o==null?void 0:o.imo,lat:g.lat,lng:g.lon,sog:g.sog,cog:g.cog,hdg:g.hdg,draught:g.draught,status:m,eta:N==null?void 0:N.unix(),destination:g.dest,positionTime:w.unix(),labelCn:E,labelEn:P,method:"trajectory",vendor:"myVessel",utc:w.utc().format()},x=Math.floor(w.diff(h,"minute",!0)/(s||1));x!==l&&(l=x,t.push(R))}),t}}class G extends O{constructor(e){super();A(this,"token");this.token=e}async realTimePosition(e,a={}){const n="https://api.hifleet.com/position/position/get/token",o={searchParams:{mmsi:e,usertoken:this.token}},s=await y.post(n,o).json();M.info("[%s] fetch realtime position from: %s - %j",a.requestId,n,o);const t=s==null?void 0:s.list;if(!t)return M.warn("[%s] fetch realtime position failed: %j",a.requestId,n,s),s;for(const h in t)!isNaN(t[h])&&Number(t[h])!==1/0&&(t[h]=Number(t[h]));t.status=t.sp>3?0:1;const r=t.status,{labelCn:i,labelEn:d}=this.parseStatus(r),c=p(`${t.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:t.m,name:t.n,imo:t.imonumber,callSign:t.callsign,lat:Math.round(t.la/60*1e5)/1e5,lng:Math.round(t.lo/60*1e5)/1e5,length:t.l,width:t.w,draught:t.draught,sog:t.sp,cog:t.co,hdg:t.h,rot:isNaN(t.rot)?0:t.rot,eta:/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(t.eta)?p(`${t.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00").unix():void 0,destination:t.destination,positionTime:c.unix(),utc:c.utc().format(),status:r,labelCn:i,labelEn:d,method:"position",vendor:"hifleet"}}async search(e,a={}){let n="https://www.hifleet.com/hifleetapi/searchVesselOL.do";const o={searchParams:{keyword:e},headers:{Referer:"https://www.hifleet.com",Origin:"https://www.hifleet.com",Host:"www.hifleet.com"}};let s=await y.post(n,o).json();M.info("[%s] fetch vessel props from: %s - %j",a.requestId,n,o),s instanceof Array&&(s=s[0]);for(const r in s)!isNaN(s[r])&&Number(s[r])!==1/0&&(s[r]=Number(s[r]));const t={mmsi:s.m,name:s.n,imo:s.i,callSign:s.c,length:s.l,breadth:s.b,draught:s.dr};return n="https://www.hifleet.com/hifleetapi/sameShipSearch.do",s=await y.post(n,o).json(),M.info("[%s] fetch vessel dead weight from: %s - %j",a.requestId,n,o),s instanceof Array&&(s=s[0]),s&&(t.deadweight=Number(s.dwt)),t}async trajectory(e,a,n,o,s=!0,t={}){var g,w,N;const r=await this.realTimePosition(e,t);let i=p(a);const d=p(n),c=p();if(s){let m=d.diff(i,"d",!0);m<0?i=d.clone().subtract(40,"d"):m<30?i.subtract(10,"d"):m<60?i.subtract(5,"d"):i=d.clone().subtract(80,"d"),m=c.diff(d,"d",!0),d.add(m>10?240:m*24,"h")}const l={searchParams:{endtime:d.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),starttime:i.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),mmsi:e,usertoken:this.token}},h="https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token",u=await y.get(h,l).json();M.info("[%s] fetch trajectory from: %s - %j",t.requestId,h,l);let v;u&&(v=((w=(g=u.ships)==null?void 0:g.offors)==null?void 0:w.ship)||[],v.length||M.warn("[%s] fetch trajectory failed: %j",t.requestId,u));const Y=[];let j=-1;const S=p(`${(N=v==null?void 0:v[0])==null?void 0:N.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");for(const m of v){for(const _ in m)!isNaN(m[_])&&Number(m[_])!==1/0&&(m[_]=Number(m[_]));const E=p(`${m.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");m.status=m.sp>4?0:1;const{labelEn:P,labelCn:R}=this.parseStatus(m.status),x={mmsi:m.m,name:m.n,imo:r==null?void 0:r.imo,lat:m.la,lng:m.lo,draught:m.draught,sog:m.sp,cog:m.co,hdg:m.hdg,positionTime:E.unix(),utc:E.utc().format(),status:m.status,labelCn:R,labelEn:P,method:"trajectory",vendor:"hifleet"},T=Math.floor(E.diff(S,"minute",!0)/(o||1));T!==j&&(j=T,Y.push(x))}return Y}}class B extends O{constructor(e){super();A(this,"token");this.token=e}async realTimePosition(e,a={}){const n={searchParams:{id:e,k:this.token,enc:1}},o="https://api.shipxy.com/apicall/GetSingleShip",s=await y.get(o,n).json();if(M.info("[%s] fetch realtime position from: %s - %j",a.requestId,o,n),(s==null?void 0:s.status)!==0)return s;const t=s.data[0];for(const l in t)!isNaN(t[l])&&Number(t[l])!==1/0&&(t[l]=Number(t[l]));const{labelCn:r,labelEn:i}=await this.parseStatus(t.navistat),d=p.unix(t.lasttime);return{mmsi:t.ShipID,name:t.name,imo:t.imo,callSign:t.callsign,lat:Math.round(t.lat/1e6*1e5)/1e5,lng:Math.round(t.lon/1e6*1e5)/1e5,length:Math.round(t.length/10*100)/100,width:Math.round(t.width/10*100)/100,draught:Math.round(t.draught/1e3*100)/100,sog:Math.round(t.sog*3600/1e3/1852*100)/100,cog:Math.round(t.cog/100*100)/100,hdg:Math.round(t.hdg/100*100)/100,rot:Math.round(t.rot/100*100)/100,positionTime:t.lasttime,utc:d.utc().format(),status:t.navistat,labelEn:i,labelCn:r,method:"position",vendor:"shipxy"}}async trajectory(e,a,n,o,s=!0,t={}){var S;const r=await this.realTimePosition(e,t),i=p(a),d=p(n),c="https://api.shipxy.com/apicall/GetShipTrack",l={searchParams:{id:e,k:this.token,enc:1,cut:0,btm:i.unix(),etm:d.unix()}},h=await y.get(c,l).json();if(M.info("[%s] fetch trajectory from: %s - %j",t.requestId,c,l),(h==null?void 0:h.status)!==0)return h;const u=h==null?void 0:h.points,v=[],Y=p.unix((S=u[0])==null?void 0:S.utc);let j=-1;for(const g of u){const w=p.unix(g.utc),N={imo:r==null?void 0:r.imo,mmsi:e,sog:Math.round(g.sog*3600/1e3/1852*100)/100,cog:Math.round(g.cog/100*100)/100,lat:Math.round(g.lat/1e6*1e5)/1e5,lng:Math.round(g.lon/1e6*1e5)/1e5,positionTime:w.unix(),utc:w.utc().format(),method:"trajectory",vendor:"shipxy"},m=Math.floor(w.diff(Y,"minute",!0)/(o||1));m!==j&&(j=m,v.push(N))}return v}}class U extends O{constructor(e){super();A(this,"token");this.token=e}async getShipId(e,a={}){const n={headers:{appKey:this.token},json:{mmsiList:e}},o="https://api3.myships.com/sp/ships/getShipIdByMMSI",s=await y.post(o,n).json();return M.info("[%s] fetch ship id from: %s - %j",a.requestId,o,n),s.code!=="0"?s:s.data[0].shipId}async getShipInfo(e,a={}){const n={headers:{appKey:this.token},json:{shipId:e}},o="https://api3.myships.com/sp/ships/aissta",s=await y.post(o,n).json();if(M.info("[%s] fetch ship info from: %s - %j",a.requestId,o,n),s.code!=="0")return s;const t=s.data;let r=t.imo;return e==="407170"&&(r="9198379",M.warn("[%s] ship(%s) imo error: %s, should be %s",a.requestId,e,t.imo,r)),{mmsi:t.mmsi,name:t.shipnameEn,imo:r,callSign:t.callSign,length:t.length,width:t.breadth,draught:(t.draught||100)/10}}async realTimePosition(e,a={}){const n=await this.getShipId(e,a),o=await this.getShipInfo(n,a),s={headers:{appKey:this.token},json:{shipId:n}},t="https://api3.myships.com/sp/ships/position/latest",r=await y.post(t,s).json();M.info("[%s] fetch realtime position from: %s - %j",a.requestId,t,s);const i=r.data[0];for(const u in i)!isNaN(i[u])&&Number(i[u])!==1/0&&(i[u]=Number(i[u]));const{labelCn:d,labelEn:c}=await this.parseStatus(i.aisNavStatus),l=p.unix(i.posTime);return{...o,mmsi:e,lat:Math.round(i.lat/1e4/60*1e5)/1e5,lng:Math.round(i.lon/1e4/60*1e5)/1e5,sog:Math.round(i.sog/10*100)/100,cog:Math.round(i.cog/10*100)/100,hdg:Math.round(i.heading*100)/100,rot:Math.round(i.rot*100)/100,positionTime:i.posTime,utc:l.utc().format(),status:i.aisNavStatus,labelEn:c,labelCn:d,method:"position",vendor:"myship"}}async trajectory(e,a,n,o,s=!0,t={}){const r=p(a),i=p(n),d=await this.getShipId(e),c=await this.getShipInfo(d),l=[];for(;i.diff(r,"day",!0)>30;)await this.trajectoryIn30Day(d,r.unix(),r.add(30,"day").unix(),c,e,o,l);return await this.trajectoryIn30Day(d,r.unix(),i.unix(),c,e,o,l),l}async trajectoryIn30Day(e,a,n,o,s,t,r,i={}){var Y;const d={headers:{appKey:this.token},json:{shipId:e,startTime:a,endTime:n}},c="https://api3.myships.com/sp/ships/position/history",l=await y.post(c,d).json();if(M.info("[%s] fetch trajectory from: %s - %j",i.requestId,c,d),l.code!=="0")return M.warn("[%s] invoke myship trajectory failed: %j",i.requestId,l),l;const h=l.data;for(const j in h)!isNaN(h[j])&&Number(h[j])!==1/0&&(h[j]=Number(h[j]));const u=p.unix((Y=h[0])==null?void 0:Y.posTime);let v=-1;for(const j of h){const S=p.unix(j.posTime),g={imo:o==null?void 0:o.imo,mmsi:s,lat:Math.round(j.lat/1e4/60*1e5)/1e5,lng:Math.round(j.lon/1e4/60*1e5)/1e5,sog:Math.round(j.sog/10*100)/100,cog:Math.round(j.cog/10*100)/100,hdg:Math.round(j.heading*100)/100,rot:Math.round(j.rot*100)/100,positionTime:S.unix(),utc:S.utc().format(),method:"trajectory",vendor:"myship"},w=Math.floor(S.diff(u,"minute",!0)/(t||1));w!==v&&(v=w,r.push(g))}return r}}const V=C.getLogger();V.level="info";var K=(I=>(I.NOTICE="NOTICE",I.WARN="WARN",I.HEAVY="HEAVY",I.SEVERE="SEVERE",I.ERROR="ERROR",I.FATAL="FATAL",I))(K||{});class L{parsePrinciple(f,e={}){var t,r,i;V.info("[%s] parse rule: %s",e.requestId,f);const a=new RegExp("(?<=\\[)(.+)(?=\\])","g"),n=f.match(a)?(t=f.match(a))==null?void 0:t[0]:void 0,o=n==null?void 0:n.split(";");if(!o)return;const s={};for(let d=0;d<(o==null?void 0:o.length);d++){const c=(i=(r=o[d].match(a))==null?void 0:r[0])==null?void 0:i.split("],");if(d===0&&!c)s.scope=o[0];else if(c)for(let l=0,h=c.length;l<h;l++){const u=this.parseRule(c[l]);u&&(s[u.level]?u.key?s[u.level][u==null?void 0:u.key]=u:s[u.level]=u:u.key?s[u.level]={[u==null?void 0:u.key]:u}:s[u.level]=u)}}return s}parseRule(f,e={}){var s;V.info("[%s] parse rule: %s",e.requestId,f),f=f.startsWith("[")?f:`[${f}`,f=f.endsWith("]")?f:`${f}]`;const a=new RegExp("(?<=\\[)(.+?)(?=\\])","g"),n=(s=f==null?void 0:f.match(a))==null?void 0:s[0],o=n==null?void 0:n.split(",");if(o)return{operator:o[0],number:Number(o[1]),level:o[2],time:Number(o[3]),key:o[4]}}checkWeather(f,e,a={}){var u,v,Y,j,S,g,w,N,m,E,P,R,x,T,_;let n=0,o=0,s=0,t=0;const r=((v=(u=e==null?void 0:e.SEVERE)==null?void 0:u.sigWave)==null?void 0:v.number)*1.6,i=(j=(Y=e==null?void 0:e.SEVERE)==null?void 0:Y.sigWave)==null?void 0:j.number,d=(g=(S=e==null?void 0:e.HEAVY)==null?void 0:S.sigWave)==null?void 0:g.number,c=((N=(w=e==null?void 0:e.SEVERE)==null?void 0:w.wind)==null?void 0:N.number)+2,l=(E=(m=e==null?void 0:e.SEVERE)==null?void 0:m.wind)==null?void 0:E.number,h=(R=(P=e==null?void 0:e.HEAVY)==null?void 0:P.wind)==null?void 0:R.number;for(let $=1;$<(f==null?void 0:f.length);$++){const k=f[$],H=(T=(x=k==null?void 0:k.meteo)==null?void 0:x.wave)==null?void 0:T.sig,D=(_=k==null?void 0:k.meteo)==null?void 0:_.wind,W=p(k.eta).diff(p(f[$-1].eta),"hour",!0);t=W>t?W:t,V.info("[%s] check sig.wave: %j",a.requestId,{...H,dgThd4Wv:r,svThd4Wv:i,hvThd4Wv:d}),(H==null?void 0:H.height)>=r?k.isDangerous=!0:(H==null?void 0:H.height)>=i?k.isSevere=!0:(H==null?void 0:H.height)>=d&&(k.isHeavy=!0),V.info("[%s] check wind: %j",a.requestId,{...D,dgThd4Wd:c,svThd4Wd:l,hvThd4Wd:h}),(D==null?void 0:D.scale)>=c?(k.isDangerous=!0,delete k.isSevere,delete k.isHeavy):(D==null?void 0:D.scale)>l?(k.isDangerous||(k.isSevere=!0),delete k.isHeavy):(D==null?void 0:D.scale)===h&&!k.isDangerous&&!k.isSevere&&(k.isHeavy=!0),n+=k.isDangerous?W:0,o+=k.isSevere?W:0,s+=k.isHeavy?W:0,$===1&&(f[0].isDangerous=k.isDangerous,f[0].isSevere=k.isSevere,f[0].isHeavy=k.isHeavy)}return n=Math.round(n*100)/100,o=Math.round(o*100)/100,s=Math.round(s*100)/100,t=Math.round(t),{sample:f,dangerous:n,severe:o,heavy:s,step:t<3?3:t,wind:{dgThd4Wd:c,svThd4Wd:l,hvThd4Wd:h},sig:{dgThd4Wv:r,svThd4Wv:i,hvThd4Wv:d}}}}const J=new L;b.AISImpl=O,b.AlertHelper=L,b.AlertLevel=K,b.HifleetImpl=G,b.MyShipImpl=U,b.MyVesselImpl=F,b.ShipxyImpl=B,b.alertHelper=J,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})});
|