@idm-plugin/vessel 1.3.6 → 1.3.7
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/index.js +189 -183
- package/dist/index.umd.cjs +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var Z = (
|
|
1
|
+
var et = Object.defineProperty;
|
|
2
|
+
var st = (I, s, t) => s in I ? et(I, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : I[s] = t;
|
|
3
|
+
var Z = (I, s, t) => (st(I, typeof s != "symbol" ? s + "" : s, t), t);
|
|
4
4
|
import R from "got";
|
|
5
5
|
import z from "@log4js-node/log4js-api";
|
|
6
|
-
import
|
|
6
|
+
import b from "moment";
|
|
7
7
|
import { LngLatHelper as B, LaneHelper as V } from "@idm-plugin/geo";
|
|
8
|
-
import { MeteoHelper as
|
|
9
|
-
let
|
|
8
|
+
import { MeteoHelper as at } from "@idm-plugin/meteo";
|
|
9
|
+
let u;
|
|
10
10
|
try {
|
|
11
|
-
|
|
11
|
+
u = z.getLogger("vessel");
|
|
12
12
|
} catch {
|
|
13
13
|
} finally {
|
|
14
14
|
}
|
|
@@ -53,7 +53,7 @@ class K {
|
|
|
53
53
|
return { labelCn: t, labelEn: i };
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
-
class
|
|
56
|
+
class pt extends K {
|
|
57
57
|
constructor(t, i) {
|
|
58
58
|
super();
|
|
59
59
|
Z(this, "clientId");
|
|
@@ -69,32 +69,32 @@ class mt extends K {
|
|
|
69
69
|
grant_type: "client_credentials"
|
|
70
70
|
}
|
|
71
71
|
}, n = await R.post(i, o).json();
|
|
72
|
-
|
|
72
|
+
u == null || u.info("[%s] fetch access token from: %s - %j", t.requestId, i, n), n.error || (this.token = {
|
|
73
73
|
accessToken: n.access_token,
|
|
74
74
|
tokenType: n.token_type,
|
|
75
75
|
expiresIn: n.expires_in,
|
|
76
76
|
scope: n.scope,
|
|
77
77
|
jti: n.jti,
|
|
78
|
-
issuedAt:
|
|
78
|
+
issuedAt: b().utc().format()
|
|
79
79
|
});
|
|
80
80
|
}
|
|
81
81
|
async realTimePosition(t, i = {}) {
|
|
82
|
-
var
|
|
83
|
-
(!this.token ||
|
|
82
|
+
var d, l, p;
|
|
83
|
+
(!this.token || b().diff(b(this.token.issuedAt), "seconds") > ((d = this.token) == null ? void 0 : d.expiresIn) - 300) && await this.authToken(i);
|
|
84
84
|
const o = "https://svc.data.myvessel.cn/sdc/v1/vessels/status/location/unit", n = {
|
|
85
85
|
headers: {
|
|
86
86
|
Authorization: `${(l = this.token) == null ? void 0 : l.tokenType} ${(p = this.token) == null ? void 0 : p.accessToken}`
|
|
87
87
|
},
|
|
88
88
|
searchParams: { mmsi: t }
|
|
89
89
|
};
|
|
90
|
-
|
|
90
|
+
u == null || u.info("[%s] fetch realtime position from: %s - %j", i.requestId, o, n);
|
|
91
91
|
const a = await R.get(o, n).json();
|
|
92
92
|
if (a.code)
|
|
93
|
-
return
|
|
93
|
+
return u == null || u.warn("[%s] fetch realtime position failed: %j", i.requestId, o, { message: a.message, status: a.status, code: a.code }), a;
|
|
94
94
|
const e = a.data;
|
|
95
95
|
for (const f in e)
|
|
96
96
|
!isNaN(e[f]) && Number(e[f]) !== 1 / 0 && (e[f] = Number(e[f]));
|
|
97
|
-
const c =
|
|
97
|
+
const c = b(`${e.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
98
98
|
return {
|
|
99
99
|
mmsi: e.mmsi,
|
|
100
100
|
name: e.vesselName,
|
|
@@ -121,15 +121,15 @@ class mt extends K {
|
|
|
121
121
|
};
|
|
122
122
|
}
|
|
123
123
|
async trajectory(t, i, o, n, a = !0, e = {}) {
|
|
124
|
-
(!this.token ||
|
|
125
|
-
const c = await this.realTimePosition(t, e), r =
|
|
126
|
-
for (;
|
|
124
|
+
(!this.token || b().diff(b(this.token.issuedAt), "seconds") > this.token.expiresIn - 300) && await this.authToken(e);
|
|
125
|
+
const c = await this.realTimePosition(t, e), r = b(i), d = b(o), l = [];
|
|
126
|
+
for (; d.diff(r, "day", !0) > 30; )
|
|
127
127
|
await this.trajectoryIn30Day(t, r, r.clone().add(30, "day"), c, n, l, e), r.add(30, "day");
|
|
128
|
-
return await this.trajectoryIn30Day(t, r,
|
|
128
|
+
return await this.trajectoryIn30Day(t, r, d, c, n, l, e), l;
|
|
129
129
|
}
|
|
130
130
|
async trajectoryIn30Day(t, i, o, n, a, e, c = {}) {
|
|
131
|
-
var m, v,
|
|
132
|
-
const r = "https://svc.data.myvessel.cn/sdc/v1/vessels/status/track",
|
|
131
|
+
var m, v, w, Y, M;
|
|
132
|
+
const r = "https://svc.data.myvessel.cn/sdc/v1/vessels/status/track", d = {
|
|
133
133
|
headers: {
|
|
134
134
|
Authorization: `${(m = this.token) == null ? void 0 : m.tokenType} ${(v = this.token) == null ? void 0 : v.accessToken}`
|
|
135
135
|
},
|
|
@@ -139,16 +139,16 @@ class mt extends K {
|
|
|
139
139
|
endTime: o.utcOffset(8).format("YYYY-MM-DD HH:mm:ss")
|
|
140
140
|
}
|
|
141
141
|
};
|
|
142
|
-
|
|
143
|
-
const l = await R.post(r,
|
|
142
|
+
u == null || u.info("[%s] fetch trajectory from: %s - %j", c.requestId, r, d);
|
|
143
|
+
const l = await R.post(r, d).json();
|
|
144
144
|
if (l.code)
|
|
145
|
-
return
|
|
145
|
+
return u == null || u.warn("[%s] fetch trajectory failed: %j", c.requestId, r, { message: l.message, status: l.status, code: l.code }), l;
|
|
146
146
|
let p = -1;
|
|
147
|
-
const f =
|
|
147
|
+
const f = b(`${(Y = (w = l.data) == null ? void 0 : w[0]) == null ? void 0 : Y.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
148
148
|
return (M = l.data) == null || M.forEach((h) => {
|
|
149
149
|
for (const T in h)
|
|
150
150
|
!isNaN(h[T]) && Number(h[T]) !== 1 / 0 && (h[T] = Number(h[T]));
|
|
151
|
-
const
|
|
151
|
+
const k = b(`${h.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00"), j = h.eta ? b(`${h.eta} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00") : void 0, y = h.status, { labelCn: g, labelEn: N } = this.parseStatus(y), F = {
|
|
152
152
|
mmsi: h.mmsi,
|
|
153
153
|
imo: n == null ? void 0 : n.imo,
|
|
154
154
|
lat: h.lat,
|
|
@@ -160,18 +160,18 @@ class mt extends K {
|
|
|
160
160
|
status: y,
|
|
161
161
|
eta: j == null ? void 0 : j.unix(),
|
|
162
162
|
destination: h.dest,
|
|
163
|
-
positionTime:
|
|
164
|
-
labelCn:
|
|
163
|
+
positionTime: k.unix(),
|
|
164
|
+
labelCn: g,
|
|
165
165
|
labelEn: N,
|
|
166
166
|
method: "trajectory",
|
|
167
167
|
vendor: "myVessel",
|
|
168
|
-
utc:
|
|
169
|
-
}, W = Math.floor(
|
|
170
|
-
W !== p && (p = W, e.push(
|
|
168
|
+
utc: k.utc().format()
|
|
169
|
+
}, W = Math.floor(k.diff(f, "minute", !0) / (a || 1));
|
|
170
|
+
W !== p && (p = W, e.push(F));
|
|
171
171
|
}), e;
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
|
-
class
|
|
174
|
+
class Mt extends K {
|
|
175
175
|
constructor(t) {
|
|
176
176
|
super();
|
|
177
177
|
Z(this, "token");
|
|
@@ -184,14 +184,14 @@ class pt extends K {
|
|
|
184
184
|
usertoken: this.token
|
|
185
185
|
}
|
|
186
186
|
}, a = await R.post(o, n).json();
|
|
187
|
-
|
|
187
|
+
u == null || u.info("[%s] fetch realtime position from: %s - %j", i.requestId, o, n);
|
|
188
188
|
const e = a == null ? void 0 : a.list;
|
|
189
189
|
if (!e)
|
|
190
|
-
return
|
|
190
|
+
return u == null || u.warn("[%s] fetch realtime position failed: %j", i.requestId, o, a), a;
|
|
191
191
|
for (const f in e)
|
|
192
192
|
!isNaN(e[f]) && Number(e[f]) !== 1 / 0 && (e[f] = Number(e[f]));
|
|
193
193
|
e.status = e.sp > 3 ? 0 : 1;
|
|
194
|
-
const c = e.status, { labelCn: r, labelEn:
|
|
194
|
+
const c = e.status, { labelCn: r, labelEn: d } = this.parseStatus(c), l = b(`${e.ti} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
195
195
|
return {
|
|
196
196
|
mmsi: e.m,
|
|
197
197
|
name: e.n,
|
|
@@ -206,13 +206,13 @@ class pt extends K {
|
|
|
206
206
|
cog: e.co,
|
|
207
207
|
hdg: e.h,
|
|
208
208
|
rot: isNaN(e.rot) ? 0 : e.rot,
|
|
209
|
-
eta: /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e.eta) ?
|
|
209
|
+
eta: /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e.eta) ? b(`${e.eta} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00").unix() : void 0,
|
|
210
210
|
destination: e.destination,
|
|
211
211
|
positionTime: l.unix(),
|
|
212
212
|
utc: l.utc().format(),
|
|
213
213
|
status: c,
|
|
214
214
|
labelCn: r,
|
|
215
|
-
labelEn:
|
|
215
|
+
labelEn: d,
|
|
216
216
|
method: "position",
|
|
217
217
|
vendor: "hifleet"
|
|
218
218
|
};
|
|
@@ -230,7 +230,7 @@ class pt extends K {
|
|
|
230
230
|
}
|
|
231
231
|
};
|
|
232
232
|
let a = await R.post(o, n).json();
|
|
233
|
-
|
|
233
|
+
u == null || u.info("[%s] fetch vessel props from: %s - %j", i.requestId, o, n), a instanceof Array && (a = a[0]);
|
|
234
234
|
for (const c in a)
|
|
235
235
|
!isNaN(a[c]) && Number(a[c]) !== 1 / 0 && (a[c] = Number(a[c]));
|
|
236
236
|
const e = {
|
|
@@ -242,37 +242,37 @@ class pt extends K {
|
|
|
242
242
|
breadth: a.b,
|
|
243
243
|
draught: a.dr
|
|
244
244
|
};
|
|
245
|
-
return o = "https://www.hifleet.com/hifleetapi/sameShipSearch.do", a = await R.post(o, n).json(),
|
|
245
|
+
return o = "https://www.hifleet.com/hifleetapi/sameShipSearch.do", a = await R.post(o, n).json(), u == null || u.info("[%s] fetch vessel dead weight from: %s - %j", i.requestId, o, n), a instanceof Array && (a = a[0]), a && (e.deadweight = Number(a.dwt)), e;
|
|
246
246
|
}
|
|
247
247
|
async trajectory(t, i, o, n, a = !0, e = {}) {
|
|
248
|
-
var h,
|
|
248
|
+
var h, k, j;
|
|
249
249
|
const c = await this.realTimePosition(t, e);
|
|
250
|
-
let r =
|
|
251
|
-
const
|
|
250
|
+
let r = b(i);
|
|
251
|
+
const d = b(o), l = b();
|
|
252
252
|
if (a) {
|
|
253
|
-
let y =
|
|
254
|
-
y < 0 ? r =
|
|
253
|
+
let y = d.diff(r, "d", !0);
|
|
254
|
+
y < 0 ? r = d.clone().subtract(40, "d") : y < 30 ? r.subtract(10, "d") : y < 60 ? r.subtract(5, "d") : r = d.clone().subtract(80, "d"), y = l.diff(d, "d", !0), d.add(y > 10 ? 240 : y * 24, "h");
|
|
255
255
|
}
|
|
256
256
|
const p = {
|
|
257
257
|
searchParams: {
|
|
258
|
-
endtime:
|
|
258
|
+
endtime: d.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),
|
|
259
259
|
starttime: r.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),
|
|
260
260
|
mmsi: t,
|
|
261
261
|
usertoken: this.token
|
|
262
262
|
}
|
|
263
263
|
}, f = "https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token", m = await R.get(f, p).json();
|
|
264
|
-
|
|
264
|
+
u == null || u.info("[%s] fetch trajectory from: %s - %j", e.requestId, f, p);
|
|
265
265
|
let v;
|
|
266
|
-
m && (v = ((
|
|
267
|
-
const
|
|
266
|
+
m && (v = ((k = (h = m.ships) == null ? void 0 : h.offors) == null ? void 0 : k.ship) || [], v.length || u == null || u.warn("[%s] fetch trajectory failed: %j", e.requestId, m));
|
|
267
|
+
const w = [];
|
|
268
268
|
let Y = -1;
|
|
269
|
-
const M =
|
|
269
|
+
const M = b(`${(j = v == null ? void 0 : v[0]) == null ? void 0 : j.ti} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
270
270
|
for (const y of v) {
|
|
271
271
|
for (const L in y)
|
|
272
272
|
!isNaN(y[L]) && Number(y[L]) !== 1 / 0 && (y[L] = Number(y[L]));
|
|
273
|
-
const
|
|
273
|
+
const g = b(`${y.ti} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
274
274
|
y.status = y.sp > 4 ? 0 : 1;
|
|
275
|
-
const { labelEn: N, labelCn:
|
|
275
|
+
const { labelEn: N, labelCn: F } = this.parseStatus(y.status), W = {
|
|
276
276
|
mmsi: y.m,
|
|
277
277
|
name: y.n,
|
|
278
278
|
imo: c == null ? void 0 : c.imo,
|
|
@@ -282,20 +282,20 @@ class pt extends K {
|
|
|
282
282
|
sog: y.sp,
|
|
283
283
|
cog: y.co,
|
|
284
284
|
hdg: y.hdg,
|
|
285
|
-
positionTime:
|
|
286
|
-
utc:
|
|
285
|
+
positionTime: g.unix(),
|
|
286
|
+
utc: g.utc().format(),
|
|
287
287
|
status: y.status,
|
|
288
|
-
labelCn:
|
|
288
|
+
labelCn: F,
|
|
289
289
|
labelEn: N,
|
|
290
290
|
method: "trajectory",
|
|
291
291
|
vendor: "hifleet"
|
|
292
|
-
}, T = Math.floor(
|
|
293
|
-
T !== Y && (Y = T,
|
|
292
|
+
}, T = Math.floor(g.diff(M, "minute", !0) / (n || 1));
|
|
293
|
+
T !== Y && (Y = T, w.push(W));
|
|
294
294
|
}
|
|
295
|
-
return
|
|
295
|
+
return w;
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
|
-
class
|
|
298
|
+
class yt extends K {
|
|
299
299
|
constructor(t) {
|
|
300
300
|
super();
|
|
301
301
|
Z(this, "token");
|
|
@@ -309,12 +309,12 @@ class Mt extends K {
|
|
|
309
309
|
enc: 1
|
|
310
310
|
}
|
|
311
311
|
}, n = "https://api.shipxy.com/apicall/GetSingleShip", a = await R.get(n, o).json();
|
|
312
|
-
if (
|
|
312
|
+
if (u == null || u.info("[%s] fetch realtime position from: %s - %j", i.requestId, n, o), (a == null ? void 0 : a.status) !== 0)
|
|
313
313
|
return a;
|
|
314
314
|
const e = a.data[0];
|
|
315
315
|
for (const p in e)
|
|
316
316
|
!isNaN(e[p]) && Number(e[p]) !== 1 / 0 && (e[p] = Number(e[p]));
|
|
317
|
-
const { labelCn: c, labelEn: r } = await this.parseStatus(e.navistat),
|
|
317
|
+
const { labelCn: c, labelEn: r } = await this.parseStatus(e.navistat), d = b.unix(e.lasttime);
|
|
318
318
|
return {
|
|
319
319
|
mmsi: e.ShipID,
|
|
320
320
|
name: e.name,
|
|
@@ -330,7 +330,7 @@ class Mt extends K {
|
|
|
330
330
|
hdg: Math.round(e.hdg / 100 * 100) / 100,
|
|
331
331
|
rot: Math.round(e.rot / 100 * 100) / 100,
|
|
332
332
|
positionTime: e.lasttime,
|
|
333
|
-
utc:
|
|
333
|
+
utc: d.utc().format(),
|
|
334
334
|
status: e.navistat,
|
|
335
335
|
labelEn: r,
|
|
336
336
|
labelCn: c,
|
|
@@ -340,39 +340,39 @@ class Mt extends K {
|
|
|
340
340
|
}
|
|
341
341
|
async trajectory(t, i, o, n, a = !0, e = {}) {
|
|
342
342
|
var M;
|
|
343
|
-
const c = await this.realTimePosition(t, e), r =
|
|
343
|
+
const c = await this.realTimePosition(t, e), r = b(i), d = b(o), l = "https://api.shipxy.com/apicall/GetShipTrack", p = {
|
|
344
344
|
searchParams: {
|
|
345
345
|
id: t,
|
|
346
346
|
k: this.token,
|
|
347
347
|
enc: 1,
|
|
348
348
|
cut: 0,
|
|
349
349
|
btm: r.unix(),
|
|
350
|
-
etm:
|
|
350
|
+
etm: d.unix()
|
|
351
351
|
}
|
|
352
352
|
}, f = await R.get(l, p).json();
|
|
353
|
-
if (
|
|
353
|
+
if (u == null || u.info("[%s] fetch trajectory from: %s - %j", e.requestId, l, p), (f == null ? void 0 : f.status) !== 0)
|
|
354
354
|
return f;
|
|
355
|
-
const m = f == null ? void 0 : f.points, v = [],
|
|
355
|
+
const m = f == null ? void 0 : f.points, v = [], w = b.unix((M = m[0]) == null ? void 0 : M.utc);
|
|
356
356
|
let Y = -1;
|
|
357
357
|
for (const h of m) {
|
|
358
|
-
const
|
|
358
|
+
const k = b.unix(h.utc), j = {
|
|
359
359
|
imo: c == null ? void 0 : c.imo,
|
|
360
360
|
mmsi: t,
|
|
361
361
|
sog: Math.round(h.sog * 3600 / 1e3 / 1852 * 100) / 100,
|
|
362
362
|
cog: Math.round(h.cog / 100 * 100) / 100,
|
|
363
363
|
lat: Math.round(h.lat / 1e6 * 1e5) / 1e5,
|
|
364
364
|
lng: Math.round(h.lon / 1e6 * 1e5) / 1e5,
|
|
365
|
-
positionTime:
|
|
366
|
-
utc:
|
|
365
|
+
positionTime: k.unix(),
|
|
366
|
+
utc: k.utc().format(),
|
|
367
367
|
method: "trajectory",
|
|
368
368
|
vendor: "shipxy"
|
|
369
|
-
}, y = Math.floor(
|
|
369
|
+
}, y = Math.floor(k.diff(w, "minute", !0) / (n || 1));
|
|
370
370
|
y !== Y && (Y = y, v.push(j));
|
|
371
371
|
}
|
|
372
372
|
return v;
|
|
373
373
|
}
|
|
374
374
|
}
|
|
375
|
-
class
|
|
375
|
+
class gt extends K {
|
|
376
376
|
constructor(t) {
|
|
377
377
|
super();
|
|
378
378
|
Z(this, "token");
|
|
@@ -387,7 +387,7 @@ class yt extends K {
|
|
|
387
387
|
mmsiList: t
|
|
388
388
|
}
|
|
389
389
|
}, n = "https://api3.myships.com/sp/ships/getShipIdByMMSI", a = await R.post(n, o).json();
|
|
390
|
-
return
|
|
390
|
+
return u == null || u.info("[%s] fetch ship id from: %s - %j", i.requestId, n, o), a.code !== "0" ? a : a.data[0].shipId;
|
|
391
391
|
}
|
|
392
392
|
async getShipInfo(t, i = {}) {
|
|
393
393
|
const o = {
|
|
@@ -398,11 +398,11 @@ class yt extends K {
|
|
|
398
398
|
shipId: t
|
|
399
399
|
}
|
|
400
400
|
}, n = "https://api3.myships.com/sp/ships/aissta", a = await R.post(n, o).json();
|
|
401
|
-
if (
|
|
401
|
+
if (u == null || u.info("[%s] fetch ship info from: %s - %j", i.requestId, n, o), a.code !== "0")
|
|
402
402
|
return a;
|
|
403
403
|
const e = a.data;
|
|
404
404
|
let c = e.imo;
|
|
405
|
-
return t === "407170" && (c = "9198379",
|
|
405
|
+
return t === "407170" && (c = "9198379", u == null || u.warn("[%s] ship(%s) imo error: %s, should be %s", i.requestId, t, e.imo, c)), {
|
|
406
406
|
mmsi: e.mmsi,
|
|
407
407
|
name: e.shipnameEn,
|
|
408
408
|
imo: c,
|
|
@@ -421,11 +421,11 @@ class yt extends K {
|
|
|
421
421
|
shipId: o
|
|
422
422
|
}
|
|
423
423
|
}, e = "https://api3.myships.com/sp/ships/position/latest", c = await R.post(e, a).json();
|
|
424
|
-
|
|
424
|
+
u == null || u.info("[%s] fetch realtime position from: %s - %j", i.requestId, e, a);
|
|
425
425
|
const r = c.data[0];
|
|
426
426
|
for (const m in r)
|
|
427
427
|
!isNaN(r[m]) && Number(r[m]) !== 1 / 0 && (r[m] = Number(r[m]));
|
|
428
|
-
const { labelCn:
|
|
428
|
+
const { labelCn: d, labelEn: l } = await this.parseStatus(r.aisNavStatus), p = b.unix(r.posTime);
|
|
429
429
|
return {
|
|
430
430
|
...n,
|
|
431
431
|
mmsi: t,
|
|
@@ -439,20 +439,20 @@ class yt extends K {
|
|
|
439
439
|
utc: p.utc().format(),
|
|
440
440
|
status: r.aisNavStatus,
|
|
441
441
|
labelEn: l,
|
|
442
|
-
labelCn:
|
|
442
|
+
labelCn: d,
|
|
443
443
|
method: "position",
|
|
444
444
|
vendor: "myship"
|
|
445
445
|
};
|
|
446
446
|
}
|
|
447
447
|
async trajectory(t, i, o, n, a = !0, e = {}) {
|
|
448
|
-
const c =
|
|
448
|
+
const c = b(i), r = b(o), d = await this.getShipId(t), l = await this.getShipInfo(d), p = [];
|
|
449
449
|
for (; r.diff(c, "day", !0) > 30; )
|
|
450
|
-
await this.trajectoryIn30Day(
|
|
451
|
-
return await this.trajectoryIn30Day(
|
|
450
|
+
await this.trajectoryIn30Day(d, c.unix(), c.add(30, "day").unix(), l, t, n, p);
|
|
451
|
+
return await this.trajectoryIn30Day(d, c.unix(), r.unix(), l, t, n, p), p;
|
|
452
452
|
}
|
|
453
453
|
async trajectoryIn30Day(t, i, o, n, a, e, c, r = {}) {
|
|
454
|
-
var
|
|
455
|
-
const
|
|
454
|
+
var w;
|
|
455
|
+
const d = {
|
|
456
456
|
headers: {
|
|
457
457
|
appKey: this.token
|
|
458
458
|
},
|
|
@@ -461,16 +461,16 @@ class yt extends K {
|
|
|
461
461
|
startTime: i,
|
|
462
462
|
endTime: o
|
|
463
463
|
}
|
|
464
|
-
}, l = "https://api3.myships.com/sp/ships/position/history", p = await R.post(l,
|
|
465
|
-
if (
|
|
466
|
-
return
|
|
464
|
+
}, l = "https://api3.myships.com/sp/ships/position/history", p = await R.post(l, d).json();
|
|
465
|
+
if (u == null || u.info("[%s] fetch trajectory from: %s - %j", r.requestId, l, d), p.code !== "0")
|
|
466
|
+
return u == null || u.warn("[%s] invoke myship trajectory failed: %j", r.requestId, p), p;
|
|
467
467
|
const f = p.data;
|
|
468
468
|
for (const Y in f)
|
|
469
469
|
!isNaN(f[Y]) && Number(f[Y]) !== 1 / 0 && (f[Y] = Number(f[Y]));
|
|
470
|
-
const m =
|
|
470
|
+
const m = b.unix((w = f[0]) == null ? void 0 : w.posTime);
|
|
471
471
|
let v = -1;
|
|
472
472
|
for (const Y of f) {
|
|
473
|
-
const M =
|
|
473
|
+
const M = b.unix(Y.posTime), h = {
|
|
474
474
|
imo: n == null ? void 0 : n.imo,
|
|
475
475
|
mmsi: a,
|
|
476
476
|
lat: Math.round(Y.lat / 1e4 / 60 * 1e5) / 1e5,
|
|
@@ -483,8 +483,8 @@ class yt extends K {
|
|
|
483
483
|
utc: M.utc().format(),
|
|
484
484
|
method: "trajectory",
|
|
485
485
|
vendor: "myship"
|
|
486
|
-
},
|
|
487
|
-
|
|
486
|
+
}, k = Math.floor(M.diff(m, "minute", !0) / (e || 1));
|
|
487
|
+
k !== v && (v = k, c.push(h));
|
|
488
488
|
}
|
|
489
489
|
return c;
|
|
490
490
|
}
|
|
@@ -495,8 +495,8 @@ try {
|
|
|
495
495
|
} catch {
|
|
496
496
|
} finally {
|
|
497
497
|
}
|
|
498
|
-
var
|
|
499
|
-
class
|
|
498
|
+
var ot = /* @__PURE__ */ ((I) => (I.NOTICE = "NOTICE", I.WARN = "WARN", I.HEAVY = "HEAVY", I.SEVERE = "SEVERE", I.ERROR = "ERROR", I.FATAL = "FATAL", I))(ot || {});
|
|
499
|
+
class nt {
|
|
500
500
|
/**
|
|
501
501
|
* 解析告警规则, 多规则场景
|
|
502
502
|
* @param rule
|
|
@@ -512,9 +512,9 @@ class ot {
|
|
|
512
512
|
if (!n)
|
|
513
513
|
return;
|
|
514
514
|
const a = {};
|
|
515
|
-
for (let
|
|
516
|
-
const l = (r = (c = n[
|
|
517
|
-
if (
|
|
515
|
+
for (let d = 0; d < (n == null ? void 0 : n.length); d++) {
|
|
516
|
+
const l = (r = (c = n[d].match(i)) == null ? void 0 : c[0]) == null ? void 0 : r.split("],");
|
|
517
|
+
if (d === 0 && !l)
|
|
518
518
|
a.scope = n[0];
|
|
519
519
|
else if (l)
|
|
520
520
|
for (let p = 0, f = l.length; p < f; p++) {
|
|
@@ -550,24 +550,24 @@ class ot {
|
|
|
550
550
|
* @param options
|
|
551
551
|
*/
|
|
552
552
|
checkWeather(s, t, i = {}) {
|
|
553
|
-
var m, v,
|
|
553
|
+
var m, v, w, Y, M, h, k, j, y, g, N, F, W, T, L;
|
|
554
554
|
let o = 0, n = 0, a = 0, e = 0;
|
|
555
|
-
const c = Math.round(((v = (m = t == null ? void 0 : t.SEVERE) == null ? void 0 : m.sigWave) == null ? void 0 : v.number) * 1.6 * 100) / 100, r = (Y = (
|
|
555
|
+
const c = Math.round(((v = (m = t == null ? void 0 : t.SEVERE) == null ? void 0 : m.sigWave) == null ? void 0 : v.number) * 1.6 * 100) / 100, r = (Y = (w = t == null ? void 0 : t.SEVERE) == null ? void 0 : w.sigWave) == null ? void 0 : Y.number, d = (h = (M = t == null ? void 0 : t.HEAVY) == null ? void 0 : M.sigWave) == null ? void 0 : h.number, l = Math.round((((j = (k = t == null ? void 0 : t.SEVERE) == null ? void 0 : k.wind) == null ? void 0 : j.number) + 2) * 100) / 100, p = (g = (y = t == null ? void 0 : t.SEVERE) == null ? void 0 : y.wind) == null ? void 0 : g.number, f = (F = (N = t == null ? void 0 : t.HEAVY) == null ? void 0 : N.wind) == null ? void 0 : F.number;
|
|
556
556
|
for (let A = 0; A < (s == null ? void 0 : s.length); A++) {
|
|
557
|
-
const
|
|
558
|
-
e =
|
|
557
|
+
const S = s[A], P = (T = (W = S == null ? void 0 : S.meteo) == null ? void 0 : W.wave) == null ? void 0 : T.sig, D = (L = S == null ? void 0 : S.meteo) == null ? void 0 : L.wind, E = A ? b(S.eta).diff(b(s[A - 1].eta), "hour", !0) : 0;
|
|
558
|
+
e = E > e ? E : e, O == null || O.info("[%s] check sig.wave: %j", i.requestId, { ...P, dgThd4Wv: c, svThd4Wv: r, hvThd4Wv: d }), (P == null ? void 0 : P.height) >= c ? S.isDangerous = !0 : (P == null ? void 0 : P.height) >= r ? S.isSevere = !0 : (P == null ? void 0 : P.height) >= d && (S.isHeavy = !0), O == null || O.info("[%s] check wind: %j", i.requestId, { ...D, dgThd4Wd: l, svThd4Wd: p, hvThd4Wd: f }), (D == null ? void 0 : D.scale) >= l ? (S.isDangerous = !0, delete S.isSevere, delete S.isHeavy) : (D == null ? void 0 : D.scale) > p ? (S.isDangerous || (S.isSevere = !0), delete S.isHeavy) : (D == null ? void 0 : D.scale) === f && !S.isDangerous && !S.isSevere && (S.isHeavy = !0), o += S.isDangerous ? E : 0, n += S.isSevere ? E : 0, a += S.isHeavy ? E : 0;
|
|
559
559
|
}
|
|
560
|
-
return o = Math.round(o * 100) / 100, n = Math.round(n * 100) / 100, a = Math.round(a * 100) / 100, e = Math.round(e), { sample: s, dangerous: o, severe: n, heavy: a, step: e < 3 ? 3 : e, wind: { dgThd4Wd: l, svThd4Wd: p, hvThd4Wd: f }, sig: { dgThd4Wv: c, svThd4Wv: r, hvThd4Wv:
|
|
560
|
+
return o = Math.round(o * 100) / 100, n = Math.round(n * 100) / 100, a = Math.round(a * 100) / 100, e = Math.round(e), { sample: s, dangerous: o, severe: n, heavy: a, step: e < 3 ? 3 : e, wind: { dgThd4Wd: l, svThd4Wd: p, hvThd4Wd: f }, sig: { dgThd4Wv: c, svThd4Wv: r, hvThd4Wv: d } };
|
|
561
561
|
}
|
|
562
562
|
}
|
|
563
|
-
const bt = new
|
|
564
|
-
let
|
|
563
|
+
const bt = new nt();
|
|
564
|
+
let x;
|
|
565
565
|
try {
|
|
566
|
-
|
|
566
|
+
x = z.getLogger("vessel");
|
|
567
567
|
} catch {
|
|
568
568
|
} finally {
|
|
569
569
|
}
|
|
570
|
-
var
|
|
570
|
+
var it = /* @__PURE__ */ ((I) => (I.common = "common", I.container = "container", I.tugs = "tugs", I))(it || {}), rt = /* @__PURE__ */ ((I) => (I.Ballast = "Ballast", I.Laden = "Laden", I))(rt || {}), ct = /* @__PURE__ */ ((I) => (I.Cp = "CP", I.Perf = "Basis", I.Instruct = "Other", I))(ct || {});
|
|
571
571
|
class C {
|
|
572
572
|
/**
|
|
573
573
|
* @see https://baike.baidu.com/item/%E6%96%B9%E5%BD%A2%E7%B3%BB%E6%95%B0/4965568?fr=aladdin
|
|
@@ -707,9 +707,9 @@ class C {
|
|
|
707
707
|
static async speedLoseAt(s, t, i, o = "", n = 2, a = !0, e = !1, c = {}) {
|
|
708
708
|
let r;
|
|
709
709
|
if (t.velocity && e && (s.speed = B.roundPrecision(t.velocity * 1852 / 3600, 6)), a) {
|
|
710
|
-
const
|
|
710
|
+
const d = await at.queryPointFactor(t.lng, t.lat, i.valueOf(), "wind,wave,current,watertemp", o, c), l = C.weatherFactor(s, d), p = C.currentFactor(s.bearing, d == null ? void 0 : d.current, n), f = Math.round((s.speed * 1.943844 + l + p) * 100) / 100;
|
|
711
711
|
r = {
|
|
712
|
-
meteo: { ...
|
|
712
|
+
meteo: { ...d },
|
|
713
713
|
wxFactor: l,
|
|
714
714
|
cFactor: p,
|
|
715
715
|
speed: t.velocity && e ? t.velocity : f < 0 ? 1 : f,
|
|
@@ -739,10 +739,10 @@ class C {
|
|
|
739
739
|
* @param useRouteParam true 启用航线上设置的参数 { suspend: 停留时长(小时), velocity: 速度(kts)}
|
|
740
740
|
* @private
|
|
741
741
|
*/
|
|
742
|
-
static async speedLoseInHoursStep(s, t, i, o, n, a, e = "", c = !0, r = !1,
|
|
742
|
+
static async speedLoseInHoursStep(s, t, i, o, n, a, e = "", c = !0, r = !1, d = {}) {
|
|
743
743
|
t.utc();
|
|
744
744
|
const l = [], p = [];
|
|
745
|
-
let f = 0, m = 0, v,
|
|
745
|
+
let f = 0, m = 0, v, w;
|
|
746
746
|
for (let Y = 0; Y < a.length - 1; Y++) {
|
|
747
747
|
let M = a[Y];
|
|
748
748
|
M.distanceFromStart = n + m;
|
|
@@ -753,38 +753,38 @@ class C {
|
|
|
753
753
|
if (o - f > y)
|
|
754
754
|
o = o - f - y, t.add(y, "hour"), M.elapsed = M.suspend;
|
|
755
755
|
else {
|
|
756
|
-
const
|
|
757
|
-
M.elapsed +=
|
|
756
|
+
const g = o - f;
|
|
757
|
+
M.elapsed += g, t.add(g, "hour"), o = 0;
|
|
758
758
|
}
|
|
759
|
-
if (
|
|
760
|
-
return M.distanceFromPrevious = m, { etd: t, from:
|
|
759
|
+
if (x == null || x.info(`[%s] suspend ${M.elapsed} hours at %j, and remain ${o} hours need to go...`, d.requestId, M), o === 0)
|
|
760
|
+
return M.distanceFromPrevious = m, { etd: t, from: w || M, to: M, next: a.filter((g) => g), wps: l, days: p };
|
|
761
761
|
}
|
|
762
|
-
M = await C.speedLoseAt(s, M, t, e, 0, c, r,
|
|
763
|
-
const
|
|
764
|
-
let j = Math.ceil(
|
|
762
|
+
M = await C.speedLoseAt(s, M, t, e, 0, c, r, d), w = w || M, M.important && l.push(M), t.isSameOrAfter(i) && (p.push(M), i.add(24, "hour"));
|
|
763
|
+
const k = V.calculateDistance(M, h, !h.gcToPrevious);
|
|
764
|
+
let j = Math.ceil(k / w.speed * 1e4) / 1e4;
|
|
765
765
|
if (f + j < o) {
|
|
766
|
-
if (f += j, t.add(j, "hour"), delete a[Y],
|
|
767
|
-
`[%s] go to %j from %j with ${
|
|
768
|
-
|
|
766
|
+
if (f += j, t.add(j, "hour"), delete a[Y], x == null || x.info(
|
|
767
|
+
`[%s] go to %j from %j with ${k}nm, and cost ${j} hours`,
|
|
768
|
+
d.requestId,
|
|
769
769
|
{ lat: h.lat, lng: h.lng },
|
|
770
|
-
{ lat:
|
|
771
|
-
), m +=
|
|
772
|
-
v = h, v.eta = t.format("YYYY-MM-DDTHH:mm[Z]"), v.distanceFromPrevious =
|
|
770
|
+
{ lat: w.lat, lng: w.lng, etd: w.etd }
|
|
771
|
+
), m += k, a.filter((y) => y).length <= 1) {
|
|
772
|
+
v = h, v.eta = t.format("YYYY-MM-DDTHH:mm[Z]"), v.distanceFromPrevious = k, v.distanceFromStart = n + m, l.push(v), delete a[Y + 1];
|
|
773
773
|
break;
|
|
774
774
|
}
|
|
775
775
|
} else {
|
|
776
776
|
j = o - f, t.add(j, "hour");
|
|
777
|
-
const y = B.roundPrecision(
|
|
778
|
-
v = V.calculateCoordinate(M, s.bearing, y, "nauticalmiles", !h.gcToPrevious), v.eta = t.format("YYYY-MM-DDTHH:mm[Z]"), a[Y] = v,
|
|
777
|
+
const y = B.roundPrecision(w.speed * j, 4);
|
|
778
|
+
v = V.calculateCoordinate(M, s.bearing, y, "nauticalmiles", !h.gcToPrevious), v.eta = t.format("YYYY-MM-DDTHH:mm[Z]"), a[Y] = v, x == null || x.info(
|
|
779
779
|
`[%s] go to %j from %j with ${y}nm, and cost ${j} hours`,
|
|
780
|
-
|
|
780
|
+
d.requestId,
|
|
781
781
|
{ lat: v.lat, lng: v.lng },
|
|
782
782
|
{ lat: M.lat, lng: M.lng, etd: M.etd }
|
|
783
783
|
), m += y, v.distanceFromPrevious = m, v.distanceFromStart = n + m;
|
|
784
784
|
break;
|
|
785
785
|
}
|
|
786
786
|
}
|
|
787
|
-
return { etd: t, from:
|
|
787
|
+
return { etd: t, from: w, to: v, next: a.filter((Y) => Y), wps: l, days: p };
|
|
788
788
|
}
|
|
789
789
|
/**
|
|
790
790
|
* 洋流影响因子
|
|
@@ -806,15 +806,15 @@ class C {
|
|
|
806
806
|
*/
|
|
807
807
|
static weatherFactor(s, t) {
|
|
808
808
|
var l, p, f, m, v;
|
|
809
|
-
|
|
809
|
+
x == null || x.debug("calculate weather factor via: %j", { ...s, ...t });
|
|
810
810
|
const i = C.blockCoefficient(s.displacement, s.lbp, s.breadthMoulded, s.draught), o = C.froudeNumber(s.speed, s.lbp), n = C.amendFactor(i, o, s.loadCondition);
|
|
811
811
|
let a = Math.abs(s.bearing % 360 - (((l = t == null ? void 0 : t.wind) == null ? void 0 : l.degree) % 360 || 0));
|
|
812
812
|
a = a > 180 ? 360 - a : a;
|
|
813
813
|
const e = C.directionFactor(a, (p = t == null ? void 0 : t.wind) == null ? void 0 : p.scale), c = C.vesselTagFactor(s.displacement, s.loadCondition, s.tag, (f = t == null ? void 0 : t.wind) == null ? void 0 : f.scale);
|
|
814
814
|
let r = e * n * c / 100 * s.speed;
|
|
815
815
|
r = Math.round(r * 1.943844 * 1e4) / 1e4 * -1, s.tag === "tugs" && Math.abs(r) > 1 && (r = r / (Math.abs(Math.round(r)) + 1));
|
|
816
|
-
const
|
|
817
|
-
return r = r +
|
|
816
|
+
const d = C.waveHeightFactor(((v = (m = t == null ? void 0 : t.wave) == null ? void 0 : m.sig) == null ? void 0 : v.height) ?? 1);
|
|
817
|
+
return r = r + d, x == null || x.debug("weather factor = %s", r), r = Math.abs(r) > 5 ? 5 * (Math.abs(r) / r) + Math.abs(r) / r * (Math.abs(r) - 5) * 0.4 : r, Math.round(r * 100) / 100;
|
|
818
818
|
}
|
|
819
819
|
/**
|
|
820
820
|
* 全程失速分析(走完航程)
|
|
@@ -828,14 +828,14 @@ class C {
|
|
|
828
828
|
* @param useMeteo true 启用气象分析
|
|
829
829
|
* @param useRouteParam
|
|
830
830
|
*/
|
|
831
|
-
static async analyseInstant(s, t, i, o, n, a = "", e = 0, c = !0, r = !1,
|
|
832
|
-
var
|
|
833
|
-
const l =
|
|
831
|
+
static async analyseInstant(s, t, i, o, n, a = "", e = 0, c = !0, r = !1, d = {}) {
|
|
832
|
+
var E, G, U, J, Q;
|
|
833
|
+
const l = b().valueOf();
|
|
834
834
|
s.lng = B.convertToStdLng(s.lng);
|
|
835
835
|
const { route: p, waypoints: f } = n.points, m = V.calculateSubRoute(s, p);
|
|
836
|
-
if (((
|
|
836
|
+
if (((E = m[0]) == null ? void 0 : E.length) <= 1)
|
|
837
837
|
return;
|
|
838
|
-
const { v0: v, label:
|
|
838
|
+
const { v0: v, label: w } = s.sog ? {
|
|
839
839
|
v0: s.sog,
|
|
840
840
|
label: "Other"
|
|
841
841
|
/* Instruct */
|
|
@@ -844,24 +844,24 @@ class C {
|
|
|
844
844
|
label: "CP"
|
|
845
845
|
/* Cp */
|
|
846
846
|
}, Y = C.assembleProperties(i, o.loadCondition, v, 0), M = f.length ? V.calculateSubWaypoints(s, f) : [];
|
|
847
|
-
M.forEach((
|
|
847
|
+
M.forEach((H) => H.important = !0);
|
|
848
848
|
const h = {
|
|
849
849
|
from: { ...s },
|
|
850
850
|
route: m,
|
|
851
851
|
waypoints: M,
|
|
852
852
|
v0: v,
|
|
853
|
-
label:
|
|
854
|
-
},
|
|
853
|
+
label: w
|
|
854
|
+
}, k = {
|
|
855
855
|
hours: [],
|
|
856
856
|
days: [],
|
|
857
857
|
wps: []
|
|
858
858
|
};
|
|
859
859
|
e || (V.calculateRouteDistance(m) / o.speed <= 72 ? e = 3 : e = 6);
|
|
860
|
-
let j = V.simplifyRouteToCoordinates(m, M, 0), y = 0,
|
|
861
|
-
t =
|
|
860
|
+
let j = V.simplifyRouteToCoordinates(m, M, 0), y = 0, g = 0, N = 0, F = 0;
|
|
861
|
+
t = b(t).utc();
|
|
862
862
|
const W = t.clone();
|
|
863
863
|
for (; j.length > 0; ) {
|
|
864
|
-
const
|
|
864
|
+
const H = e - t.hour() % e, _ = Math.ceil(t.clone().add(H, "h").set({ minute: 0, second: 0, millisecond: 0 }).diff(t, "h", !0) * 1e4) / 1e4, q = await C.speedLoseInHoursStep(
|
|
865
865
|
Y,
|
|
866
866
|
t,
|
|
867
867
|
W,
|
|
@@ -871,25 +871,31 @@ class C {
|
|
|
871
871
|
a,
|
|
872
872
|
c,
|
|
873
873
|
r,
|
|
874
|
-
|
|
874
|
+
d
|
|
875
875
|
);
|
|
876
|
-
(G =
|
|
876
|
+
(G = q.from) != null && G.speed && (k.hours.push(q.from), k.wps.push(...q.wps), k.days.push(...q.days)), j = q == null ? void 0 : q.next, j.length || k.hours.push(q == null ? void 0 : q.to), y += ((U = q == null ? void 0 : q.to) == null ? void 0 : U.distanceFromPrevious) ?? 0;
|
|
877
877
|
}
|
|
878
|
-
const T =
|
|
879
|
-
for (let
|
|
880
|
-
const _ =
|
|
881
|
-
|
|
878
|
+
const T = k.hours;
|
|
879
|
+
for (let H = 0; H < T.length - 1; H++) {
|
|
880
|
+
const _ = b(T[H + 1].eta).diff(T[H].etd, "hour", !0) || 1;
|
|
881
|
+
g += (T[H].wxFactor || 0) * _, N += (T[H].cFactor || 0) * _, F += _;
|
|
882
882
|
}
|
|
883
|
-
(J =
|
|
883
|
+
(J = k.wps) == null || J.forEach((H, _) => {
|
|
884
884
|
if (_) {
|
|
885
|
-
const
|
|
886
|
-
X < 1
|
|
885
|
+
const q = k.wps[_ - 1], tt = H.distanceFromStart - q.distanceFromStart, X = b(H.eta).diff(b(q.etd), "h", !0);
|
|
886
|
+
if (X < 1)
|
|
887
|
+
H.avgSpd = q.speed;
|
|
888
|
+
else {
|
|
889
|
+
H.avgSpd = Math.round(tt / X * 100) / 100;
|
|
890
|
+
const $ = Math.round((q.speed + H.speed) / 2 * 100) / 100;
|
|
891
|
+
H.avgSpd = H.avgSpd > $ ? $ : H.avgSpd;
|
|
892
|
+
}
|
|
887
893
|
}
|
|
888
|
-
}), h.sample =
|
|
889
|
-
const L =
|
|
890
|
-
h.distance = Math.round(A.distanceFromStart * 1e4) / 1e4, h.etd =
|
|
891
|
-
const
|
|
892
|
-
return
|
|
894
|
+
}), h.sample = k;
|
|
895
|
+
const L = k.hours.at(0), A = k.hours.at(-1);
|
|
896
|
+
h.distance = Math.round(A.distanceFromStart * 1e4) / 1e4, h.etd = b(L.eta).utc().format(), h.eta = b(A.eta).utc().format(), h.wxFactor = Math.round(g / F * 1e4) / 1e4, h.cFactor = Math.round(N / F * 1e4) / 1e4, h.avgSpeed = Math.round(A.distanceFromStart / F * 1e4) / 1e4, h.totalHrs = Math.round(F * 1e4) / 1e4, h.totalFoCons = Math.round((o == null ? void 0 : o.fo) / 24 * h.totalHrs * 1e3) / 1e3, h.totalDgoCons = Math.round((o == null ? void 0 : o.dgo) / 24 * h.totalHrs * 1e3) / 1e3;
|
|
897
|
+
const P = b().valueOf() - l, D = ((Q = k == null ? void 0 : k.hours) == null ? void 0 : Q.length) || 1;
|
|
898
|
+
return x == null || x.info("[%s] each hour-sample speed analyse cost: (%d / %d = %d) ms", d == null ? void 0 : d.requestId, P, D, Math.round(P / D * 1e3) / 1e3), h;
|
|
893
899
|
}
|
|
894
900
|
/**
|
|
895
901
|
* 分段失速分析(最多走hours 小时)
|
|
@@ -904,8 +910,8 @@ class C {
|
|
|
904
910
|
* @param useMeteo true 启用气象分析
|
|
905
911
|
* @param useRouteParam
|
|
906
912
|
*/
|
|
907
|
-
static async analyseInstantWithThreshed(s, t, i, o, n, a, e, c = "", r = 3,
|
|
908
|
-
var A,
|
|
913
|
+
static async analyseInstantWithThreshed(s, t, i, o, n, a, e, c = "", r = 3, d = !0, l = !1, p = {}) {
|
|
914
|
+
var A, S, P;
|
|
909
915
|
s.lng = B.convertToStdLng(s.lng);
|
|
910
916
|
const { v0: f, label: m } = s.sog ? {
|
|
911
917
|
v0: s.sog,
|
|
@@ -915,57 +921,57 @@ class C {
|
|
|
915
921
|
v0: n.speed,
|
|
916
922
|
label: "CP"
|
|
917
923
|
/* Cp */
|
|
918
|
-
}, v = C.assembleProperties(o, n.loadCondition, f, 0),
|
|
919
|
-
if (((A =
|
|
924
|
+
}, v = C.assembleProperties(o, n.loadCondition, f, 0), w = V.calculateSubRoute(s, a);
|
|
925
|
+
if (((A = w[0]) == null ? void 0 : A.length) <= 1)
|
|
920
926
|
return;
|
|
921
927
|
const Y = e.length ? V.calculateSubWaypoints(s, e) : [];
|
|
922
|
-
Y.forEach((
|
|
923
|
-
let M = V.simplifyRouteToCoordinates(
|
|
928
|
+
Y.forEach((D) => D.important = !0);
|
|
929
|
+
let M = V.simplifyRouteToCoordinates(w, Y, 0), h = 0, k = 0, j = 0, y = 0, g;
|
|
924
930
|
const N = {
|
|
925
931
|
hours: [],
|
|
926
932
|
wps: [],
|
|
927
933
|
days: []
|
|
928
934
|
};
|
|
929
|
-
for (t =
|
|
930
|
-
const
|
|
931
|
-
let
|
|
932
|
-
if (
|
|
933
|
-
|
|
935
|
+
for (t = b(t).utc(); M.length > 0; ) {
|
|
936
|
+
const D = r - t.hour() % r;
|
|
937
|
+
let E = Math.ceil(t.clone().add(D, "h").set({ minute: 0, second: 0, millisecond: 0 }).diff(t, "h", !0) * 1e4) / 1e4;
|
|
938
|
+
if (E = t.clone().add(E, "h").isAfter(i) ? i.diff(t, "h", !0) * 1e4 / 1e4 : E, E)
|
|
939
|
+
g = await C.speedLoseInHoursStep(
|
|
934
940
|
v,
|
|
935
941
|
t,
|
|
936
942
|
i.clone(),
|
|
937
|
-
|
|
943
|
+
E,
|
|
938
944
|
h,
|
|
939
945
|
M,
|
|
940
946
|
c,
|
|
941
|
-
|
|
947
|
+
d,
|
|
942
948
|
l,
|
|
943
949
|
p
|
|
944
|
-
), (
|
|
950
|
+
), (S = g.from) != null && S.speed && (N.hours.push(g.from), g != null && g.wps && N.wps.push(...g.wps), N.days.push(...g.days)), M = g == null ? void 0 : g.next, M.length || (N.hours.push(g == null ? void 0 : g.to), g != null && g.wps && N.wps.push(...g.wps), N.days.push(g == null ? void 0 : g.to)), h += ((P = g == null ? void 0 : g.to) == null ? void 0 : P.distanceFromPrevious) ?? 0;
|
|
945
951
|
else {
|
|
946
|
-
|
|
952
|
+
g && (N.hours.push(g.to), g != null && g.wps && N.wps.push(...g.wps), N.days.push(g.to));
|
|
947
953
|
break;
|
|
948
954
|
}
|
|
949
955
|
}
|
|
950
|
-
const
|
|
951
|
-
for (let
|
|
952
|
-
const
|
|
953
|
-
|
|
956
|
+
const F = N.hours;
|
|
957
|
+
for (let D = 0; D < F.length - 1; D++) {
|
|
958
|
+
const E = b(F[D + 1].eta).diff(F[D].etd, "hour", !0);
|
|
959
|
+
k += F[D].wxFactor * E, j += F[D].cFactor * E, y += E;
|
|
954
960
|
}
|
|
955
961
|
const W = N.hours.at(0), T = N.hours.at(-1);
|
|
956
962
|
return {
|
|
957
963
|
sample: N,
|
|
958
964
|
distance: Math.round(((T == null ? void 0 : T.distanceFromStart) || 0) * 1e4) / 1e4,
|
|
959
965
|
// 注意,可能会在first节点Drift,所有采用eta做为初始出发时间
|
|
960
|
-
etd:
|
|
961
|
-
eta:
|
|
962
|
-
wxFactor: Math.round(
|
|
966
|
+
etd: b(W.eta).utc().format(),
|
|
967
|
+
eta: b(T == null ? void 0 : T.eta).utc().format(),
|
|
968
|
+
wxFactor: Math.round(k / y * 1e4) / 1e4,
|
|
963
969
|
cFactor: Math.round(j / y * 1e4) / 1e4,
|
|
964
970
|
avgSpeed: Math.round(((T == null ? void 0 : T.distanceFromStart) || 0) / y * 1e4) / 1e4,
|
|
965
971
|
totalHrs: Math.round(y * 1e4) / 1e4,
|
|
966
972
|
from: s,
|
|
967
973
|
to: T,
|
|
968
|
-
route:
|
|
974
|
+
route: w,
|
|
969
975
|
waypoints: Y,
|
|
970
976
|
v0: f,
|
|
971
977
|
label: m
|
|
@@ -974,15 +980,15 @@ class C {
|
|
|
974
980
|
}
|
|
975
981
|
export {
|
|
976
982
|
K as AISImpl,
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
983
|
+
nt as AlertHelper,
|
|
984
|
+
ot as AlertLevel,
|
|
985
|
+
Mt as HifleetImpl,
|
|
986
|
+
rt as LoadCondition,
|
|
987
|
+
gt as MyShipImpl,
|
|
988
|
+
pt as MyVesselImpl,
|
|
989
|
+
yt as ShipxyImpl,
|
|
984
990
|
C as SpeedHelper,
|
|
985
|
-
|
|
986
|
-
|
|
991
|
+
ct as SpeedLabel,
|
|
992
|
+
it as VesselTag,
|
|
987
993
|
bt as alertHelper
|
|
988
994
|
};
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(k,D){typeof exports=="object"&&typeof module<"u"?D(exports,require("got"),require("@log4js-node/log4js-api"),require("moment"),require("@idm-plugin/geo"),require("@idm-plugin/meteo")):typeof define=="function"&&define.amd?define(["exports","got","@log4js-node/log4js-api","moment","@idm-plugin/geo","@idm-plugin/meteo"],D):(k=typeof globalThis<"u"?globalThis:k||self,D(k["idm-plugin-rabbitmq"]={},k.got,k["@log4js-node/log4js-api"],k.moment,k["@idm-plugin/geo"],k["@idm-plugin/meteo"]))})(this,function(k,D,Z,g,O,nt){"use strict";var ht=Object.defineProperty;var lt=(k,D,Z)=>D in k?ht(k,D,{enumerable:!0,configurable:!0,writable:!0,value:Z}):k[D]=Z;var K=(k,D,Z)=>(lt(k,typeof D!="symbol"?D+"":D,Z),Z);let u;try{u=Z.getLogger("vessel")}catch{}finally{}class z{parseStatus(s){let t,i;switch(s){case 0:t="在航(主机推动)",i="The engine is in use";break;case 1:t="锚泊",i="Anchored";break;case 2:t="失控",i="Not operated";break;case 3:t="操纵受限",i="Limited airworthiness";break;case 4:t="吃水受限",i="Limited by ship's draft";break;case 5:t="靠泊",i="Mooring";break;case 6:t="搁浅",i="Stranded";break;case 7:t="捕捞作业",i="Engaged in fishing";break;case 8:t="靠帆船提供动力",i="Sailing";break;default:t="未定义",i="Undefined"}return{labelCn:t,labelEn:i}}}class ot extends z{constructor(t,i){super();K(this,"clientId");K(this,"clientSecret");K(this,"token");this.clientId=t,this.clientSecret=i}async authToken(t={}){const i="https://svc.data.myvessel.cn/ada/oauth/token",n={searchParams:{client_id:this.clientId,client_secret:this.clientSecret,grant_type:"client_credentials"}},o=await D.post(i,n).json();u==null||u.info("[%s] fetch access token from: %s - %j",t.requestId,i,o),o.error||(this.token={accessToken:o.access_token,tokenType:o.token_type,expiresIn:o.expires_in,scope:o.scope,jti:o.jti,issuedAt:g().utc().format()})}async realTimePosition(t,i={}){var d,l,p;(!this.token||g().diff(g(this.token.issuedAt),"seconds")>((d=this.token)==null?void 0:d.expiresIn)-300)&&await this.authToken(i);const n="https://svc.data.myvessel.cn/sdc/v1/vessels/status/location/unit",o={headers:{Authorization:`${(l=this.token)==null?void 0:l.tokenType} ${(p=this.token)==null?void 0:p.accessToken}`},searchParams:{mmsi:t}};u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,n,o);const a=await D.get(n,o).json();if(a.code)return u==null||u.warn("[%s] fetch realtime position failed: %j",i.requestId,n,{message:a.message,status:a.status,code:a.code}),a;const e=a.data;for(const f in e)!isNaN(e[f])&&Number(e[f])!==1/0&&(e[f]=Number(e[f]));const c=g(`${e.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:e.mmsi,name:e.vesselName,imo:e.imo,callSign:e.callsign,lat:e.lat,lng:e.lon,length:e.length,width:e.width,draught:e.currDraught,sog:e.sog,cog:e.cog,hdg:e.hdg,rot:e.rot,eta:e.eta,destination:e.dest,positionTime:c.unix(),status:e.status,labelCn:e.statusNameCn,labelEn:e.statusNameEn,method:"position",vendor:"myVessel",utc:c.utc().format()}}async trajectory(t,i,n,o,a=!0,e={}){(!this.token||g().diff(g(this.token.issuedAt),"seconds")>this.token.expiresIn-300)&&await this.authToken(e);const c=await this.realTimePosition(t,e),r=g(i),d=g(n),l=[];for(;d.diff(r,"day",!0)>30;)await this.trajectoryIn30Day(t,r,r.clone().add(30,"day"),c,o,l,e),r.add(30,"day");return await this.trajectoryIn30Day(t,r,d,c,o,l,e),l}async trajectoryIn30Day(t,i,n,o,a,e,c={}){var m,v,j,Y,M;const r="https://svc.data.myvessel.cn/sdc/v1/vessels/status/track",d={headers:{Authorization:`${(m=this.token)==null?void 0:m.tokenType} ${(v=this.token)==null?void 0:v.accessToken}`},json:{mmsi:t,startTime:i.utcOffset(8).format("YYYY-MM-DD HH:mm:ss"),endTime:n.utcOffset(8).format("YYYY-MM-DD HH:mm:ss")}};u==null||u.info("[%s] fetch trajectory from: %s - %j",c.requestId,r,d);const l=await D.post(r,d).json();if(l.code)return u==null||u.warn("[%s] fetch trajectory failed: %j",c.requestId,r,{message:l.message,status:l.status,code:l.code}),l;let p=-1;const f=g(`${(Y=(j=l.data)==null?void 0:j[0])==null?void 0:Y.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return(M=l.data)==null||M.forEach(h=>{for(const T in h)!isNaN(h[T])&&Number(h[T])!==1/0&&(h[T]=Number(h[T]));const I=g(`${h.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"),H=h.eta?g(`${h.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"):void 0,y=h.status,{labelCn:b,labelEn:F}=this.parseStatus(y),x={mmsi:h.mmsi,imo:o==null?void 0:o.imo,lat:h.lat,lng:h.lon,sog:h.sog,cog:h.cog,hdg:h.hdg,draught:h.draught,status:y,eta:H==null?void 0:H.unix(),destination:h.dest,positionTime:I.unix(),labelCn:b,labelEn:F,method:"trajectory",vendor:"myVessel",utc:I.utc().format()},V=Math.floor(I.diff(f,"minute",!0)/(a||1));V!==p&&(p=V,e.push(x))}),e}}class it extends z{constructor(t){super();K(this,"token");this.token=t}async realTimePosition(t,i={}){const n="https://api.hifleet.com/position/position/get/token",o={searchParams:{mmsi:t,usertoken:this.token}},a=await D.post(n,o).json();u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,n,o);const e=a==null?void 0:a.list;if(!e)return u==null||u.warn("[%s] fetch realtime position failed: %j",i.requestId,n,a),a;for(const f in e)!isNaN(e[f])&&Number(e[f])!==1/0&&(e[f]=Number(e[f]));e.status=e.sp>3?0:1;const c=e.status,{labelCn:r,labelEn:d}=this.parseStatus(c),l=g(`${e.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:e.m,name:e.n,imo:e.imonumber,callSign:e.callsign,lat:Math.round(e.la/60*1e5)/1e5,lng:Math.round(e.lo/60*1e5)/1e5,length:e.l,width:e.w,draught:e.draught,sog:e.sp,cog:e.co,hdg:e.h,rot:isNaN(e.rot)?0:e.rot,eta:/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e.eta)?g(`${e.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00").unix():void 0,destination:e.destination,positionTime:l.unix(),utc:l.utc().format(),status:c,labelCn:r,labelEn:d,method:"position",vendor:"hifleet"}}async search(t,i={}){let n="https://www.hifleet.com/hifleetapi/searchVesselOL.do";const o={searchParams:{keyword:t},headers:{Referer:"https://www.hifleet.com",Origin:"https://www.hifleet.com",Host:"www.hifleet.com"}};let a=await D.post(n,o).json();u==null||u.info("[%s] fetch vessel props from: %s - %j",i.requestId,n,o),a instanceof Array&&(a=a[0]);for(const c in a)!isNaN(a[c])&&Number(a[c])!==1/0&&(a[c]=Number(a[c]));const e={mmsi:a.m,name:a.n,imo:a.i,callSign:a.c,length:a.l,breadth:a.b,draught:a.dr};return n="https://www.hifleet.com/hifleetapi/sameShipSearch.do",a=await D.post(n,o).json(),u==null||u.info("[%s] fetch vessel dead weight from: %s - %j",i.requestId,n,o),a instanceof Array&&(a=a[0]),a&&(e.deadweight=Number(a.dwt)),e}async trajectory(t,i,n,o,a=!0,e={}){var h,I,H;const c=await this.realTimePosition(t,e);let r=g(i);const d=g(n),l=g();if(a){let y=d.diff(r,"d",!0);y<0?r=d.clone().subtract(40,"d"):y<30?r.subtract(10,"d"):y<60?r.subtract(5,"d"):r=d.clone().subtract(80,"d"),y=l.diff(d,"d",!0),d.add(y>10?240:y*24,"h")}const p={searchParams:{endtime:d.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),starttime:r.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),mmsi:t,usertoken:this.token}},f="https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token",m=await D.get(f,p).json();u==null||u.info("[%s] fetch trajectory from: %s - %j",e.requestId,f,p);let v;m&&(v=((I=(h=m.ships)==null?void 0:h.offors)==null?void 0:I.ship)||[],v.length||u==null||u.warn("[%s] fetch trajectory failed: %j",e.requestId,m));const j=[];let Y=-1;const M=g(`${(H=v==null?void 0:v[0])==null?void 0:H.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");for(const y of v){for(const _ in y)!isNaN(y[_])&&Number(y[_])!==1/0&&(y[_]=Number(y[_]));const b=g(`${y.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");y.status=y.sp>4?0:1;const{labelEn:F,labelCn:x}=this.parseStatus(y.status),V={mmsi:y.m,name:y.n,imo:c==null?void 0:c.imo,lat:y.la,lng:y.lo,draught:y.draught,sog:y.sp,cog:y.co,hdg:y.hdg,positionTime:b.unix(),utc:b.utc().format(),status:y.status,labelCn:x,labelEn:F,method:"trajectory",vendor:"hifleet"},T=Math.floor(b.diff(M,"minute",!0)/(o||1));T!==Y&&(Y=T,j.push(V))}return j}}class rt extends z{constructor(t){super();K(this,"token");this.token=t}async realTimePosition(t,i={}){const n={searchParams:{id:t,k:this.token,enc:1}},o="https://api.shipxy.com/apicall/GetSingleShip",a=await D.get(o,n).json();if(u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,o,n),(a==null?void 0:a.status)!==0)return a;const e=a.data[0];for(const p in e)!isNaN(e[p])&&Number(e[p])!==1/0&&(e[p]=Number(e[p]));const{labelCn:c,labelEn:r}=await this.parseStatus(e.navistat),d=g.unix(e.lasttime);return{mmsi:e.ShipID,name:e.name,imo:e.imo,callSign:e.callsign,lat:Math.round(e.lat/1e6*1e5)/1e5,lng:Math.round(e.lon/1e6*1e5)/1e5,length:Math.round(e.length/10*100)/100,width:Math.round(e.width/10*100)/100,draught:Math.round(e.draught/1e3*100)/100,sog:Math.round(e.sog*3600/1e3/1852*100)/100,cog:Math.round(e.cog/100*100)/100,hdg:Math.round(e.hdg/100*100)/100,rot:Math.round(e.rot/100*100)/100,positionTime:e.lasttime,utc:d.utc().format(),status:e.navistat,labelEn:r,labelCn:c,method:"position",vendor:"shipxy"}}async trajectory(t,i,n,o,a=!0,e={}){var M;const c=await this.realTimePosition(t,e),r=g(i),d=g(n),l="https://api.shipxy.com/apicall/GetShipTrack",p={searchParams:{id:t,k:this.token,enc:1,cut:0,btm:r.unix(),etm:d.unix()}},f=await D.get(l,p).json();if(u==null||u.info("[%s] fetch trajectory from: %s - %j",e.requestId,l,p),(f==null?void 0:f.status)!==0)return f;const m=f==null?void 0:f.points,v=[],j=g.unix((M=m[0])==null?void 0:M.utc);let Y=-1;for(const h of m){const I=g.unix(h.utc),H={imo:c==null?void 0:c.imo,mmsi:t,sog:Math.round(h.sog*3600/1e3/1852*100)/100,cog:Math.round(h.cog/100*100)/100,lat:Math.round(h.lat/1e6*1e5)/1e5,lng:Math.round(h.lon/1e6*1e5)/1e5,positionTime:I.unix(),utc:I.utc().format(),method:"trajectory",vendor:"shipxy"},y=Math.floor(I.diff(j,"minute",!0)/(o||1));y!==Y&&(Y=y,v.push(H))}return v}}class ct extends z{constructor(t){super();K(this,"token");this.token=t}async getShipId(t,i={}){const n={headers:{appKey:this.token},json:{mmsiList:t}},o="https://api3.myships.com/sp/ships/getShipIdByMMSI",a=await D.post(o,n).json();return u==null||u.info("[%s] fetch ship id from: %s - %j",i.requestId,o,n),a.code!=="0"?a:a.data[0].shipId}async getShipInfo(t,i={}){const n={headers:{appKey:this.token},json:{shipId:t}},o="https://api3.myships.com/sp/ships/aissta",a=await D.post(o,n).json();if(u==null||u.info("[%s] fetch ship info from: %s - %j",i.requestId,o,n),a.code!=="0")return a;const e=a.data;let c=e.imo;return t==="407170"&&(c="9198379",u==null||u.warn("[%s] ship(%s) imo error: %s, should be %s",i.requestId,t,e.imo,c)),{mmsi:e.mmsi,name:e.shipnameEn,imo:c,callSign:e.callSign,length:e.length,width:e.breadth,draught:(e.draught||100)/10}}async realTimePosition(t,i={}){const n=await this.getShipId(t,i),o=await this.getShipInfo(n,i),a={headers:{appKey:this.token},json:{shipId:n}},e="https://api3.myships.com/sp/ships/position/latest",c=await D.post(e,a).json();u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,e,a);const r=c.data[0];for(const m in r)!isNaN(r[m])&&Number(r[m])!==1/0&&(r[m]=Number(r[m]));const{labelCn:d,labelEn:l}=await this.parseStatus(r.aisNavStatus),p=g.unix(r.posTime);return{...o,mmsi:t,lat:Math.round(r.lat/1e4/60*1e5)/1e5,lng:Math.round(r.lon/1e4/60*1e5)/1e5,sog:Math.round(r.sog/10*100)/100,cog:Math.round(r.cog/10*100)/100,hdg:Math.round(r.heading*100)/100,rot:Math.round(r.rot*100)/100,positionTime:r.posTime,utc:p.utc().format(),status:r.aisNavStatus,labelEn:l,labelCn:d,method:"position",vendor:"myship"}}async trajectory(t,i,n,o,a=!0,e={}){const c=g(i),r=g(n),d=await this.getShipId(t),l=await this.getShipInfo(d),p=[];for(;r.diff(c,"day",!0)>30;)await this.trajectoryIn30Day(d,c.unix(),c.add(30,"day").unix(),l,t,o,p);return await this.trajectoryIn30Day(d,c.unix(),r.unix(),l,t,o,p),p}async trajectoryIn30Day(t,i,n,o,a,e,c,r={}){var j;const d={headers:{appKey:this.token},json:{shipId:t,startTime:i,endTime:n}},l="https://api3.myships.com/sp/ships/position/history",p=await D.post(l,d).json();if(u==null||u.info("[%s] fetch trajectory from: %s - %j",r.requestId,l,d),p.code!=="0")return u==null||u.warn("[%s] invoke myship trajectory failed: %j",r.requestId,p),p;const f=p.data;for(const Y in f)!isNaN(f[Y])&&Number(f[Y])!==1/0&&(f[Y]=Number(f[Y]));const m=g.unix((j=f[0])==null?void 0:j.posTime);let v=-1;for(const Y of f){const M=g.unix(Y.posTime),h={imo:o==null?void 0:o.imo,mmsi:a,lat:Math.round(Y.lat/1e4/60*1e5)/1e5,lng:Math.round(Y.lon/1e4/60*1e5)/1e5,sog:Math.round(Y.sog/10*100)/100,cog:Math.round(Y.cog/10*100)/100,hdg:Math.round(Y.heading*100)/100,rot:Math.round(Y.rot*100)/100,positionTime:M.unix(),utc:M.utc().format(),method:"trajectory",vendor:"myship"},I=Math.floor(M.diff(m,"minute",!0)/(e||1));I!==v&&(v=I,c.push(h))}return c}}let R;try{R=Z.getLogger("vessel")}catch{}finally{}var G=(w=>(w.NOTICE="NOTICE",w.WARN="WARN",w.HEAVY="HEAVY",w.SEVERE="SEVERE",w.ERROR="ERROR",w.FATAL="FATAL",w))(G||{});class U{parsePrinciple(s,t={}){var e,c,r;R==null||R.info("[%s] parse rule: %s",t.requestId,s);const i=new RegExp("(?<=\\[)(.+)(?=])","g"),n=s.match(i)?(e=s.match(i))==null?void 0:e[0]:void 0,o=n==null?void 0:n.split(";");if(!o)return;const a={};for(let d=0;d<(o==null?void 0:o.length);d++){const l=(r=(c=o[d].match(i))==null?void 0:c[0])==null?void 0:r.split("],");if(d===0&&!l)a.scope=o[0];else if(l)for(let p=0,f=l.length;p<f;p++){const m=this.parseRule(l[p]);m&&(a[m.level]?m.key?a[m.level][m==null?void 0:m.key]=m:a[m.level]=m:m.key?a[m.level]={[m==null?void 0:m.key]:m}:a[m.level]=m)}}return a}parseRule(s,t={}){var a;R==null||R.info("[%s] parse rule: %s",t.requestId,s),s=s.startsWith("[")?s:`[${s}`,s=s.endsWith("]")?s:`${s}]`;const i=new RegExp("(?<=\\[)(.+?)(?=])","g"),n=(a=s==null?void 0:s.match(i))==null?void 0:a[0],o=n==null?void 0:n.split(",");if(o)return{operator:o[0],number:Number.isNaN(Number(o[1]))?o[1]:Number(o[1]),level:o[2],time:Number(o[3]),key:o[4]}}checkWeather(s,t,i={}){var m,v,j,Y,M,h,I,H,y,b,F,x,V,T,_;let n=0,o=0,a=0,e=0;const c=Math.round(((v=(m=t==null?void 0:t.SEVERE)==null?void 0:m.sigWave)==null?void 0:v.number)*1.6*100)/100,r=(Y=(j=t==null?void 0:t.SEVERE)==null?void 0:j.sigWave)==null?void 0:Y.number,d=(h=(M=t==null?void 0:t.HEAVY)==null?void 0:M.sigWave)==null?void 0:h.number,l=Math.round((((H=(I=t==null?void 0:t.SEVERE)==null?void 0:I.wind)==null?void 0:H.number)+2)*100)/100,p=(b=(y=t==null?void 0:t.SEVERE)==null?void 0:y.wind)==null?void 0:b.number,f=(x=(F=t==null?void 0:t.HEAVY)==null?void 0:F.wind)==null?void 0:x.number;for(let W=0;W<(s==null?void 0:s.length);W++){const S=s[W],L=(T=(V=S==null?void 0:S.meteo)==null?void 0:V.wave)==null?void 0:T.sig,N=(_=S==null?void 0:S.meteo)==null?void 0:_.wind,E=W?g(S.eta).diff(g(s[W-1].eta),"hour",!0):0;e=E>e?E:e,R==null||R.info("[%s] check sig.wave: %j",i.requestId,{...L,dgThd4Wv:c,svThd4Wv:r,hvThd4Wv:d}),(L==null?void 0:L.height)>=c?S.isDangerous=!0:(L==null?void 0:L.height)>=r?S.isSevere=!0:(L==null?void 0:L.height)>=d&&(S.isHeavy=!0),R==null||R.info("[%s] check wind: %j",i.requestId,{...N,dgThd4Wd:l,svThd4Wd:p,hvThd4Wd:f}),(N==null?void 0:N.scale)>=l?(S.isDangerous=!0,delete S.isSevere,delete S.isHeavy):(N==null?void 0:N.scale)>p?(S.isDangerous||(S.isSevere=!0),delete S.isHeavy):(N==null?void 0:N.scale)===f&&!S.isDangerous&&!S.isSevere&&(S.isHeavy=!0),n+=S.isDangerous?E:0,o+=S.isSevere?E:0,a+=S.isHeavy?E:0}return n=Math.round(n*100)/100,o=Math.round(o*100)/100,a=Math.round(a*100)/100,e=Math.round(e),{sample:s,dangerous:n,severe:o,heavy:a,step:e<3?3:e,wind:{dgThd4Wd:l,svThd4Wd:p,hvThd4Wd:f},sig:{dgThd4Wv:c,svThd4Wv:r,hvThd4Wv:d}}}}const dt=new U;let q;try{q=Z.getLogger("vessel")}catch{}finally{}var J=(w=>(w.common="common",w.container="container",w.tugs="tugs",w))(J||{}),Q=(w=>(w.Ballast="Ballast",w.Laden="Laden",w))(Q||{}),X=(w=>(w.Cp="CP",w.Perf="Basis",w.Instruct="Other",w))(X||{});class A{static blockCoefficient(s,t,i,n){let o=Math.round(s/(t*i*n)*100)/100;o=o<.55?.55:o>.85?.85:o;const a=[.55,.6,.65,.7,.75,.8,.85],e=a.map(c=>Math.abs(c-o));return a[e.indexOf(Math.min(...e))]}static froudeNumber(s,t,i=9.8){let n=Math.round(Math.sqrt(s*s/(i*t))*100)/100;return n=n<.05?.05:n>.3?.3:n,n}static amendFactor(s,t,i){const n={.55:[1.7,-1.4,-7.4],.6:[2.2,-2.5,-9.7],.65:[2.6,-3.7,-11.6],.7:[3.1,-5.3,-12.4],.75:[2.4,-10.6,-9.5],.8:[2.6,-13.1,-15.1],.85:[3.1,-18.7,28]};let a={.55:[1.7,-1.4,-7.4],.6:[2.2,-2.5,-9.7],.65:[2.6,-3.7,-11.6],.7:[3.1,-5.3,-12.4],.75:[2.6,-12.5,-13.5],.8:[3,-16.3,-21.6],.85:[3.4,-20.9,31.8]}[s];return i==="Laden"&&(a=n[s]),a[0]+a[1]*t+a[2]*Math.pow(t,2)}static directionFactor(s,t=0){let i;return s>30&&s<=60?i=(1.7-.03*Math.pow(t-4,2))/2:s>60&&s<=150?i=(.9-.06*Math.pow(t-6,2))/2:s>150&&s<=180?i=(.4-.03*Math.pow(t-8,2))/2:i=1,Math.round(i*1e5)/1e5}static vesselTagFactor(s,t,i,n=0){n=n>6?n-.9*(n-6):n;let o;return i==="container"?o=.7*n+Math.pow(n,6.5)/(22*Math.pow(s,2/3)):t==="Ballast"?o=.7*n+Math.pow(n,6.5)/(2.7*Math.pow(s,2/3)):o=.5*n+Math.pow(n,6.5)/(2.7*Math.pow(s,2/3)),o}static waveHeightFactor(s){return s=s<1.25?1.25:s,s=s>6?s-.9*(s-6):s,s=s>9?9:s,Math.round((-.144*Math.pow(s,2)+.178*s)*1e4)/1e4}static assembleProperties(s,t,i,n){var p;const o=s.lbp??s.length??s.lengthOverall??198.9642,a=s.draught??8,e=s.breadthMoulded??s.breadth??s.breadthExtreme??32.4572,c=s.deadweight??67035.7773,r=((p=s==null?void 0:s.type)==null?void 0:p.toLowerCase())||"common";return{tag:r.indexOf("container")>-1?"container":r.indexOf("tugs")>-1?"tugs":"common",lbp:o,loadCondition:t,draught:a,breadthMoulded:e,displacement:Math.round((c/1.025+a*e*o*.7)*1e4)/1e4,speed:Math.round((i??14.1382)*1852/3600*1e4)/1e4,bearing:n||90}}static async speedLoseAt(s,t,i,n="",o=2,a=!0,e=!1,c={}){let r;if(t.velocity&&e&&(s.speed=O.LngLatHelper.roundPrecision(t.velocity*1852/3600,6)),a){const d=await nt.MeteoHelper.queryPointFactor(t.lng,t.lat,i.valueOf(),"wind,wave,current,watertemp",n,c),l=A.weatherFactor(s,d),p=A.currentFactor(s.bearing,d==null?void 0:d.current,o),f=Math.round((s.speed*1.943844+l+p)*100)/100;r={meteo:{...d},wxFactor:l,cFactor:p,speed:t.velocity&&e?t.velocity:f<0?1:f,eta:i.utc().format("YYYY-MM-DDTHH:mm[Z]"),etd:i.utc().format("YYYY-MM-DDTHH:mm[Z]")}}else r={wxFactor:0,cFactor:0,speed:t.velocity&&e?t.velocity:Math.round((s.speed*1.943844+0+0)*100)/100,eta:i.utc().format("YYYY-MM-DDTHH:mm[Z]"),etd:i.utc().format("YYYY-MM-DDTHH:mm[Z]")};return delete t.meteo,delete t.wxFactor,delete t.cFactor,delete t.speed,delete t.etd,{...r,...t}}static async speedLoseInHoursStep(s,t,i,n,o,a,e="",c=!0,r=!1,d={}){t.utc();const l=[],p=[];let f=0,m=0,v,j;for(let Y=0;Y<a.length-1;Y++){let M=a[Y];M.distanceFromStart=o+m;const h=a[Y+1];if(s.bearing=O.LaneHelper.calculateBearing(M,h,!h.gcToPrevious),M.bearing=s.bearing,M.suspend&&r){M.eta=M.eta||t.format("YYYY-MM-DDTHH:mm[Z]"),M.elapsed=M.elapsed??0;const y=M.suspend-M.elapsed;if(n-f>y)n=n-f-y,t.add(y,"hour"),M.elapsed=M.suspend;else{const b=n-f;M.elapsed+=b,t.add(b,"hour"),n=0}if(q==null||q.info(`[%s] suspend ${M.elapsed} hours at %j, and remain ${n} hours need to go...`,d.requestId,M),n===0)return M.distanceFromPrevious=m,{etd:t,from:j||M,to:M,next:a.filter(b=>b),wps:l,days:p}}M=await A.speedLoseAt(s,M,t,e,0,c,r,d),j=j||M,M.important&&l.push(M),t.isSameOrAfter(i)&&(p.push(M),i.add(24,"hour"));const I=O.LaneHelper.calculateDistance(M,h,!h.gcToPrevious);let H=Math.ceil(I/j.speed*1e4)/1e4;if(f+H<n){if(f+=H,t.add(H,"hour"),delete a[Y],q==null||q.info(`[%s] go to %j from %j with ${I}nm, and cost ${H} hours`,d.requestId,{lat:h.lat,lng:h.lng},{lat:j.lat,lng:j.lng,etd:j.etd}),m+=I,a.filter(y=>y).length<=1){v=h,v.eta=t.format("YYYY-MM-DDTHH:mm[Z]"),v.distanceFromPrevious=I,v.distanceFromStart=o+m,l.push(v),delete a[Y+1];break}}else{H=n-f,t.add(H,"hour");const y=O.LngLatHelper.roundPrecision(j.speed*H,4);v=O.LaneHelper.calculateCoordinate(M,s.bearing,y,"nauticalmiles",!h.gcToPrevious),v.eta=t.format("YYYY-MM-DDTHH:mm[Z]"),a[Y]=v,q==null||q.info(`[%s] go to %j from %j with ${y}nm, and cost ${H} hours`,d.requestId,{lat:v.lat,lng:v.lng},{lat:M.lat,lng:M.lng,etd:M.etd}),m+=y,v.distanceFromPrevious=m,v.distanceFromStart=o+m;break}}return{etd:t,from:j,to:v,next:a.filter(Y=>Y),wps:l,days:p}}static currentFactor(s,t,i=0){const n=(s-(t==null?void 0:t.degree)||0)/180*Math.PI;if(Math.abs(n)===Math.PI/2)return 0;let o=((t==null?void 0:t.kts)||0)*Math.cos(n);return i&2?o=Math.ceil(o*100)/100:i&1?o=Math.floor(o*100)/100:o=Math.round(o*100)/100,Math.abs(o)>5?0:o}static weatherFactor(s,t){var l,p,f,m,v;q==null||q.debug("calculate weather factor via: %j",{...s,...t});const i=A.blockCoefficient(s.displacement,s.lbp,s.breadthMoulded,s.draught),n=A.froudeNumber(s.speed,s.lbp),o=A.amendFactor(i,n,s.loadCondition);let a=Math.abs(s.bearing%360-(((l=t==null?void 0:t.wind)==null?void 0:l.degree)%360||0));a=a>180?360-a:a;const e=A.directionFactor(a,(p=t==null?void 0:t.wind)==null?void 0:p.scale),c=A.vesselTagFactor(s.displacement,s.loadCondition,s.tag,(f=t==null?void 0:t.wind)==null?void 0:f.scale);let r=e*o*c/100*s.speed;r=Math.round(r*1.943844*1e4)/1e4*-1,s.tag==="tugs"&&Math.abs(r)>1&&(r=r/(Math.abs(Math.round(r))+1));const d=A.waveHeightFactor(((v=(m=t==null?void 0:t.wave)==null?void 0:m.sig)==null?void 0:v.height)??1);return r=r+d,q==null||q.debug("weather factor = %s",r),r=Math.abs(r)>5?5*(Math.abs(r)/r)+Math.abs(r)/r*(Math.abs(r)-5)*.4:r,Math.round(r*100)/100}static async analyseInstant(s,t,i,n,o,a="",e=0,c=!0,r=!1,d={}){var E,$,tt,et,st;const l=g().valueOf();s.lng=O.LngLatHelper.convertToStdLng(s.lng);const{route:p,waypoints:f}=o.points,m=O.LaneHelper.calculateSubRoute(s,p);if(((E=m[0])==null?void 0:E.length)<=1)return;const{v0:v,label:j}=s.sog?{v0:s.sog,label:"Other"}:{v0:n.speed,label:"CP"},Y=A.assembleProperties(i,n.loadCondition,v,0),M=f.length?O.LaneHelper.calculateSubWaypoints(s,f):[];M.forEach(C=>C.important=!0);const h={from:{...s},route:m,waypoints:M,v0:v,label:j},I={hours:[],days:[],wps:[]};e||(O.LaneHelper.calculateRouteDistance(m)/n.speed<=72?e=3:e=6);let H=O.LaneHelper.simplifyRouteToCoordinates(m,M,0),y=0,b=0,F=0,x=0;t=g(t).utc();const V=t.clone();for(;H.length>0;){const C=e-t.hour()%e,B=Math.ceil(t.clone().add(C,"h").set({minute:0,second:0,millisecond:0}).diff(t,"h",!0)*1e4)/1e4,P=await A.speedLoseInHoursStep(Y,t,V,B,y,H,a,c,r,d);($=P.from)!=null&&$.speed&&(I.hours.push(P.from),I.wps.push(...P.wps),I.days.push(...P.days)),H=P==null?void 0:P.next,H.length||I.hours.push(P==null?void 0:P.to),y+=((tt=P==null?void 0:P.to)==null?void 0:tt.distanceFromPrevious)??0}const T=I.hours;for(let C=0;C<T.length-1;C++){const B=g(T[C+1].eta).diff(T[C].etd,"hour",!0)||1;b+=(T[C].wxFactor||0)*B,F+=(T[C].cFactor||0)*B,x+=B}(et=I.wps)==null||et.forEach((C,B)=>{if(B){const P=I.wps[B-1],ut=C.distanceFromStart-P.distanceFromStart,at=g(C.eta).diff(g(P.etd),"h",!0);at<1?C.avgSpd=P.speed:C.avgSpd=Math.round(ut/at*100)/100}}),h.sample=I;const _=I.hours.at(0),W=I.hours.at(-1);h.distance=Math.round(W.distanceFromStart*1e4)/1e4,h.etd=g(_.eta).utc().format(),h.eta=g(W.eta).utc().format(),h.wxFactor=Math.round(b/x*1e4)/1e4,h.cFactor=Math.round(F/x*1e4)/1e4,h.avgSpeed=Math.round(W.distanceFromStart/x*1e4)/1e4,h.totalHrs=Math.round(x*1e4)/1e4,h.totalFoCons=Math.round((n==null?void 0:n.fo)/24*h.totalHrs*1e3)/1e3,h.totalDgoCons=Math.round((n==null?void 0:n.dgo)/24*h.totalHrs*1e3)/1e3;const L=g().valueOf()-l,N=((st=I==null?void 0:I.hours)==null?void 0:st.length)||1;return q==null||q.info("[%s] each hour-sample speed analyse cost: (%d / %d = %d) ms",d==null?void 0:d.requestId,L,N,Math.round(L/N*1e3)/1e3),h}static async analyseInstantWithThreshed(s,t,i,n,o,a,e,c="",r=3,d=!0,l=!1,p={}){var W,S,L;s.lng=O.LngLatHelper.convertToStdLng(s.lng);const{v0:f,label:m}=s.sog?{v0:s.sog,label:"Other"}:{v0:o.speed,label:"CP"},v=A.assembleProperties(n,o.loadCondition,f,0),j=O.LaneHelper.calculateSubRoute(s,a);if(((W=j[0])==null?void 0:W.length)<=1)return;const Y=e.length?O.LaneHelper.calculateSubWaypoints(s,e):[];Y.forEach(N=>N.important=!0);let M=O.LaneHelper.simplifyRouteToCoordinates(j,Y,0),h=0,I=0,H=0,y=0,b;const F={hours:[],wps:[],days:[]};for(t=g(t).utc();M.length>0;){const N=r-t.hour()%r;let E=Math.ceil(t.clone().add(N,"h").set({minute:0,second:0,millisecond:0}).diff(t,"h",!0)*1e4)/1e4;if(E=t.clone().add(E,"h").isAfter(i)?i.diff(t,"h",!0)*1e4/1e4:E,E)b=await A.speedLoseInHoursStep(v,t,i.clone(),E,h,M,c,d,l,p),(S=b.from)!=null&&S.speed&&(F.hours.push(b.from),b!=null&&b.wps&&F.wps.push(...b.wps),F.days.push(...b.days)),M=b==null?void 0:b.next,M.length||(F.hours.push(b==null?void 0:b.to),b!=null&&b.wps&&F.wps.push(...b.wps),F.days.push(b==null?void 0:b.to)),h+=((L=b==null?void 0:b.to)==null?void 0:L.distanceFromPrevious)??0;else{b&&(F.hours.push(b.to),b!=null&&b.wps&&F.wps.push(...b.wps),F.days.push(b.to));break}}const x=F.hours;for(let N=0;N<x.length-1;N++){const E=g(x[N+1].eta).diff(x[N].etd,"hour",!0);I+=x[N].wxFactor*E,H+=x[N].cFactor*E,y+=E}const V=F.hours.at(0),T=F.hours.at(-1);return{sample:F,distance:Math.round(((T==null?void 0:T.distanceFromStart)||0)*1e4)/1e4,etd:g(V.eta).utc().format(),eta:g(T==null?void 0:T.eta).utc().format(),wxFactor:Math.round(I/y*1e4)/1e4,cFactor:Math.round(H/y*1e4)/1e4,avgSpeed:Math.round(((T==null?void 0:T.distanceFromStart)||0)/y*1e4)/1e4,totalHrs:Math.round(y*1e4)/1e4,from:s,to:T,route:j,waypoints:Y,v0:f,label:m}}}k.AISImpl=z,k.AlertHelper=U,k.AlertLevel=G,k.HifleetImpl=it,k.LoadCondition=Q,k.MyShipImpl=ct,k.MyVesselImpl=ot,k.ShipxyImpl=rt,k.SpeedHelper=A,k.SpeedLabel=X,k.VesselTag=J,k.alertHelper=dt,Object.defineProperty(k,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(w,D){typeof exports=="object"&&typeof module<"u"?D(exports,require("got"),require("@log4js-node/log4js-api"),require("moment"),require("@idm-plugin/geo"),require("@idm-plugin/meteo")):typeof define=="function"&&define.amd?define(["exports","got","@log4js-node/log4js-api","moment","@idm-plugin/geo","@idm-plugin/meteo"],D):(w=typeof globalThis<"u"?globalThis:w||self,D(w["idm-plugin-rabbitmq"]={},w.got,w["@log4js-node/log4js-api"],w.moment,w["@idm-plugin/geo"],w["@idm-plugin/meteo"]))})(this,function(w,D,Z,g,O,ot){"use strict";var lt=Object.defineProperty;var ft=(w,D,Z)=>D in w?lt(w,D,{enumerable:!0,configurable:!0,writable:!0,value:Z}):w[D]=Z;var K=(w,D,Z)=>(ft(w,typeof D!="symbol"?D+"":D,Z),Z);let u;try{u=Z.getLogger("vessel")}catch{}finally{}class z{parseStatus(s){let t,i;switch(s){case 0:t="在航(主机推动)",i="The engine is in use";break;case 1:t="锚泊",i="Anchored";break;case 2:t="失控",i="Not operated";break;case 3:t="操纵受限",i="Limited airworthiness";break;case 4:t="吃水受限",i="Limited by ship's draft";break;case 5:t="靠泊",i="Mooring";break;case 6:t="搁浅",i="Stranded";break;case 7:t="捕捞作业",i="Engaged in fishing";break;case 8:t="靠帆船提供动力",i="Sailing";break;default:t="未定义",i="Undefined"}return{labelCn:t,labelEn:i}}}class it extends z{constructor(t,i){super();K(this,"clientId");K(this,"clientSecret");K(this,"token");this.clientId=t,this.clientSecret=i}async authToken(t={}){const i="https://svc.data.myvessel.cn/ada/oauth/token",n={searchParams:{client_id:this.clientId,client_secret:this.clientSecret,grant_type:"client_credentials"}},o=await D.post(i,n).json();u==null||u.info("[%s] fetch access token from: %s - %j",t.requestId,i,o),o.error||(this.token={accessToken:o.access_token,tokenType:o.token_type,expiresIn:o.expires_in,scope:o.scope,jti:o.jti,issuedAt:g().utc().format()})}async realTimePosition(t,i={}){var d,l,p;(!this.token||g().diff(g(this.token.issuedAt),"seconds")>((d=this.token)==null?void 0:d.expiresIn)-300)&&await this.authToken(i);const n="https://svc.data.myvessel.cn/sdc/v1/vessels/status/location/unit",o={headers:{Authorization:`${(l=this.token)==null?void 0:l.tokenType} ${(p=this.token)==null?void 0:p.accessToken}`},searchParams:{mmsi:t}};u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,n,o);const a=await D.get(n,o).json();if(a.code)return u==null||u.warn("[%s] fetch realtime position failed: %j",i.requestId,n,{message:a.message,status:a.status,code:a.code}),a;const e=a.data;for(const f in e)!isNaN(e[f])&&Number(e[f])!==1/0&&(e[f]=Number(e[f]));const c=g(`${e.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:e.mmsi,name:e.vesselName,imo:e.imo,callSign:e.callsign,lat:e.lat,lng:e.lon,length:e.length,width:e.width,draught:e.currDraught,sog:e.sog,cog:e.cog,hdg:e.hdg,rot:e.rot,eta:e.eta,destination:e.dest,positionTime:c.unix(),status:e.status,labelCn:e.statusNameCn,labelEn:e.statusNameEn,method:"position",vendor:"myVessel",utc:c.utc().format()}}async trajectory(t,i,n,o,a=!0,e={}){(!this.token||g().diff(g(this.token.issuedAt),"seconds")>this.token.expiresIn-300)&&await this.authToken(e);const c=await this.realTimePosition(t,e),r=g(i),d=g(n),l=[];for(;d.diff(r,"day",!0)>30;)await this.trajectoryIn30Day(t,r,r.clone().add(30,"day"),c,o,l,e),r.add(30,"day");return await this.trajectoryIn30Day(t,r,d,c,o,l,e),l}async trajectoryIn30Day(t,i,n,o,a,e,c={}){var m,v,k,Y,M;const r="https://svc.data.myvessel.cn/sdc/v1/vessels/status/track",d={headers:{Authorization:`${(m=this.token)==null?void 0:m.tokenType} ${(v=this.token)==null?void 0:v.accessToken}`},json:{mmsi:t,startTime:i.utcOffset(8).format("YYYY-MM-DD HH:mm:ss"),endTime:n.utcOffset(8).format("YYYY-MM-DD HH:mm:ss")}};u==null||u.info("[%s] fetch trajectory from: %s - %j",c.requestId,r,d);const l=await D.post(r,d).json();if(l.code)return u==null||u.warn("[%s] fetch trajectory failed: %j",c.requestId,r,{message:l.message,status:l.status,code:l.code}),l;let p=-1;const f=g(`${(Y=(k=l.data)==null?void 0:k[0])==null?void 0:Y.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return(M=l.data)==null||M.forEach(h=>{for(const S in h)!isNaN(h[S])&&Number(h[S])!==1/0&&(h[S]=Number(h[S]));const I=g(`${h.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"),H=h.eta?g(`${h.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"):void 0,y=h.status,{labelCn:b,labelEn:F}=this.parseStatus(y),E={mmsi:h.mmsi,imo:o==null?void 0:o.imo,lat:h.lat,lng:h.lon,sog:h.sog,cog:h.cog,hdg:h.hdg,draught:h.draught,status:y,eta:H==null?void 0:H.unix(),destination:h.dest,positionTime:I.unix(),labelCn:b,labelEn:F,method:"trajectory",vendor:"myVessel",utc:I.utc().format()},V=Math.floor(I.diff(f,"minute",!0)/(a||1));V!==p&&(p=V,e.push(E))}),e}}class rt extends z{constructor(t){super();K(this,"token");this.token=t}async realTimePosition(t,i={}){const n="https://api.hifleet.com/position/position/get/token",o={searchParams:{mmsi:t,usertoken:this.token}},a=await D.post(n,o).json();u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,n,o);const e=a==null?void 0:a.list;if(!e)return u==null||u.warn("[%s] fetch realtime position failed: %j",i.requestId,n,a),a;for(const f in e)!isNaN(e[f])&&Number(e[f])!==1/0&&(e[f]=Number(e[f]));e.status=e.sp>3?0:1;const c=e.status,{labelCn:r,labelEn:d}=this.parseStatus(c),l=g(`${e.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:e.m,name:e.n,imo:e.imonumber,callSign:e.callsign,lat:Math.round(e.la/60*1e5)/1e5,lng:Math.round(e.lo/60*1e5)/1e5,length:e.l,width:e.w,draught:e.draught,sog:e.sp,cog:e.co,hdg:e.h,rot:isNaN(e.rot)?0:e.rot,eta:/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e.eta)?g(`${e.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00").unix():void 0,destination:e.destination,positionTime:l.unix(),utc:l.utc().format(),status:c,labelCn:r,labelEn:d,method:"position",vendor:"hifleet"}}async search(t,i={}){let n="https://www.hifleet.com/hifleetapi/searchVesselOL.do";const o={searchParams:{keyword:t},headers:{Referer:"https://www.hifleet.com",Origin:"https://www.hifleet.com",Host:"www.hifleet.com"}};let a=await D.post(n,o).json();u==null||u.info("[%s] fetch vessel props from: %s - %j",i.requestId,n,o),a instanceof Array&&(a=a[0]);for(const c in a)!isNaN(a[c])&&Number(a[c])!==1/0&&(a[c]=Number(a[c]));const e={mmsi:a.m,name:a.n,imo:a.i,callSign:a.c,length:a.l,breadth:a.b,draught:a.dr};return n="https://www.hifleet.com/hifleetapi/sameShipSearch.do",a=await D.post(n,o).json(),u==null||u.info("[%s] fetch vessel dead weight from: %s - %j",i.requestId,n,o),a instanceof Array&&(a=a[0]),a&&(e.deadweight=Number(a.dwt)),e}async trajectory(t,i,n,o,a=!0,e={}){var h,I,H;const c=await this.realTimePosition(t,e);let r=g(i);const d=g(n),l=g();if(a){let y=d.diff(r,"d",!0);y<0?r=d.clone().subtract(40,"d"):y<30?r.subtract(10,"d"):y<60?r.subtract(5,"d"):r=d.clone().subtract(80,"d"),y=l.diff(d,"d",!0),d.add(y>10?240:y*24,"h")}const p={searchParams:{endtime:d.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),starttime:r.utcOffset("+8:00").format("YYYY-MM-DD HH:mm:ss"),mmsi:t,usertoken:this.token}},f="https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token",m=await D.get(f,p).json();u==null||u.info("[%s] fetch trajectory from: %s - %j",e.requestId,f,p);let v;m&&(v=((I=(h=m.ships)==null?void 0:h.offors)==null?void 0:I.ship)||[],v.length||u==null||u.warn("[%s] fetch trajectory failed: %j",e.requestId,m));const k=[];let Y=-1;const M=g(`${(H=v==null?void 0:v[0])==null?void 0:H.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");for(const y of v){for(const _ in y)!isNaN(y[_])&&Number(y[_])!==1/0&&(y[_]=Number(y[_]));const b=g(`${y.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");y.status=y.sp>4?0:1;const{labelEn:F,labelCn:E}=this.parseStatus(y.status),V={mmsi:y.m,name:y.n,imo:c==null?void 0:c.imo,lat:y.la,lng:y.lo,draught:y.draught,sog:y.sp,cog:y.co,hdg:y.hdg,positionTime:b.unix(),utc:b.utc().format(),status:y.status,labelCn:E,labelEn:F,method:"trajectory",vendor:"hifleet"},S=Math.floor(b.diff(M,"minute",!0)/(o||1));S!==Y&&(Y=S,k.push(V))}return k}}class ct extends z{constructor(t){super();K(this,"token");this.token=t}async realTimePosition(t,i={}){const n={searchParams:{id:t,k:this.token,enc:1}},o="https://api.shipxy.com/apicall/GetSingleShip",a=await D.get(o,n).json();if(u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,o,n),(a==null?void 0:a.status)!==0)return a;const e=a.data[0];for(const p in e)!isNaN(e[p])&&Number(e[p])!==1/0&&(e[p]=Number(e[p]));const{labelCn:c,labelEn:r}=await this.parseStatus(e.navistat),d=g.unix(e.lasttime);return{mmsi:e.ShipID,name:e.name,imo:e.imo,callSign:e.callsign,lat:Math.round(e.lat/1e6*1e5)/1e5,lng:Math.round(e.lon/1e6*1e5)/1e5,length:Math.round(e.length/10*100)/100,width:Math.round(e.width/10*100)/100,draught:Math.round(e.draught/1e3*100)/100,sog:Math.round(e.sog*3600/1e3/1852*100)/100,cog:Math.round(e.cog/100*100)/100,hdg:Math.round(e.hdg/100*100)/100,rot:Math.round(e.rot/100*100)/100,positionTime:e.lasttime,utc:d.utc().format(),status:e.navistat,labelEn:r,labelCn:c,method:"position",vendor:"shipxy"}}async trajectory(t,i,n,o,a=!0,e={}){var M;const c=await this.realTimePosition(t,e),r=g(i),d=g(n),l="https://api.shipxy.com/apicall/GetShipTrack",p={searchParams:{id:t,k:this.token,enc:1,cut:0,btm:r.unix(),etm:d.unix()}},f=await D.get(l,p).json();if(u==null||u.info("[%s] fetch trajectory from: %s - %j",e.requestId,l,p),(f==null?void 0:f.status)!==0)return f;const m=f==null?void 0:f.points,v=[],k=g.unix((M=m[0])==null?void 0:M.utc);let Y=-1;for(const h of m){const I=g.unix(h.utc),H={imo:c==null?void 0:c.imo,mmsi:t,sog:Math.round(h.sog*3600/1e3/1852*100)/100,cog:Math.round(h.cog/100*100)/100,lat:Math.round(h.lat/1e6*1e5)/1e5,lng:Math.round(h.lon/1e6*1e5)/1e5,positionTime:I.unix(),utc:I.utc().format(),method:"trajectory",vendor:"shipxy"},y=Math.floor(I.diff(k,"minute",!0)/(o||1));y!==Y&&(Y=y,v.push(H))}return v}}class dt extends z{constructor(t){super();K(this,"token");this.token=t}async getShipId(t,i={}){const n={headers:{appKey:this.token},json:{mmsiList:t}},o="https://api3.myships.com/sp/ships/getShipIdByMMSI",a=await D.post(o,n).json();return u==null||u.info("[%s] fetch ship id from: %s - %j",i.requestId,o,n),a.code!=="0"?a:a.data[0].shipId}async getShipInfo(t,i={}){const n={headers:{appKey:this.token},json:{shipId:t}},o="https://api3.myships.com/sp/ships/aissta",a=await D.post(o,n).json();if(u==null||u.info("[%s] fetch ship info from: %s - %j",i.requestId,o,n),a.code!=="0")return a;const e=a.data;let c=e.imo;return t==="407170"&&(c="9198379",u==null||u.warn("[%s] ship(%s) imo error: %s, should be %s",i.requestId,t,e.imo,c)),{mmsi:e.mmsi,name:e.shipnameEn,imo:c,callSign:e.callSign,length:e.length,width:e.breadth,draught:(e.draught||100)/10}}async realTimePosition(t,i={}){const n=await this.getShipId(t,i),o=await this.getShipInfo(n,i),a={headers:{appKey:this.token},json:{shipId:n}},e="https://api3.myships.com/sp/ships/position/latest",c=await D.post(e,a).json();u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,e,a);const r=c.data[0];for(const m in r)!isNaN(r[m])&&Number(r[m])!==1/0&&(r[m]=Number(r[m]));const{labelCn:d,labelEn:l}=await this.parseStatus(r.aisNavStatus),p=g.unix(r.posTime);return{...o,mmsi:t,lat:Math.round(r.lat/1e4/60*1e5)/1e5,lng:Math.round(r.lon/1e4/60*1e5)/1e5,sog:Math.round(r.sog/10*100)/100,cog:Math.round(r.cog/10*100)/100,hdg:Math.round(r.heading*100)/100,rot:Math.round(r.rot*100)/100,positionTime:r.posTime,utc:p.utc().format(),status:r.aisNavStatus,labelEn:l,labelCn:d,method:"position",vendor:"myship"}}async trajectory(t,i,n,o,a=!0,e={}){const c=g(i),r=g(n),d=await this.getShipId(t),l=await this.getShipInfo(d),p=[];for(;r.diff(c,"day",!0)>30;)await this.trajectoryIn30Day(d,c.unix(),c.add(30,"day").unix(),l,t,o,p);return await this.trajectoryIn30Day(d,c.unix(),r.unix(),l,t,o,p),p}async trajectoryIn30Day(t,i,n,o,a,e,c,r={}){var k;const d={headers:{appKey:this.token},json:{shipId:t,startTime:i,endTime:n}},l="https://api3.myships.com/sp/ships/position/history",p=await D.post(l,d).json();if(u==null||u.info("[%s] fetch trajectory from: %s - %j",r.requestId,l,d),p.code!=="0")return u==null||u.warn("[%s] invoke myship trajectory failed: %j",r.requestId,p),p;const f=p.data;for(const Y in f)!isNaN(f[Y])&&Number(f[Y])!==1/0&&(f[Y]=Number(f[Y]));const m=g.unix((k=f[0])==null?void 0:k.posTime);let v=-1;for(const Y of f){const M=g.unix(Y.posTime),h={imo:o==null?void 0:o.imo,mmsi:a,lat:Math.round(Y.lat/1e4/60*1e5)/1e5,lng:Math.round(Y.lon/1e4/60*1e5)/1e5,sog:Math.round(Y.sog/10*100)/100,cog:Math.round(Y.cog/10*100)/100,hdg:Math.round(Y.heading*100)/100,rot:Math.round(Y.rot*100)/100,positionTime:M.unix(),utc:M.utc().format(),method:"trajectory",vendor:"myship"},I=Math.floor(M.diff(m,"minute",!0)/(e||1));I!==v&&(v=I,c.push(h))}return c}}let R;try{R=Z.getLogger("vessel")}catch{}finally{}var G=(j=>(j.NOTICE="NOTICE",j.WARN="WARN",j.HEAVY="HEAVY",j.SEVERE="SEVERE",j.ERROR="ERROR",j.FATAL="FATAL",j))(G||{});class U{parsePrinciple(s,t={}){var e,c,r;R==null||R.info("[%s] parse rule: %s",t.requestId,s);const i=new RegExp("(?<=\\[)(.+)(?=])","g"),n=s.match(i)?(e=s.match(i))==null?void 0:e[0]:void 0,o=n==null?void 0:n.split(";");if(!o)return;const a={};for(let d=0;d<(o==null?void 0:o.length);d++){const l=(r=(c=o[d].match(i))==null?void 0:c[0])==null?void 0:r.split("],");if(d===0&&!l)a.scope=o[0];else if(l)for(let p=0,f=l.length;p<f;p++){const m=this.parseRule(l[p]);m&&(a[m.level]?m.key?a[m.level][m==null?void 0:m.key]=m:a[m.level]=m:m.key?a[m.level]={[m==null?void 0:m.key]:m}:a[m.level]=m)}}return a}parseRule(s,t={}){var a;R==null||R.info("[%s] parse rule: %s",t.requestId,s),s=s.startsWith("[")?s:`[${s}`,s=s.endsWith("]")?s:`${s}]`;const i=new RegExp("(?<=\\[)(.+?)(?=])","g"),n=(a=s==null?void 0:s.match(i))==null?void 0:a[0],o=n==null?void 0:n.split(",");if(o)return{operator:o[0],number:Number.isNaN(Number(o[1]))?o[1]:Number(o[1]),level:o[2],time:Number(o[3]),key:o[4]}}checkWeather(s,t,i={}){var m,v,k,Y,M,h,I,H,y,b,F,E,V,S,_;let n=0,o=0,a=0,e=0;const c=Math.round(((v=(m=t==null?void 0:t.SEVERE)==null?void 0:m.sigWave)==null?void 0:v.number)*1.6*100)/100,r=(Y=(k=t==null?void 0:t.SEVERE)==null?void 0:k.sigWave)==null?void 0:Y.number,d=(h=(M=t==null?void 0:t.HEAVY)==null?void 0:M.sigWave)==null?void 0:h.number,l=Math.round((((H=(I=t==null?void 0:t.SEVERE)==null?void 0:I.wind)==null?void 0:H.number)+2)*100)/100,p=(b=(y=t==null?void 0:t.SEVERE)==null?void 0:y.wind)==null?void 0:b.number,f=(E=(F=t==null?void 0:t.HEAVY)==null?void 0:F.wind)==null?void 0:E.number;for(let W=0;W<(s==null?void 0:s.length);W++){const T=s[W],C=(S=(V=T==null?void 0:T.meteo)==null?void 0:V.wave)==null?void 0:S.sig,N=(_=T==null?void 0:T.meteo)==null?void 0:_.wind,P=W?g(T.eta).diff(g(s[W-1].eta),"hour",!0):0;e=P>e?P:e,R==null||R.info("[%s] check sig.wave: %j",i.requestId,{...C,dgThd4Wv:c,svThd4Wv:r,hvThd4Wv:d}),(C==null?void 0:C.height)>=c?T.isDangerous=!0:(C==null?void 0:C.height)>=r?T.isSevere=!0:(C==null?void 0:C.height)>=d&&(T.isHeavy=!0),R==null||R.info("[%s] check wind: %j",i.requestId,{...N,dgThd4Wd:l,svThd4Wd:p,hvThd4Wd:f}),(N==null?void 0:N.scale)>=l?(T.isDangerous=!0,delete T.isSevere,delete T.isHeavy):(N==null?void 0:N.scale)>p?(T.isDangerous||(T.isSevere=!0),delete T.isHeavy):(N==null?void 0:N.scale)===f&&!T.isDangerous&&!T.isSevere&&(T.isHeavy=!0),n+=T.isDangerous?P:0,o+=T.isSevere?P:0,a+=T.isHeavy?P:0}return n=Math.round(n*100)/100,o=Math.round(o*100)/100,a=Math.round(a*100)/100,e=Math.round(e),{sample:s,dangerous:n,severe:o,heavy:a,step:e<3?3:e,wind:{dgThd4Wd:l,svThd4Wd:p,hvThd4Wd:f},sig:{dgThd4Wv:c,svThd4Wv:r,hvThd4Wv:d}}}}const ut=new U;let x;try{x=Z.getLogger("vessel")}catch{}finally{}var J=(j=>(j.common="common",j.container="container",j.tugs="tugs",j))(J||{}),Q=(j=>(j.Ballast="Ballast",j.Laden="Laden",j))(Q||{}),X=(j=>(j.Cp="CP",j.Perf="Basis",j.Instruct="Other",j))(X||{});class A{static blockCoefficient(s,t,i,n){let o=Math.round(s/(t*i*n)*100)/100;o=o<.55?.55:o>.85?.85:o;const a=[.55,.6,.65,.7,.75,.8,.85],e=a.map(c=>Math.abs(c-o));return a[e.indexOf(Math.min(...e))]}static froudeNumber(s,t,i=9.8){let n=Math.round(Math.sqrt(s*s/(i*t))*100)/100;return n=n<.05?.05:n>.3?.3:n,n}static amendFactor(s,t,i){const n={.55:[1.7,-1.4,-7.4],.6:[2.2,-2.5,-9.7],.65:[2.6,-3.7,-11.6],.7:[3.1,-5.3,-12.4],.75:[2.4,-10.6,-9.5],.8:[2.6,-13.1,-15.1],.85:[3.1,-18.7,28]};let a={.55:[1.7,-1.4,-7.4],.6:[2.2,-2.5,-9.7],.65:[2.6,-3.7,-11.6],.7:[3.1,-5.3,-12.4],.75:[2.6,-12.5,-13.5],.8:[3,-16.3,-21.6],.85:[3.4,-20.9,31.8]}[s];return i==="Laden"&&(a=n[s]),a[0]+a[1]*t+a[2]*Math.pow(t,2)}static directionFactor(s,t=0){let i;return s>30&&s<=60?i=(1.7-.03*Math.pow(t-4,2))/2:s>60&&s<=150?i=(.9-.06*Math.pow(t-6,2))/2:s>150&&s<=180?i=(.4-.03*Math.pow(t-8,2))/2:i=1,Math.round(i*1e5)/1e5}static vesselTagFactor(s,t,i,n=0){n=n>6?n-.9*(n-6):n;let o;return i==="container"?o=.7*n+Math.pow(n,6.5)/(22*Math.pow(s,2/3)):t==="Ballast"?o=.7*n+Math.pow(n,6.5)/(2.7*Math.pow(s,2/3)):o=.5*n+Math.pow(n,6.5)/(2.7*Math.pow(s,2/3)),o}static waveHeightFactor(s){return s=s<1.25?1.25:s,s=s>6?s-.9*(s-6):s,s=s>9?9:s,Math.round((-.144*Math.pow(s,2)+.178*s)*1e4)/1e4}static assembleProperties(s,t,i,n){var p;const o=s.lbp??s.length??s.lengthOverall??198.9642,a=s.draught??8,e=s.breadthMoulded??s.breadth??s.breadthExtreme??32.4572,c=s.deadweight??67035.7773,r=((p=s==null?void 0:s.type)==null?void 0:p.toLowerCase())||"common";return{tag:r.indexOf("container")>-1?"container":r.indexOf("tugs")>-1?"tugs":"common",lbp:o,loadCondition:t,draught:a,breadthMoulded:e,displacement:Math.round((c/1.025+a*e*o*.7)*1e4)/1e4,speed:Math.round((i??14.1382)*1852/3600*1e4)/1e4,bearing:n||90}}static async speedLoseAt(s,t,i,n="",o=2,a=!0,e=!1,c={}){let r;if(t.velocity&&e&&(s.speed=O.LngLatHelper.roundPrecision(t.velocity*1852/3600,6)),a){const d=await ot.MeteoHelper.queryPointFactor(t.lng,t.lat,i.valueOf(),"wind,wave,current,watertemp",n,c),l=A.weatherFactor(s,d),p=A.currentFactor(s.bearing,d==null?void 0:d.current,o),f=Math.round((s.speed*1.943844+l+p)*100)/100;r={meteo:{...d},wxFactor:l,cFactor:p,speed:t.velocity&&e?t.velocity:f<0?1:f,eta:i.utc().format("YYYY-MM-DDTHH:mm[Z]"),etd:i.utc().format("YYYY-MM-DDTHH:mm[Z]")}}else r={wxFactor:0,cFactor:0,speed:t.velocity&&e?t.velocity:Math.round((s.speed*1.943844+0+0)*100)/100,eta:i.utc().format("YYYY-MM-DDTHH:mm[Z]"),etd:i.utc().format("YYYY-MM-DDTHH:mm[Z]")};return delete t.meteo,delete t.wxFactor,delete t.cFactor,delete t.speed,delete t.etd,{...r,...t}}static async speedLoseInHoursStep(s,t,i,n,o,a,e="",c=!0,r=!1,d={}){t.utc();const l=[],p=[];let f=0,m=0,v,k;for(let Y=0;Y<a.length-1;Y++){let M=a[Y];M.distanceFromStart=o+m;const h=a[Y+1];if(s.bearing=O.LaneHelper.calculateBearing(M,h,!h.gcToPrevious),M.bearing=s.bearing,M.suspend&&r){M.eta=M.eta||t.format("YYYY-MM-DDTHH:mm[Z]"),M.elapsed=M.elapsed??0;const y=M.suspend-M.elapsed;if(n-f>y)n=n-f-y,t.add(y,"hour"),M.elapsed=M.suspend;else{const b=n-f;M.elapsed+=b,t.add(b,"hour"),n=0}if(x==null||x.info(`[%s] suspend ${M.elapsed} hours at %j, and remain ${n} hours need to go...`,d.requestId,M),n===0)return M.distanceFromPrevious=m,{etd:t,from:k||M,to:M,next:a.filter(b=>b),wps:l,days:p}}M=await A.speedLoseAt(s,M,t,e,0,c,r,d),k=k||M,M.important&&l.push(M),t.isSameOrAfter(i)&&(p.push(M),i.add(24,"hour"));const I=O.LaneHelper.calculateDistance(M,h,!h.gcToPrevious);let H=Math.ceil(I/k.speed*1e4)/1e4;if(f+H<n){if(f+=H,t.add(H,"hour"),delete a[Y],x==null||x.info(`[%s] go to %j from %j with ${I}nm, and cost ${H} hours`,d.requestId,{lat:h.lat,lng:h.lng},{lat:k.lat,lng:k.lng,etd:k.etd}),m+=I,a.filter(y=>y).length<=1){v=h,v.eta=t.format("YYYY-MM-DDTHH:mm[Z]"),v.distanceFromPrevious=I,v.distanceFromStart=o+m,l.push(v),delete a[Y+1];break}}else{H=n-f,t.add(H,"hour");const y=O.LngLatHelper.roundPrecision(k.speed*H,4);v=O.LaneHelper.calculateCoordinate(M,s.bearing,y,"nauticalmiles",!h.gcToPrevious),v.eta=t.format("YYYY-MM-DDTHH:mm[Z]"),a[Y]=v,x==null||x.info(`[%s] go to %j from %j with ${y}nm, and cost ${H} hours`,d.requestId,{lat:v.lat,lng:v.lng},{lat:M.lat,lng:M.lng,etd:M.etd}),m+=y,v.distanceFromPrevious=m,v.distanceFromStart=o+m;break}}return{etd:t,from:k,to:v,next:a.filter(Y=>Y),wps:l,days:p}}static currentFactor(s,t,i=0){const n=(s-(t==null?void 0:t.degree)||0)/180*Math.PI;if(Math.abs(n)===Math.PI/2)return 0;let o=((t==null?void 0:t.kts)||0)*Math.cos(n);return i&2?o=Math.ceil(o*100)/100:i&1?o=Math.floor(o*100)/100:o=Math.round(o*100)/100,Math.abs(o)>5?0:o}static weatherFactor(s,t){var l,p,f,m,v;x==null||x.debug("calculate weather factor via: %j",{...s,...t});const i=A.blockCoefficient(s.displacement,s.lbp,s.breadthMoulded,s.draught),n=A.froudeNumber(s.speed,s.lbp),o=A.amendFactor(i,n,s.loadCondition);let a=Math.abs(s.bearing%360-(((l=t==null?void 0:t.wind)==null?void 0:l.degree)%360||0));a=a>180?360-a:a;const e=A.directionFactor(a,(p=t==null?void 0:t.wind)==null?void 0:p.scale),c=A.vesselTagFactor(s.displacement,s.loadCondition,s.tag,(f=t==null?void 0:t.wind)==null?void 0:f.scale);let r=e*o*c/100*s.speed;r=Math.round(r*1.943844*1e4)/1e4*-1,s.tag==="tugs"&&Math.abs(r)>1&&(r=r/(Math.abs(Math.round(r))+1));const d=A.waveHeightFactor(((v=(m=t==null?void 0:t.wave)==null?void 0:m.sig)==null?void 0:v.height)??1);return r=r+d,x==null||x.debug("weather factor = %s",r),r=Math.abs(r)>5?5*(Math.abs(r)/r)+Math.abs(r)/r*(Math.abs(r)-5)*.4:r,Math.round(r*100)/100}static async analyseInstant(s,t,i,n,o,a="",e=0,c=!0,r=!1,d={}){var P,$,tt,et,st;const l=g().valueOf();s.lng=O.LngLatHelper.convertToStdLng(s.lng);const{route:p,waypoints:f}=o.points,m=O.LaneHelper.calculateSubRoute(s,p);if(((P=m[0])==null?void 0:P.length)<=1)return;const{v0:v,label:k}=s.sog?{v0:s.sog,label:"Other"}:{v0:n.speed,label:"CP"},Y=A.assembleProperties(i,n.loadCondition,v,0),M=f.length?O.LaneHelper.calculateSubWaypoints(s,f):[];M.forEach(q=>q.important=!0);const h={from:{...s},route:m,waypoints:M,v0:v,label:k},I={hours:[],days:[],wps:[]};e||(O.LaneHelper.calculateRouteDistance(m)/n.speed<=72?e=3:e=6);let H=O.LaneHelper.simplifyRouteToCoordinates(m,M,0),y=0,b=0,F=0,E=0;t=g(t).utc();const V=t.clone();for(;H.length>0;){const q=e-t.hour()%e,B=Math.ceil(t.clone().add(q,"h").set({minute:0,second:0,millisecond:0}).diff(t,"h",!0)*1e4)/1e4,L=await A.speedLoseInHoursStep(Y,t,V,B,y,H,a,c,r,d);($=L.from)!=null&&$.speed&&(I.hours.push(L.from),I.wps.push(...L.wps),I.days.push(...L.days)),H=L==null?void 0:L.next,H.length||I.hours.push(L==null?void 0:L.to),y+=((tt=L==null?void 0:L.to)==null?void 0:tt.distanceFromPrevious)??0}const S=I.hours;for(let q=0;q<S.length-1;q++){const B=g(S[q+1].eta).diff(S[q].etd,"hour",!0)||1;b+=(S[q].wxFactor||0)*B,F+=(S[q].cFactor||0)*B,E+=B}(et=I.wps)==null||et.forEach((q,B)=>{if(B){const L=I.wps[B-1],ht=q.distanceFromStart-L.distanceFromStart,at=g(q.eta).diff(g(L.etd),"h",!0);if(at<1)q.avgSpd=L.speed;else{q.avgSpd=Math.round(ht/at*100)/100;const nt=Math.round((L.speed+q.speed)/2*100)/100;q.avgSpd=q.avgSpd>nt?nt:q.avgSpd}}}),h.sample=I;const _=I.hours.at(0),W=I.hours.at(-1);h.distance=Math.round(W.distanceFromStart*1e4)/1e4,h.etd=g(_.eta).utc().format(),h.eta=g(W.eta).utc().format(),h.wxFactor=Math.round(b/E*1e4)/1e4,h.cFactor=Math.round(F/E*1e4)/1e4,h.avgSpeed=Math.round(W.distanceFromStart/E*1e4)/1e4,h.totalHrs=Math.round(E*1e4)/1e4,h.totalFoCons=Math.round((n==null?void 0:n.fo)/24*h.totalHrs*1e3)/1e3,h.totalDgoCons=Math.round((n==null?void 0:n.dgo)/24*h.totalHrs*1e3)/1e3;const C=g().valueOf()-l,N=((st=I==null?void 0:I.hours)==null?void 0:st.length)||1;return x==null||x.info("[%s] each hour-sample speed analyse cost: (%d / %d = %d) ms",d==null?void 0:d.requestId,C,N,Math.round(C/N*1e3)/1e3),h}static async analyseInstantWithThreshed(s,t,i,n,o,a,e,c="",r=3,d=!0,l=!1,p={}){var W,T,C;s.lng=O.LngLatHelper.convertToStdLng(s.lng);const{v0:f,label:m}=s.sog?{v0:s.sog,label:"Other"}:{v0:o.speed,label:"CP"},v=A.assembleProperties(n,o.loadCondition,f,0),k=O.LaneHelper.calculateSubRoute(s,a);if(((W=k[0])==null?void 0:W.length)<=1)return;const Y=e.length?O.LaneHelper.calculateSubWaypoints(s,e):[];Y.forEach(N=>N.important=!0);let M=O.LaneHelper.simplifyRouteToCoordinates(k,Y,0),h=0,I=0,H=0,y=0,b;const F={hours:[],wps:[],days:[]};for(t=g(t).utc();M.length>0;){const N=r-t.hour()%r;let P=Math.ceil(t.clone().add(N,"h").set({minute:0,second:0,millisecond:0}).diff(t,"h",!0)*1e4)/1e4;if(P=t.clone().add(P,"h").isAfter(i)?i.diff(t,"h",!0)*1e4/1e4:P,P)b=await A.speedLoseInHoursStep(v,t,i.clone(),P,h,M,c,d,l,p),(T=b.from)!=null&&T.speed&&(F.hours.push(b.from),b!=null&&b.wps&&F.wps.push(...b.wps),F.days.push(...b.days)),M=b==null?void 0:b.next,M.length||(F.hours.push(b==null?void 0:b.to),b!=null&&b.wps&&F.wps.push(...b.wps),F.days.push(b==null?void 0:b.to)),h+=((C=b==null?void 0:b.to)==null?void 0:C.distanceFromPrevious)??0;else{b&&(F.hours.push(b.to),b!=null&&b.wps&&F.wps.push(...b.wps),F.days.push(b.to));break}}const E=F.hours;for(let N=0;N<E.length-1;N++){const P=g(E[N+1].eta).diff(E[N].etd,"hour",!0);I+=E[N].wxFactor*P,H+=E[N].cFactor*P,y+=P}const V=F.hours.at(0),S=F.hours.at(-1);return{sample:F,distance:Math.round(((S==null?void 0:S.distanceFromStart)||0)*1e4)/1e4,etd:g(V.eta).utc().format(),eta:g(S==null?void 0:S.eta).utc().format(),wxFactor:Math.round(I/y*1e4)/1e4,cFactor:Math.round(H/y*1e4)/1e4,avgSpeed:Math.round(((S==null?void 0:S.distanceFromStart)||0)/y*1e4)/1e4,totalHrs:Math.round(y*1e4)/1e4,from:s,to:S,route:k,waypoints:Y,v0:f,label:m}}}w.AISImpl=z,w.AlertHelper=U,w.AlertLevel=G,w.HifleetImpl=rt,w.LoadCondition=Q,w.MyShipImpl=dt,w.MyVesselImpl=it,w.ShipxyImpl=ct,w.SpeedHelper=A,w.SpeedLabel=X,w.VesselTag=J,w.alertHelper=ut,Object.defineProperty(w,Symbol.toStringTag,{value:"Module"})});
|