@idm-plugin/vessel 1.4.6 → 1.4.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 +197 -189
- package/dist/index.umd.cjs +1 -1
- package/dist/speed/src/index.d.ts +2 -1
- package/package.json +4 -2
package/dist/index.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var Z = (I, s, t) => (
|
|
1
|
+
var st = Object.defineProperty;
|
|
2
|
+
var at = (I, s, t) => s in I ? st(I, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : I[s] = t;
|
|
3
|
+
var Z = (I, s, t) => (at(I, typeof s != "symbol" ? s + "" : s, t), t);
|
|
4
4
|
import A from "got";
|
|
5
5
|
import z from "@log4js-node/log4js-api";
|
|
6
6
|
import v from "moment";
|
|
7
7
|
import { LngLatHelper as B, LaneHelper as V } from "@idm-plugin/geo";
|
|
8
|
-
import { MeteoHelper as
|
|
9
|
-
|
|
8
|
+
import { MeteoHelper2 as ot, MeteoHelper as nt } from "@idm-plugin/meteo2";
|
|
9
|
+
import { Meteo2Assist as tt } from "@idm-plugin/meteo";
|
|
10
|
+
let h;
|
|
10
11
|
try {
|
|
11
|
-
|
|
12
|
+
h = z.getLogger("vessel");
|
|
12
13
|
} catch {
|
|
13
14
|
} finally {
|
|
14
15
|
}
|
|
@@ -53,7 +54,7 @@ class K {
|
|
|
53
54
|
return { labelCn: t, labelEn: i };
|
|
54
55
|
}
|
|
55
56
|
}
|
|
56
|
-
class
|
|
57
|
+
class bt extends K {
|
|
57
58
|
constructor(t, i) {
|
|
58
59
|
super();
|
|
59
60
|
Z(this, "clientId");
|
|
@@ -69,7 +70,7 @@ class pt extends K {
|
|
|
69
70
|
grant_type: "client_credentials"
|
|
70
71
|
}
|
|
71
72
|
}, n = await A.post(i, o).json();
|
|
72
|
-
|
|
73
|
+
h == null || h.info("[%s] fetch access token from: %s - %j", t.requestId, i, n), n.error || (this.token = {
|
|
73
74
|
accessToken: n.access_token,
|
|
74
75
|
tokenType: n.token_type,
|
|
75
76
|
expiresIn: n.expires_in,
|
|
@@ -79,21 +80,21 @@ class pt extends K {
|
|
|
79
80
|
});
|
|
80
81
|
}
|
|
81
82
|
async realTimePosition(t, i = {}) {
|
|
82
|
-
var d,
|
|
83
|
+
var d, f, M;
|
|
83
84
|
(!this.token || v().diff(v(this.token.issuedAt), "seconds") > ((d = this.token) == null ? void 0 : d.expiresIn) - 300) && await this.authToken(i);
|
|
84
85
|
const o = "https://svc.data.myvessel.cn/sdc/v1/vessels/status/location/unit", n = {
|
|
85
86
|
headers: {
|
|
86
|
-
Authorization: `${(
|
|
87
|
+
Authorization: `${(f = this.token) == null ? void 0 : f.tokenType} ${(M = this.token) == null ? void 0 : M.accessToken}`
|
|
87
88
|
},
|
|
88
89
|
searchParams: { mmsi: t }
|
|
89
90
|
};
|
|
90
|
-
|
|
91
|
+
h == null || h.info("[%s] fetch realtime position from: %s - %j", i.requestId, o, n);
|
|
91
92
|
const a = await A.get(o, n).json();
|
|
92
93
|
if (a.code)
|
|
93
|
-
return
|
|
94
|
+
return h == null || h.warn("[%s] fetch realtime position failed: %j", i.requestId, o, { message: a.message, status: a.status, code: a.code }), a;
|
|
94
95
|
const e = a.data;
|
|
95
|
-
for (const
|
|
96
|
-
!isNaN(e[
|
|
96
|
+
for (const m in e)
|
|
97
|
+
!isNaN(e[m]) && Number(e[m]) !== 1 / 0 && (e[m] = Number(e[m]));
|
|
97
98
|
const c = v(`${e.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
98
99
|
return {
|
|
99
100
|
mmsi: e.mmsi,
|
|
@@ -122,16 +123,16 @@ class pt extends K {
|
|
|
122
123
|
}
|
|
123
124
|
async trajectory(t, i, o, n, a = !0, e = {}) {
|
|
124
125
|
(!this.token || v().diff(v(this.token.issuedAt), "seconds") > this.token.expiresIn - 300) && await this.authToken(e);
|
|
125
|
-
const c = await this.realTimePosition(t, e), r = v(i), d = v(o),
|
|
126
|
+
const c = await this.realTimePosition(t, e), r = v(i), d = v(o), f = [];
|
|
126
127
|
for (; d.diff(r, "day", !0) > 30; )
|
|
127
|
-
await this.trajectoryIn30Day(t, r, r.clone().add(30, "day"), c, n,
|
|
128
|
-
return await this.trajectoryIn30Day(t, r, d, c, n,
|
|
128
|
+
await this.trajectoryIn30Day(t, r, r.clone().add(30, "day"), c, n, f, e), r.add(30, "day");
|
|
129
|
+
return await this.trajectoryIn30Day(t, r, d, c, n, f, e), f;
|
|
129
130
|
}
|
|
130
131
|
async trajectoryIn30Day(t, i, o, n, a, e, c = {}) {
|
|
131
|
-
var
|
|
132
|
+
var u, Y, j, b, p;
|
|
132
133
|
const r = "https://svc.data.myvessel.cn/sdc/v1/vessels/status/track", d = {
|
|
133
134
|
headers: {
|
|
134
|
-
Authorization: `${(
|
|
135
|
+
Authorization: `${(u = this.token) == null ? void 0 : u.tokenType} ${(Y = this.token) == null ? void 0 : Y.accessToken}`
|
|
135
136
|
},
|
|
136
137
|
json: {
|
|
137
138
|
mmsi: t,
|
|
@@ -139,39 +140,39 @@ class pt extends K {
|
|
|
139
140
|
endTime: o.utcOffset(8).format("YYYY-MM-DD HH:mm:ss")
|
|
140
141
|
}
|
|
141
142
|
};
|
|
142
|
-
|
|
143
|
-
const
|
|
144
|
-
if (
|
|
145
|
-
return
|
|
143
|
+
h == null || h.info("[%s] fetch trajectory from: %s - %j", c.requestId, r, d);
|
|
144
|
+
const f = await A.post(r, d).json();
|
|
145
|
+
if (f.code)
|
|
146
|
+
return h == null || h.warn("[%s] fetch trajectory failed: %j", c.requestId, r, { message: f.message, status: f.status, code: f.code }), f;
|
|
146
147
|
let M = -1;
|
|
147
|
-
const
|
|
148
|
-
return (p =
|
|
149
|
-
for (const O in
|
|
150
|
-
!isNaN(
|
|
151
|
-
const k = v(`${
|
|
152
|
-
mmsi:
|
|
148
|
+
const m = v(`${(b = (j = f.data) == null ? void 0 : j[0]) == null ? void 0 : b.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
149
|
+
return (p = f.data) == null || p.forEach((l) => {
|
|
150
|
+
for (const O in l)
|
|
151
|
+
!isNaN(l[O]) && Number(l[O]) !== 1 / 0 && (l[O] = Number(l[O]));
|
|
152
|
+
const k = v(`${l.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00"), w = l.status, { labelCn: y, labelEn: g } = this.parseStatus(w), H = {
|
|
153
|
+
mmsi: l.mmsi,
|
|
153
154
|
imo: n == null ? void 0 : n.imo,
|
|
154
|
-
lat:
|
|
155
|
-
lng:
|
|
156
|
-
sog:
|
|
157
|
-
cog:
|
|
158
|
-
hdg:
|
|
159
|
-
draught:
|
|
155
|
+
lat: l.lat,
|
|
156
|
+
lng: l.lon,
|
|
157
|
+
sog: l.sog,
|
|
158
|
+
cog: l.cog,
|
|
159
|
+
hdg: l.hdg,
|
|
160
|
+
draught: l.draught,
|
|
160
161
|
status: w,
|
|
161
|
-
eta: /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(
|
|
162
|
-
destination:
|
|
162
|
+
eta: /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(l.eta) ? v(`${l.eta} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00").utc().format() : void 0,
|
|
163
|
+
destination: l.dest,
|
|
163
164
|
positionTime: k.unix(),
|
|
164
165
|
labelCn: y,
|
|
165
166
|
labelEn: g,
|
|
166
167
|
method: "trajectory",
|
|
167
168
|
vendor: "myVessel",
|
|
168
169
|
utc: k.utc().format()
|
|
169
|
-
}, F = Math.floor(k.diff(
|
|
170
|
-
F !== M && (M = F, e.push(
|
|
170
|
+
}, F = Math.floor(k.diff(m, "minute", !0) / (a || 1));
|
|
171
|
+
F !== M && (M = F, e.push(H));
|
|
171
172
|
}), e;
|
|
172
173
|
}
|
|
173
174
|
}
|
|
174
|
-
class
|
|
175
|
+
class vt extends K {
|
|
175
176
|
constructor(t) {
|
|
176
177
|
super();
|
|
177
178
|
Z(this, "token");
|
|
@@ -184,14 +185,14 @@ class Mt extends K {
|
|
|
184
185
|
usertoken: this.token
|
|
185
186
|
}
|
|
186
187
|
}, a = await A.post(o, n).json();
|
|
187
|
-
|
|
188
|
+
h == null || h.info("[%s] fetch realtime position from: %s - %j", i.requestId, o, n);
|
|
188
189
|
const e = a == null ? void 0 : a.list;
|
|
189
190
|
if (!e)
|
|
190
|
-
return
|
|
191
|
-
for (const
|
|
192
|
-
!isNaN(e[
|
|
191
|
+
return h == null || h.warn("[%s] fetch realtime position failed: %j", i.requestId, o, a), a;
|
|
192
|
+
for (const m in e)
|
|
193
|
+
!isNaN(e[m]) && Number(e[m]) !== 1 / 0 && (e[m] = Number(e[m]));
|
|
193
194
|
e.status = e.sp > 3 ? 0 : 1;
|
|
194
|
-
const c = e.status, { labelCn: r, labelEn: d } = this.parseStatus(c),
|
|
195
|
+
const c = e.status, { labelCn: r, labelEn: d } = this.parseStatus(c), f = v(`${e.ti} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
195
196
|
return {
|
|
196
197
|
mmsi: e.m,
|
|
197
198
|
name: e.n,
|
|
@@ -208,8 +209,8 @@ class Mt extends K {
|
|
|
208
209
|
rot: isNaN(e.rot) ? 0 : e.rot,
|
|
209
210
|
eta: /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e.eta) ? v.utc(e.eta).format() : void 0,
|
|
210
211
|
destination: e.destination,
|
|
211
|
-
positionTime:
|
|
212
|
-
utc:
|
|
212
|
+
positionTime: f.unix(),
|
|
213
|
+
utc: f.utc().format(),
|
|
213
214
|
status: c,
|
|
214
215
|
labelCn: r,
|
|
215
216
|
labelEn: d,
|
|
@@ -230,7 +231,7 @@ class Mt extends K {
|
|
|
230
231
|
}
|
|
231
232
|
};
|
|
232
233
|
let a = await A.post(o, n).json();
|
|
233
|
-
|
|
234
|
+
h == null || h.info("[%s] fetch vessel props from: %s - %j", i.requestId, o, n), a instanceof Array && (a = a[0]);
|
|
234
235
|
for (const c in a)
|
|
235
236
|
!isNaN(a[c]) && Number(a[c]) !== 1 / 0 && (a[c] = Number(a[c]));
|
|
236
237
|
const e = {
|
|
@@ -242,16 +243,16 @@ class Mt extends K {
|
|
|
242
243
|
breadth: a.b,
|
|
243
244
|
draught: a.dr
|
|
244
245
|
};
|
|
245
|
-
return o = "https://www.hifleet.com/hifleetapi/sameShipSearch.do", a = await A.post(o, n).json(),
|
|
246
|
+
return o = "https://www.hifleet.com/hifleetapi/sameShipSearch.do", a = await A.post(o, n).json(), h == null || h.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
247
|
}
|
|
247
248
|
async trajectory(t, i, o, n, a = !0, e = {}) {
|
|
248
|
-
var
|
|
249
|
+
var l, k, w;
|
|
249
250
|
const c = await this.realTimePosition(t, e);
|
|
250
251
|
let r = v(i);
|
|
251
|
-
const d = v(o),
|
|
252
|
+
const d = v(o), f = v();
|
|
252
253
|
if (a) {
|
|
253
254
|
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 =
|
|
255
|
+
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 = f.diff(d, "d", !0), d.add(y > 10 ? 240 : y * 24, "h");
|
|
255
256
|
}
|
|
256
257
|
const M = {
|
|
257
258
|
searchParams: {
|
|
@@ -260,10 +261,10 @@ class Mt extends K {
|
|
|
260
261
|
mmsi: t,
|
|
261
262
|
usertoken: this.token
|
|
262
263
|
}
|
|
263
|
-
},
|
|
264
|
-
|
|
264
|
+
}, m = "https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token", u = await A.get(m, M).json();
|
|
265
|
+
h == null || h.info("[%s] fetch trajectory from: %s - %j", e.requestId, m, M);
|
|
265
266
|
let Y;
|
|
266
|
-
|
|
267
|
+
u && (Y = ((k = (l = u.ships) == null ? void 0 : l.offors) == null ? void 0 : k.ship) || [], Y.length || h == null || h.warn("[%s] fetch trajectory failed: %j", e.requestId, u));
|
|
267
268
|
const j = [];
|
|
268
269
|
let b = -1;
|
|
269
270
|
const p = v(`${(w = Y == null ? void 0 : Y[0]) == null ? void 0 : w.ti} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
@@ -272,7 +273,7 @@ class Mt extends K {
|
|
|
272
273
|
!isNaN(y[L]) && Number(y[L]) !== 1 / 0 && (y[L] = Number(y[L]));
|
|
273
274
|
const g = v(`${y.ti} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
|
|
274
275
|
y.status = y.sp > 4 ? 0 : 1;
|
|
275
|
-
const { labelEn:
|
|
276
|
+
const { labelEn: H, labelCn: F } = this.parseStatus(y.status), O = {
|
|
276
277
|
mmsi: y.m,
|
|
277
278
|
name: y.n,
|
|
278
279
|
imo: c == null ? void 0 : c.imo,
|
|
@@ -286,16 +287,16 @@ class Mt extends K {
|
|
|
286
287
|
utc: g.utc().format(),
|
|
287
288
|
status: y.status,
|
|
288
289
|
labelCn: F,
|
|
289
|
-
labelEn:
|
|
290
|
+
labelEn: H,
|
|
290
291
|
method: "trajectory",
|
|
291
292
|
vendor: "hifleet"
|
|
292
|
-
},
|
|
293
|
-
|
|
293
|
+
}, N = Math.floor(g.diff(p, "minute", !0) / (n || 1));
|
|
294
|
+
N !== b && (b = N, j.push(O));
|
|
294
295
|
}
|
|
295
296
|
return j;
|
|
296
297
|
}
|
|
297
298
|
}
|
|
298
|
-
class
|
|
299
|
+
class Yt extends K {
|
|
299
300
|
constructor(t) {
|
|
300
301
|
super();
|
|
301
302
|
Z(this, "token");
|
|
@@ -309,7 +310,7 @@ class yt extends K {
|
|
|
309
310
|
enc: 1
|
|
310
311
|
}
|
|
311
312
|
}, n = "https://api.shipxy.com/apicall/GetSingleShip", a = await A.get(n, o).json();
|
|
312
|
-
if (
|
|
313
|
+
if (h == null || h.info("[%s] fetch realtime position from: %s - %j", i.requestId, n, o), (a == null ? void 0 : a.status) !== 0)
|
|
313
314
|
return a;
|
|
314
315
|
const e = a.data[0];
|
|
315
316
|
for (const M in e)
|
|
@@ -340,7 +341,7 @@ class yt extends K {
|
|
|
340
341
|
}
|
|
341
342
|
async trajectory(t, i, o, n, a = !0, e = {}) {
|
|
342
343
|
var p;
|
|
343
|
-
const c = await this.realTimePosition(t, e), r = v(i), d = v(o),
|
|
344
|
+
const c = await this.realTimePosition(t, e), r = v(i), d = v(o), f = "https://api.shipxy.com/apicall/GetShipTrack", M = {
|
|
344
345
|
searchParams: {
|
|
345
346
|
id: t,
|
|
346
347
|
k: this.token,
|
|
@@ -349,19 +350,19 @@ class yt extends K {
|
|
|
349
350
|
btm: r.unix(),
|
|
350
351
|
etm: d.unix()
|
|
351
352
|
}
|
|
352
|
-
},
|
|
353
|
-
if (
|
|
354
|
-
return
|
|
355
|
-
const
|
|
353
|
+
}, m = await A.get(f, M).json();
|
|
354
|
+
if (h == null || h.info("[%s] fetch trajectory from: %s - %j", e.requestId, f, M), (m == null ? void 0 : m.status) !== 0)
|
|
355
|
+
return m;
|
|
356
|
+
const u = m == null ? void 0 : m.points, Y = [], j = v.unix((p = u[0]) == null ? void 0 : p.utc);
|
|
356
357
|
let b = -1;
|
|
357
|
-
for (const
|
|
358
|
-
const k = v.unix(
|
|
358
|
+
for (const l of u) {
|
|
359
|
+
const k = v.unix(l.utc), w = {
|
|
359
360
|
imo: c == null ? void 0 : c.imo,
|
|
360
361
|
mmsi: t,
|
|
361
|
-
sog: Math.round(
|
|
362
|
-
cog: Math.round(
|
|
363
|
-
lat: Math.round(
|
|
364
|
-
lng: Math.round(
|
|
362
|
+
sog: Math.round(l.sog * 3600 / 1e3 / 1852 * 100) / 100,
|
|
363
|
+
cog: Math.round(l.cog / 100 * 100) / 100,
|
|
364
|
+
lat: Math.round(l.lat / 1e6 * 1e5) / 1e5,
|
|
365
|
+
lng: Math.round(l.lon / 1e6 * 1e5) / 1e5,
|
|
365
366
|
positionTime: k.unix(),
|
|
366
367
|
utc: k.utc().format(),
|
|
367
368
|
method: "trajectory",
|
|
@@ -372,7 +373,7 @@ class yt extends K {
|
|
|
372
373
|
return Y;
|
|
373
374
|
}
|
|
374
375
|
}
|
|
375
|
-
class
|
|
376
|
+
class kt extends K {
|
|
376
377
|
constructor(t) {
|
|
377
378
|
super();
|
|
378
379
|
Z(this, "token");
|
|
@@ -387,7 +388,7 @@ class gt extends K {
|
|
|
387
388
|
mmsiList: t
|
|
388
389
|
}
|
|
389
390
|
}, n = "https://api3.myships.com/sp/ships/getShipIdByMMSI", a = await A.post(n, o).json();
|
|
390
|
-
return
|
|
391
|
+
return h == null || h.info("[%s] fetch ship id from: %s - %j", i.requestId, n, o), a.code !== "0" ? a : a.data[0].shipId;
|
|
391
392
|
}
|
|
392
393
|
async getShipInfo(t, i = {}) {
|
|
393
394
|
const o = {
|
|
@@ -398,11 +399,11 @@ class gt extends K {
|
|
|
398
399
|
shipId: t
|
|
399
400
|
}
|
|
400
401
|
}, n = "https://api3.myships.com/sp/ships/aissta", a = await A.post(n, o).json();
|
|
401
|
-
if (
|
|
402
|
+
if (h == null || h.info("[%s] fetch ship info from: %s - %j", i.requestId, n, o), a.code !== "0")
|
|
402
403
|
return a;
|
|
403
404
|
const e = a.data;
|
|
404
405
|
let c = e.imo;
|
|
405
|
-
return t === "407170" && (c = "9198379",
|
|
406
|
+
return t === "407170" && (c = "9198379", h == null || h.warn("[%s] ship(%s) imo error: %s, should be %s", i.requestId, t, e.imo, c)), {
|
|
406
407
|
mmsi: e.mmsi,
|
|
407
408
|
name: e.shipnameEn,
|
|
408
409
|
imo: c,
|
|
@@ -421,11 +422,11 @@ class gt extends K {
|
|
|
421
422
|
shipId: o
|
|
422
423
|
}
|
|
423
424
|
}, e = "https://api3.myships.com/sp/ships/position/latest", c = await A.post(e, a).json();
|
|
424
|
-
|
|
425
|
+
h == null || h.info("[%s] fetch realtime position from: %s - %j", i.requestId, e, a);
|
|
425
426
|
const r = c.data[0];
|
|
426
|
-
for (const
|
|
427
|
-
!isNaN(r[
|
|
428
|
-
const { labelCn: d, labelEn:
|
|
427
|
+
for (const u in r)
|
|
428
|
+
!isNaN(r[u]) && Number(r[u]) !== 1 / 0 && (r[u] = Number(r[u]));
|
|
429
|
+
const { labelCn: d, labelEn: f } = await this.parseStatus(r.aisNavStatus), M = v.unix(r.posTime);
|
|
429
430
|
return {
|
|
430
431
|
...n,
|
|
431
432
|
mmsi: t,
|
|
@@ -438,17 +439,17 @@ class gt extends K {
|
|
|
438
439
|
positionTime: r.posTime,
|
|
439
440
|
utc: M.utc().format(),
|
|
440
441
|
status: r.aisNavStatus,
|
|
441
|
-
labelEn:
|
|
442
|
+
labelEn: f,
|
|
442
443
|
labelCn: d,
|
|
443
444
|
method: "position",
|
|
444
445
|
vendor: "myship"
|
|
445
446
|
};
|
|
446
447
|
}
|
|
447
448
|
async trajectory(t, i, o, n, a = !0, e = {}) {
|
|
448
|
-
const c = v(i), r = v(o), d = await this.getShipId(t),
|
|
449
|
+
const c = v(i), r = v(o), d = await this.getShipId(t), f = await this.getShipInfo(d), M = [];
|
|
449
450
|
for (; r.diff(c, "day", !0) > 30; )
|
|
450
|
-
await this.trajectoryIn30Day(d, c.unix(), c.add(30, "day").unix(),
|
|
451
|
-
return await this.trajectoryIn30Day(d, c.unix(), r.unix(),
|
|
451
|
+
await this.trajectoryIn30Day(d, c.unix(), c.add(30, "day").unix(), f, t, n, M);
|
|
452
|
+
return await this.trajectoryIn30Day(d, c.unix(), r.unix(), f, t, n, M), M;
|
|
452
453
|
}
|
|
453
454
|
async trajectoryIn30Day(t, i, o, n, a, e, c, r = {}) {
|
|
454
455
|
var j;
|
|
@@ -461,16 +462,16 @@ class gt extends K {
|
|
|
461
462
|
startTime: i,
|
|
462
463
|
endTime: o
|
|
463
464
|
}
|
|
464
|
-
},
|
|
465
|
-
if (
|
|
466
|
-
return
|
|
467
|
-
const
|
|
468
|
-
for (const b in
|
|
469
|
-
!isNaN(
|
|
470
|
-
const
|
|
465
|
+
}, f = "https://api3.myships.com/sp/ships/position/history", M = await A.post(f, d).json();
|
|
466
|
+
if (h == null || h.info("[%s] fetch trajectory from: %s - %j", r.requestId, f, d), M.code !== "0")
|
|
467
|
+
return h == null || h.warn("[%s] invoke myship trajectory failed: %j", r.requestId, M), M;
|
|
468
|
+
const m = M.data;
|
|
469
|
+
for (const b in m)
|
|
470
|
+
!isNaN(m[b]) && Number(m[b]) !== 1 / 0 && (m[b] = Number(m[b]));
|
|
471
|
+
const u = v.unix((j = m[0]) == null ? void 0 : j.posTime);
|
|
471
472
|
let Y = -1;
|
|
472
|
-
for (const b of
|
|
473
|
-
const p = v.unix(b.posTime),
|
|
473
|
+
for (const b of m) {
|
|
474
|
+
const p = v.unix(b.posTime), l = {
|
|
474
475
|
imo: n == null ? void 0 : n.imo,
|
|
475
476
|
mmsi: a,
|
|
476
477
|
lat: Math.round(b.lat / 1e4 / 60 * 1e5) / 1e5,
|
|
@@ -483,8 +484,8 @@ class gt extends K {
|
|
|
483
484
|
utc: p.utc().format(),
|
|
484
485
|
method: "trajectory",
|
|
485
486
|
vendor: "myship"
|
|
486
|
-
}, k = Math.floor(p.diff(
|
|
487
|
-
k !== Y && (Y = k, c.push(
|
|
487
|
+
}, k = Math.floor(p.diff(u, "minute", !0) / (e || 1));
|
|
488
|
+
k !== Y && (Y = k, c.push(l));
|
|
488
489
|
}
|
|
489
490
|
return c;
|
|
490
491
|
}
|
|
@@ -495,8 +496,8 @@ try {
|
|
|
495
496
|
} catch {
|
|
496
497
|
} finally {
|
|
497
498
|
}
|
|
498
|
-
var
|
|
499
|
-
class
|
|
499
|
+
var it = /* @__PURE__ */ ((I) => (I.NOTICE = "NOTICE", I.WARN = "WARN", I.HEAVY = "HEAVY", I.SEVERE = "SEVERE", I.ERROR = "ERROR", I.FATAL = "FATAL", I))(it || {});
|
|
500
|
+
class rt {
|
|
500
501
|
/**
|
|
501
502
|
* 解析告警规则, 多规则场景
|
|
502
503
|
* @param rule
|
|
@@ -513,13 +514,13 @@ class nt {
|
|
|
513
514
|
return;
|
|
514
515
|
const a = {};
|
|
515
516
|
for (let d = 0; d < (n == null ? void 0 : n.length); d++) {
|
|
516
|
-
const
|
|
517
|
-
if (d === 0 && !
|
|
517
|
+
const f = (r = (c = n[d].match(i)) == null ? void 0 : c[0]) == null ? void 0 : r.split("],");
|
|
518
|
+
if (d === 0 && !f)
|
|
518
519
|
a.scope = n[0];
|
|
519
|
-
else if (
|
|
520
|
-
for (let M = 0,
|
|
521
|
-
const
|
|
522
|
-
|
|
520
|
+
else if (f)
|
|
521
|
+
for (let M = 0, m = f.length; M < m; M++) {
|
|
522
|
+
const u = this.parseRule(f[M]);
|
|
523
|
+
u && (a[u.level] ? u.key ? a[u.level][u == null ? void 0 : u.key] = u : a[u.level] = u : u.key ? a[u.level] = { [u == null ? void 0 : u.key]: u } : a[u.level] = u);
|
|
523
524
|
}
|
|
524
525
|
}
|
|
525
526
|
return a;
|
|
@@ -550,24 +551,25 @@ class nt {
|
|
|
550
551
|
* @param options
|
|
551
552
|
*/
|
|
552
553
|
checkWeather(s, t, i = {}) {
|
|
553
|
-
var
|
|
554
|
+
var u, Y, j, b, p, l, k, w, y, g, H, F, O, N, L;
|
|
554
555
|
let o = 0, n = 0, a = 0, e = 0;
|
|
555
|
-
const c = Math.round(((Y = (
|
|
556
|
+
const c = Math.round(((Y = (u = t == null ? void 0 : t.SEVERE) == null ? void 0 : u.sigWave) == null ? void 0 : Y.number) * 1.6 * 100) / 100, r = (b = (j = t == null ? void 0 : t.SEVERE) == null ? void 0 : j.sigWave) == null ? void 0 : b.number, d = (l = (p = t == null ? void 0 : t.HEAVY) == null ? void 0 : p.sigWave) == null ? void 0 : l.number, f = Math.round((((w = (k = t == null ? void 0 : t.SEVERE) == null ? void 0 : k.wind) == null ? void 0 : w.number) + 2) * 100) / 100, M = (g = (y = t == null ? void 0 : t.SEVERE) == null ? void 0 : y.wind) == null ? void 0 : g.number, m = (F = (H = t == null ? void 0 : t.HEAVY) == null ? void 0 : H.wind) == null ? void 0 : F.number;
|
|
556
557
|
for (let W = 0; W < (s == null ? void 0 : s.length); W++) {
|
|
557
|
-
const T = s[W], P = (
|
|
558
|
-
e = E > e ? E : e, R == null || R.info("[%s] check sig.wave: %j", i.requestId, { ...P, dgThd4Wv: c, svThd4Wv: r, hvThd4Wv: d }), (P == null ? void 0 : P.height) >= c ? T.isDangerous = !0 : (P == null ? void 0 : P.height) >= r ? T.isSevere = !0 : (P == null ? void 0 : P.height) >= d && (T.isHeavy = !0), R == null || R.info("[%s] check wind: %j", i.requestId, { ...D, dgThd4Wd:
|
|
558
|
+
const T = s[W], P = (N = (O = T == null ? void 0 : T.meteo) == null ? void 0 : O.wave) == null ? void 0 : N.sig, D = (L = T == null ? void 0 : T.meteo) == null ? void 0 : L.wind, E = W ? v(T.eta).diff(v(s[W - 1].eta), "hour", !0) : 0;
|
|
559
|
+
e = E > e ? E : e, R == null || R.info("[%s] check sig.wave: %j", i.requestId, { ...P, dgThd4Wv: c, svThd4Wv: r, hvThd4Wv: d }), (P == null ? void 0 : P.height) >= c ? T.isDangerous = !0 : (P == null ? void 0 : P.height) >= r ? T.isSevere = !0 : (P == null ? void 0 : P.height) >= d && (T.isHeavy = !0), R == null || R.info("[%s] check wind: %j", i.requestId, { ...D, dgThd4Wd: f, svThd4Wd: M, hvThd4Wd: m }), (D == null ? void 0 : D.scale) >= f ? (T.isDangerous = !0, delete T.isSevere, delete T.isHeavy) : (D == null ? void 0 : D.scale) > M ? (T.isDangerous || (T.isSevere = !0), delete T.isHeavy) : (D == null ? void 0 : D.scale) === m && !T.isDangerous && !T.isSevere && (T.isHeavy = !0), o += T.isDangerous ? E : 0, n += T.isSevere ? E : 0, a += T.isHeavy ? E : 0;
|
|
559
560
|
}
|
|
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:
|
|
561
|
+
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: f, svThd4Wd: M, hvThd4Wd: m }, sig: { dgThd4Wv: c, svThd4Wv: r, hvThd4Wv: d } };
|
|
561
562
|
}
|
|
562
563
|
}
|
|
563
|
-
const
|
|
564
|
+
const It = new rt();
|
|
564
565
|
let S;
|
|
565
566
|
try {
|
|
566
567
|
S = z.getLogger("vessel");
|
|
567
568
|
} catch {
|
|
568
569
|
} finally {
|
|
569
570
|
}
|
|
570
|
-
|
|
571
|
+
const ct = new ot("", !0);
|
|
572
|
+
var dt = /* @__PURE__ */ ((I) => (I.common = "common", I.container = "container", I.tugs = "tugs", I))(dt || {}), ut = /* @__PURE__ */ ((I) => (I.Ballast = "Ballast", I.Laden = "Laden", I))(ut || {}), ht = /* @__PURE__ */ ((I) => (I.Cp = "CP", I.Perf = "Basis", I.Instruct = "Other", I))(ht || {});
|
|
571
573
|
class C {
|
|
572
574
|
/**
|
|
573
575
|
* @see https://baike.baidu.com/item/%E6%96%B9%E5%BD%A2%E7%B3%BB%E6%95%B0/4965568?fr=aladdin
|
|
@@ -709,12 +711,18 @@ class C {
|
|
|
709
711
|
static async speedLoseAt(s, t, i, o = "", n = 2, a = !0, e = !1, c = {}) {
|
|
710
712
|
let r;
|
|
711
713
|
if (t.velocity && e && (s.speed = B.roundPrecision(t.velocity * 1852 / 3600, 6)), a) {
|
|
712
|
-
|
|
714
|
+
let d;
|
|
715
|
+
if (c.meteo2) {
|
|
716
|
+
const u = await ct.spotForecast(t.lat, t.lng, i.utc().format(), !1, !1, !0, c), [Y] = tt.pickHourly(u, i);
|
|
717
|
+
d = tt.toLegacy(Y);
|
|
718
|
+
} else
|
|
719
|
+
d = await nt.queryPointFactor(t.lng, t.lat, i.valueOf(), "wind,wave,current,watertemp", o, c);
|
|
720
|
+
const f = C.weatherFactor(s, d), M = C.currentFactor(s.bearing, d == null ? void 0 : d.current, n), m = Math.round((s.speed * 1.943844 + f + M) * 100) / 100;
|
|
713
721
|
r = {
|
|
714
722
|
meteo: { ...d },
|
|
715
|
-
wxFactor:
|
|
723
|
+
wxFactor: f,
|
|
716
724
|
cFactor: M,
|
|
717
|
-
speed: t.velocity && e ? t.velocity :
|
|
725
|
+
speed: t.velocity && e ? t.velocity : m < 0 ? 1 : m,
|
|
718
726
|
eta: i.utc().format("YYYY-MM-DDTHH:mm[Z]"),
|
|
719
727
|
etd: i.utc().format("YYYY-MM-DDTHH:mm[Z]")
|
|
720
728
|
};
|
|
@@ -743,51 +751,51 @@ class C {
|
|
|
743
751
|
*/
|
|
744
752
|
static async speedLoseInHoursStep(s, t, i, o, n, a, e = "", c = !0, r = !1, d = {}) {
|
|
745
753
|
t.utc();
|
|
746
|
-
const
|
|
747
|
-
let
|
|
754
|
+
const f = [], M = [];
|
|
755
|
+
let m = 0, u = 0, Y, j;
|
|
748
756
|
for (let b = 0; b < a.length - 1; b++) {
|
|
749
757
|
let p = a[b];
|
|
750
|
-
p.distanceFromStart = n +
|
|
751
|
-
const
|
|
752
|
-
if (s.bearing = V.calculateBearing(p,
|
|
758
|
+
p.distanceFromStart = n + u;
|
|
759
|
+
const l = a[b + 1];
|
|
760
|
+
if (s.bearing = V.calculateBearing(p, l, !l.gcToPrevious), p.bearing = s.bearing, p.suspend && r) {
|
|
753
761
|
p.eta = p.eta || t.format("YYYY-MM-DDTHH:mm[Z]"), p.elapsed = p.elapsed ?? 0;
|
|
754
762
|
const y = p.suspend - p.elapsed;
|
|
755
|
-
if (o -
|
|
756
|
-
o = o -
|
|
763
|
+
if (o - m > y)
|
|
764
|
+
o = o - m - y, t.add(y, "hour"), p.elapsed = p.suspend;
|
|
757
765
|
else {
|
|
758
|
-
const g = o -
|
|
766
|
+
const g = o - m;
|
|
759
767
|
p.elapsed += g, t.add(g, "hour"), o = 0;
|
|
760
768
|
}
|
|
761
769
|
if (S == null || S.info(`[%s] suspend ${p.elapsed} hours at %j, and remain ${o} hours need to go...`, d.requestId, p), o === 0)
|
|
762
|
-
return p.distanceFromPrevious =
|
|
770
|
+
return p.distanceFromPrevious = u, { etd: t, from: j || p, to: p, next: a.filter((g) => g), wps: f, days: M };
|
|
763
771
|
} else
|
|
764
772
|
p.suspend = 0;
|
|
765
|
-
p = await C.speedLoseAt(s, p, t, e, 0, c, r, d), j = j || p, p.important &&
|
|
766
|
-
const k = V.calculateDistance(p,
|
|
773
|
+
p = await C.speedLoseAt(s, p, t, e, 0, c, r, d), j = j || p, p.important && f.push(p), t.isSameOrAfter(i) && (M.push(p), i.add(24, "hour"));
|
|
774
|
+
const k = V.calculateDistance(p, l, !l.gcToPrevious);
|
|
767
775
|
let w = Math.ceil(k / j.speed * 1e4) / 1e4;
|
|
768
|
-
if (
|
|
769
|
-
if (
|
|
776
|
+
if (m + w < o) {
|
|
777
|
+
if (m += w, t.add(w, "hour"), delete a[b], S == null || S.info(
|
|
770
778
|
`[%s] go to %j from %j with ${k}nm, and cost ${w} hours`,
|
|
771
779
|
d.requestId,
|
|
772
|
-
{ lat:
|
|
780
|
+
{ lat: l.lat, lng: l.lng },
|
|
773
781
|
{ lat: j.lat, lng: j.lng, etd: j.etd }
|
|
774
|
-
),
|
|
775
|
-
Y =
|
|
782
|
+
), u += k, a.filter((y) => y).length <= 1) {
|
|
783
|
+
Y = l, Y.eta = t.format("YYYY-MM-DDTHH:mm[Z]"), Y.distanceFromPrevious = k, Y.distanceFromStart = n + u, f.push(Y), delete a[b + 1];
|
|
776
784
|
break;
|
|
777
785
|
}
|
|
778
786
|
} else {
|
|
779
|
-
w = o -
|
|
787
|
+
w = o - m, t.add(w, "hour");
|
|
780
788
|
const y = B.roundPrecision(j.speed * w, 4);
|
|
781
|
-
Y = V.calculateCoordinate(p, s.bearing, y, "nauticalmiles", !
|
|
789
|
+
Y = V.calculateCoordinate(p, s.bearing, y, "nauticalmiles", !l.gcToPrevious), Y.eta = t.format("YYYY-MM-DDTHH:mm[Z]"), a[b] = Y, S == null || S.info(
|
|
782
790
|
`[%s] go to %j from %j with ${y}nm, and cost ${w} hours`,
|
|
783
791
|
d.requestId,
|
|
784
792
|
{ lat: Y.lat, lng: Y.lng },
|
|
785
793
|
{ lat: p.lat, lng: p.lng, etd: p.etd }
|
|
786
|
-
),
|
|
794
|
+
), u += y, Y.distanceFromPrevious = u, Y.distanceFromStart = n + u;
|
|
787
795
|
break;
|
|
788
796
|
}
|
|
789
797
|
}
|
|
790
|
-
return { etd: t, from: j, to: Y, next: a.filter((b) => b), wps:
|
|
798
|
+
return { etd: t, from: j, to: Y, next: a.filter((b) => b), wps: f, days: M };
|
|
791
799
|
}
|
|
792
800
|
/**
|
|
793
801
|
* 洋流影响因子
|
|
@@ -808,14 +816,14 @@ class C {
|
|
|
808
816
|
* @param wwc 气象要素
|
|
809
817
|
*/
|
|
810
818
|
static weatherFactor(s, t) {
|
|
811
|
-
var
|
|
819
|
+
var f, M, m, u, Y, j, b;
|
|
812
820
|
S == null || S.debug("calculate weather factor via: %j", { ...s, ...t });
|
|
813
821
|
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);
|
|
814
|
-
let a = Math.abs(s.bearing % 360 - (((
|
|
822
|
+
let a = Math.abs(s.bearing % 360 - (((f = t == null ? void 0 : t.wind) == null ? void 0 : f.degree) % 360 || 0));
|
|
815
823
|
a = a > 180 ? 360 - a : a;
|
|
816
|
-
const e = C.directionFactor(a, (M = t == null ? void 0 : t.wind) == null ? void 0 : M.scale), c = C.vesselTagFactor(s.displacement, s.loadCondition, s.tag, (
|
|
824
|
+
const e = C.directionFactor(a, (M = t == null ? void 0 : t.wind) == null ? void 0 : M.scale), c = C.vesselTagFactor(s.displacement, s.loadCondition, s.tag, (m = t == null ? void 0 : t.wind) == null ? void 0 : m.scale);
|
|
817
825
|
let r = e * n * c / 100 * s.speed;
|
|
818
|
-
r = Math.round(r * 1.943844 * 1e4) / 1e4 * -1, s.tag === "tugs" && Math.abs(r) > 1 && (r = r / (Math.abs(Math.round(r)) + 1)), S == null || S.debug("wind wx factor = %d", r), a = Math.abs(s.bearing % 360 - (((Y = (
|
|
826
|
+
r = Math.round(r * 1.943844 * 1e4) / 1e4 * -1, s.tag === "tugs" && Math.abs(r) > 1 && (r = r / (Math.abs(Math.round(r)) + 1)), S == null || S.debug("wind wx factor = %d", r), a = Math.abs(s.bearing % 360 - (((Y = (u = t == null ? void 0 : t.wave) == null ? void 0 : u.sig) == null ? void 0 : Y.degree) % 360 || 0));
|
|
819
827
|
const d = C.waveHeightFactor(((b = (j = t == null ? void 0 : t.wave) == null ? void 0 : j.sig) == null ? void 0 : b.height) ?? 1, a);
|
|
820
828
|
return S == null || S.debug("wave wx factor = %d", d), r = r * 0.4 + d, S == null || S.debug("weather factor = %d", r), r = Math.abs(r) > 4 ? 4 * (Math.abs(r) / r) + Math.abs(r) / r * (Math.abs(r) - 4) * 0.1 : r, Math.round(r * 100) / 100;
|
|
821
829
|
}
|
|
@@ -833,10 +841,10 @@ class C {
|
|
|
833
841
|
*/
|
|
834
842
|
static async analyseInstant(s, t, i, o, n, a = "", e = 0, c = !0, r = !1, d = {}) {
|
|
835
843
|
var E, G, U, J, Q;
|
|
836
|
-
const
|
|
844
|
+
const f = v().valueOf();
|
|
837
845
|
s.lng = B.convertToStdLng(s.lng);
|
|
838
|
-
const { route: M, waypoints:
|
|
839
|
-
if (((E =
|
|
846
|
+
const { route: M, waypoints: m } = n.points, u = V.calculateSubRoute(s, M);
|
|
847
|
+
if (((E = u[0]) == null ? void 0 : E.length) <= 1)
|
|
840
848
|
return;
|
|
841
849
|
const { v0: Y, label: j } = s.sog ? {
|
|
842
850
|
v0: s.sog,
|
|
@@ -846,11 +854,11 @@ class C {
|
|
|
846
854
|
v0: o.speed,
|
|
847
855
|
label: "CP"
|
|
848
856
|
/* Cp */
|
|
849
|
-
}, b = C.assembleProperties(i, o.loadCondition, Y, 0), p =
|
|
850
|
-
p.forEach((
|
|
851
|
-
const
|
|
857
|
+
}, b = C.assembleProperties(i, o.loadCondition, Y, 0), p = m.length ? V.calculateSubWaypoints(s, m) : [];
|
|
858
|
+
p.forEach((x) => x.important = !0);
|
|
859
|
+
const l = {
|
|
852
860
|
from: { ...s },
|
|
853
|
-
route:
|
|
861
|
+
route: u,
|
|
854
862
|
waypoints: p,
|
|
855
863
|
v0: Y,
|
|
856
864
|
label: j
|
|
@@ -859,12 +867,12 @@ class C {
|
|
|
859
867
|
days: [],
|
|
860
868
|
wps: []
|
|
861
869
|
};
|
|
862
|
-
e || (V.calculateRouteDistance(
|
|
863
|
-
let w = V.simplifyRouteToCoordinates(
|
|
870
|
+
e || (V.calculateRouteDistance(u) / o.speed <= 72 ? e = 3 : e = 6);
|
|
871
|
+
let w = V.simplifyRouteToCoordinates(u, p, 0), y = 0, g = 0, H = 0, F = 0;
|
|
864
872
|
t = v(t).utc();
|
|
865
873
|
const O = t.clone();
|
|
866
874
|
for (; w.length > 0; ) {
|
|
867
|
-
const
|
|
875
|
+
const x = e - t.hour() % e, _ = Math.ceil(t.clone().add(x, "h").set({ minute: 0, second: 0, millisecond: 0 }).diff(t, "h", !0) * 1e4) / 1e4, q = await C.speedLoseInHoursStep(
|
|
868
876
|
b,
|
|
869
877
|
t,
|
|
870
878
|
O,
|
|
@@ -878,27 +886,27 @@ class C {
|
|
|
878
886
|
);
|
|
879
887
|
(G = q.from) != null && G.speed && (k.hours.push(q.from), k.wps.push(...q.wps), k.days.push(...q.days)), w = q == null ? void 0 : q.next, w.length || k.hours.push(q == null ? void 0 : q.to), y += ((U = q == null ? void 0 : q.to) == null ? void 0 : U.distanceFromPrevious) ?? 0;
|
|
880
888
|
}
|
|
881
|
-
const
|
|
882
|
-
for (let
|
|
883
|
-
const _ = v(x
|
|
884
|
-
g += (x
|
|
889
|
+
const N = k.hours;
|
|
890
|
+
for (let x = 0; x < N.length - 1; x++) {
|
|
891
|
+
const _ = v(N[x + 1].eta).diff(N[x].etd, "hour", !0) || 1;
|
|
892
|
+
g += (N[x].wxFactor || 0) * _, H += (N[x].cFactor || 0) * _, F += _;
|
|
885
893
|
}
|
|
886
|
-
(J = k.wps) == null || J.forEach((
|
|
894
|
+
(J = k.wps) == null || J.forEach((x, _) => {
|
|
887
895
|
if (_) {
|
|
888
|
-
const q = k.wps[_ - 1],
|
|
896
|
+
const q = k.wps[_ - 1], et = x.distanceFromStart - q.distanceFromStart, X = v(x.eta).diff(v(q.etd), "h", !0);
|
|
889
897
|
if (X < 1)
|
|
890
|
-
|
|
898
|
+
x.avgSpd = q.speed;
|
|
891
899
|
else {
|
|
892
|
-
|
|
893
|
-
const $ = Math.round((q.speed +
|
|
894
|
-
|
|
900
|
+
x.avgSpd = Math.round(et / X * 100) / 100;
|
|
901
|
+
const $ = Math.round((q.speed + x.speed) / 2 * 100) / 100;
|
|
902
|
+
x.avgSpd = x.avgSpd > $ ? $ : x.avgSpd;
|
|
895
903
|
}
|
|
896
904
|
}
|
|
897
|
-
}),
|
|
905
|
+
}), l.sample = k;
|
|
898
906
|
const L = k.hours.at(0), W = k.hours.at(-1);
|
|
899
|
-
|
|
900
|
-
const P = v().valueOf() -
|
|
901
|
-
return S == null || S.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),
|
|
907
|
+
l.distance = Math.round(W.distanceFromStart * 1e4) / 1e4, l.etd = v(L.eta).utc().format(), l.eta = v(W.eta).utc().format(), l.wxFactor = Math.round(g / F * 1e4) / 1e4, l.cFactor = Math.round(H / F * 1e4) / 1e4, l.avgSpeed = Math.round(W.distanceFromStart / F * 1e4) / 1e4, l.totalHrs = Math.round(F * 1e4) / 1e4, l.totalFoCons = Math.round((o == null ? void 0 : o.fo) / 24 * l.totalHrs * 1e3) / 1e3, l.totalDgoCons = Math.round((o == null ? void 0 : o.dgo) / 24 * l.totalHrs * 1e3) / 1e3;
|
|
908
|
+
const P = v().valueOf() - f, D = ((Q = k == null ? void 0 : k.hours) == null ? void 0 : Q.length) || 1;
|
|
909
|
+
return S == null || S.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), l;
|
|
902
910
|
}
|
|
903
911
|
/**
|
|
904
912
|
* 分段失速分析(最多走hours 小时)
|
|
@@ -913,10 +921,10 @@ class C {
|
|
|
913
921
|
* @param useMeteo true 启用气象分析
|
|
914
922
|
* @param useRouteParam
|
|
915
923
|
*/
|
|
916
|
-
static async analyseInstantWithThreshed(s, t, i, o, n, a, e, c = "", r = 3, d = !0,
|
|
924
|
+
static async analyseInstantWithThreshed(s, t, i, o, n, a, e, c = "", r = 3, d = !0, f = !1, M = {}) {
|
|
917
925
|
var W, T, P;
|
|
918
926
|
s.lng = B.convertToStdLng(s.lng);
|
|
919
|
-
const { v0:
|
|
927
|
+
const { v0: m, label: u } = s.sog ? {
|
|
920
928
|
v0: s.sog,
|
|
921
929
|
label: "Other"
|
|
922
930
|
/* Instruct */
|
|
@@ -924,13 +932,13 @@ class C {
|
|
|
924
932
|
v0: n.speed,
|
|
925
933
|
label: "CP"
|
|
926
934
|
/* Cp */
|
|
927
|
-
}, Y = C.assembleProperties(o, n.loadCondition,
|
|
935
|
+
}, Y = C.assembleProperties(o, n.loadCondition, m, 0), j = V.calculateSubRoute(s, a);
|
|
928
936
|
if (((W = j[0]) == null ? void 0 : W.length) <= 1)
|
|
929
937
|
return;
|
|
930
938
|
const b = e.length ? V.calculateSubWaypoints(s, e) : [];
|
|
931
939
|
b.forEach((D) => D.important = !0);
|
|
932
|
-
let p = V.simplifyRouteToCoordinates(j, b, 0),
|
|
933
|
-
const
|
|
940
|
+
let p = V.simplifyRouteToCoordinates(j, b, 0), l = 0, k = 0, w = 0, y = 0, g;
|
|
941
|
+
const H = {
|
|
934
942
|
hours: [],
|
|
935
943
|
wps: [],
|
|
936
944
|
days: []
|
|
@@ -944,54 +952,54 @@ class C {
|
|
|
944
952
|
t,
|
|
945
953
|
i.clone(),
|
|
946
954
|
E,
|
|
947
|
-
|
|
955
|
+
l,
|
|
948
956
|
p,
|
|
949
957
|
c,
|
|
950
958
|
d,
|
|
951
|
-
|
|
959
|
+
f,
|
|
952
960
|
M
|
|
953
|
-
), (T = g.from) != null && T.speed && (
|
|
961
|
+
), (T = g.from) != null && T.speed && (H.hours.push(g.from), g != null && g.wps && H.wps.push(...g.wps), H.days.push(...g.days)), p = g == null ? void 0 : g.next, p.length || (H.hours.push(g == null ? void 0 : g.to), g != null && g.wps && H.wps.push(...g.wps), H.days.push(g == null ? void 0 : g.to)), l += ((P = g == null ? void 0 : g.to) == null ? void 0 : P.distanceFromPrevious) ?? 0;
|
|
954
962
|
else {
|
|
955
|
-
g && (
|
|
963
|
+
g && (H.hours.push(g.to), g != null && g.wps && H.wps.push(...g.wps), H.days.push(g.to));
|
|
956
964
|
break;
|
|
957
965
|
}
|
|
958
966
|
}
|
|
959
|
-
const F =
|
|
967
|
+
const F = H.hours;
|
|
960
968
|
for (let D = 0; D < F.length - 1; D++) {
|
|
961
969
|
const E = v(F[D + 1].eta).diff(F[D].etd, "hour", !0);
|
|
962
970
|
k += F[D].wxFactor * E, w += F[D].cFactor * E, y += E;
|
|
963
971
|
}
|
|
964
|
-
const O =
|
|
972
|
+
const O = H.hours.at(0), N = H.hours.at(-1);
|
|
965
973
|
return {
|
|
966
|
-
sample:
|
|
967
|
-
distance: Math.round(((
|
|
974
|
+
sample: H,
|
|
975
|
+
distance: Math.round(((N == null ? void 0 : N.distanceFromStart) || 0) * 1e4) / 1e4,
|
|
968
976
|
// 注意,可能会在first节点Drift,所有采用eta做为初始出发时间
|
|
969
977
|
etd: v(O.eta).utc().format(),
|
|
970
|
-
eta: v(
|
|
978
|
+
eta: v(N == null ? void 0 : N.eta).utc().format(),
|
|
971
979
|
wxFactor: Math.round(k / y * 1e4) / 1e4,
|
|
972
980
|
cFactor: Math.round(w / y * 1e4) / 1e4,
|
|
973
|
-
avgSpeed: Math.round(((
|
|
981
|
+
avgSpeed: Math.round(((N == null ? void 0 : N.distanceFromStart) || 0) / y * 1e4) / 1e4,
|
|
974
982
|
totalHrs: Math.round(y * 1e4) / 1e4,
|
|
975
983
|
from: s,
|
|
976
|
-
to:
|
|
984
|
+
to: N,
|
|
977
985
|
route: j,
|
|
978
986
|
waypoints: b,
|
|
979
|
-
v0:
|
|
980
|
-
label:
|
|
987
|
+
v0: m,
|
|
988
|
+
label: u
|
|
981
989
|
};
|
|
982
990
|
}
|
|
983
991
|
}
|
|
984
992
|
export {
|
|
985
993
|
K as AISImpl,
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
994
|
+
rt as AlertHelper,
|
|
995
|
+
it as AlertLevel,
|
|
996
|
+
vt as HifleetImpl,
|
|
997
|
+
ut as LoadCondition,
|
|
998
|
+
kt as MyShipImpl,
|
|
999
|
+
bt as MyVesselImpl,
|
|
1000
|
+
Yt as ShipxyImpl,
|
|
993
1001
|
C as SpeedHelper,
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
1002
|
+
ht as SpeedLabel,
|
|
1003
|
+
dt as VesselTag,
|
|
1004
|
+
It as alertHelper
|
|
997
1005
|
};
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(w,T){typeof exports=="object"&&typeof module<"u"?T(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"],T):(w=typeof globalThis<"u"?globalThis:w||self,T(w["idm-plugin-rabbitmq"]={},w.got,w["@log4js-node/log4js-api"],w.moment,w["@idm-plugin/geo"],w["@idm-plugin/meteo"]))})(this,function(w,T,Z,v,O,ot){"use strict";var lt=Object.defineProperty;var ft=(w,T,Z)=>T in w?lt(w,T,{enumerable:!0,configurable:!0,writable:!0,value:Z}):w[T]=Z;var K=(w,T,Z)=>(ft(w,typeof T!="symbol"?T+"":T,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 T.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:v().utc().format()})}async realTimePosition(t,i={}){var d,l,M;(!this.token||v().diff(v(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} ${(M=this.token)==null?void 0:M.accessToken}`},searchParams:{mmsi:t}};u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,n,o);const a=await T.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=v(`${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:/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e.eta)?v.utc(e.eta).format():void 0,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||v().diff(v(this.token.issuedAt),"seconds")>this.token.expiresIn-300)&&await this.authToken(e);const c=await this.realTimePosition(t,e),r=v(i),d=v(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,I,j,g,p;const r="https://svc.data.myvessel.cn/sdc/v1/vessels/status/track",d={headers:{Authorization:`${(m=this.token)==null?void 0:m.tokenType} ${(I=this.token)==null?void 0:I.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 T.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 M=-1;const f=v(`${(g=(j=l.data)==null?void 0:j[0])==null?void 0:g.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return(p=l.data)==null||p.forEach(h=>{for(const W in h)!isNaN(h[W])&&Number(h[W])!==1/0&&(h[W]=Number(h[W]));const Y=v(`${h.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"),S=h.status,{labelCn:y,labelEn:b}=this.parseStatus(S),F={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:S,eta:/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(h.eta)?v(`${h.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00").utc().format():void 0,destination:h.dest,positionTime:Y.unix(),labelCn:y,labelEn:b,method:"trajectory",vendor:"myVessel",utc:Y.utc().format()},E=Math.floor(Y.diff(f,"minute",!0)/(a||1));E!==M&&(M=E,e.push(F))}),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 T.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=v(`${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)?v.utc(e.eta).format():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 T.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 T.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,Y,S;const c=await this.realTimePosition(t,e);let r=v(i);const d=v(n),l=v();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 M={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 T.get(f,M).json();u==null||u.info("[%s] fetch trajectory from: %s - %j",e.requestId,f,M);let I;m&&(I=((Y=(h=m.ships)==null?void 0:h.offors)==null?void 0:Y.ship)||[],I.length||u==null||u.warn("[%s] fetch trajectory failed: %j",e.requestId,m));const j=[];let g=-1;const p=v(`${(S=I==null?void 0:I[0])==null?void 0:S.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");for(const y of I){for(const _ in y)!isNaN(y[_])&&Number(y[_])!==1/0&&(y[_]=Number(y[_]));const b=v(`${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),W={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"},q=Math.floor(b.diff(p,"minute",!0)/(o||1));q!==g&&(g=q,j.push(W))}return j}}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 T.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 M in e)!isNaN(e[M])&&Number(e[M])!==1/0&&(e[M]=Number(e[M]));const{labelCn:c,labelEn:r}=await this.parseStatus(e.navistat),d=v.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 p;const c=await this.realTimePosition(t,e),r=v(i),d=v(n),l="https://api.shipxy.com/apicall/GetShipTrack",M={searchParams:{id:t,k:this.token,enc:1,cut:0,btm:r.unix(),etm:d.unix()}},f=await T.get(l,M).json();if(u==null||u.info("[%s] fetch trajectory from: %s - %j",e.requestId,l,M),(f==null?void 0:f.status)!==0)return f;const m=f==null?void 0:f.points,I=[],j=v.unix((p=m[0])==null?void 0:p.utc);let g=-1;for(const h of m){const Y=v.unix(h.utc),S={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:Y.unix(),utc:Y.utc().format(),method:"trajectory",vendor:"shipxy"},y=Math.floor(Y.diff(j,"minute",!0)/(o||1));y!==g&&(g=y,I.push(S))}return I}}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 T.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 T.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 T.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),M=v.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:M.utc().format(),status:r.aisNavStatus,labelEn:l,labelCn:d,method:"position",vendor:"myship"}}async trajectory(t,i,n,o,a=!0,e={}){const c=v(i),r=v(n),d=await this.getShipId(t),l=await this.getShipInfo(d),M=[];for(;r.diff(c,"day",!0)>30;)await this.trajectoryIn30Day(d,c.unix(),c.add(30,"day").unix(),l,t,o,M);return await this.trajectoryIn30Day(d,c.unix(),r.unix(),l,t,o,M),M}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",M=await T.post(l,d).json();if(u==null||u.info("[%s] fetch trajectory from: %s - %j",r.requestId,l,d),M.code!=="0")return u==null||u.warn("[%s] invoke myship trajectory failed: %j",r.requestId,M),M;const f=M.data;for(const g in f)!isNaN(f[g])&&Number(f[g])!==1/0&&(f[g]=Number(f[g]));const m=v.unix((j=f[0])==null?void 0:j.posTime);let I=-1;for(const g of f){const p=v.unix(g.posTime),h={imo:o==null?void 0:o.imo,mmsi:a,lat:Math.round(g.lat/1e4/60*1e5)/1e5,lng:Math.round(g.lon/1e4/60*1e5)/1e5,sog:Math.round(g.sog/10*100)/100,cog:Math.round(g.cog/10*100)/100,hdg:Math.round(g.heading*100)/100,rot:Math.round(g.rot*100)/100,positionTime:p.unix(),utc:p.utc().format(),method:"trajectory",vendor:"myship"},Y=Math.floor(p.diff(m,"minute",!0)/(e||1));Y!==I&&(I=Y,c.push(h))}return c}}let R;try{R=Z.getLogger("vessel")}catch{}finally{}var G=(k=>(k.NOTICE="NOTICE",k.WARN="WARN",k.HEAVY="HEAVY",k.SEVERE="SEVERE",k.ERROR="ERROR",k.FATAL="FATAL",k))(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 M=0,f=l.length;M<f;M++){const m=this.parseRule(l[M]);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,I,j,g,p,h,Y,S,y,b,F,E,W,q,_;let n=0,o=0,a=0,e=0;const c=Math.round(((I=(m=t==null?void 0:t.SEVERE)==null?void 0:m.sigWave)==null?void 0:I.number)*1.6*100)/100,r=(g=(j=t==null?void 0:t.SEVERE)==null?void 0:j.sigWave)==null?void 0:g.number,d=(h=(p=t==null?void 0:t.HEAVY)==null?void 0:p.sigWave)==null?void 0:h.number,l=Math.round((((S=(Y=t==null?void 0:t.SEVERE)==null?void 0:Y.wind)==null?void 0:S.number)+2)*100)/100,M=(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 V=0;V<(s==null?void 0:s.length);V++){const H=s[V],C=(q=(W=H==null?void 0:H.meteo)==null?void 0:W.wave)==null?void 0:q.sig,N=(_=H==null?void 0:H.meteo)==null?void 0:_.wind,P=V?v(H.eta).diff(v(s[V-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?H.isDangerous=!0:(C==null?void 0:C.height)>=r?H.isSevere=!0:(C==null?void 0:C.height)>=d&&(H.isHeavy=!0),R==null||R.info("[%s] check wind: %j",i.requestId,{...N,dgThd4Wd:l,svThd4Wd:M,hvThd4Wd:f}),(N==null?void 0:N.scale)>=l?(H.isDangerous=!0,delete H.isSevere,delete H.isHeavy):(N==null?void 0:N.scale)>M?(H.isDangerous||(H.isSevere=!0),delete H.isHeavy):(N==null?void 0:N.scale)===f&&!H.isDangerous&&!H.isSevere&&(H.isHeavy=!0),n+=H.isDangerous?P:0,o+=H.isSevere?P:0,a+=H.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:M,hvThd4Wd:f},sig:{dgThd4Wv:c,svThd4Wv:r,hvThd4Wv:d}}}}const ut=new U;let D;try{D=Z.getLogger("vessel")}catch{}finally{}var J=(k=>(k.common="common",k.container="container",k.tugs="tugs",k))(J||{}),Q=(k=>(k.Ballast="Ballast",k.Laden="Laden",k))(Q||{}),X=(k=>(k.Cp="CP",k.Perf="Basis",k.Instruct="Other",k))(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,t){s=s<0?.2:s,s=s>6?s-.9*(s-6):s,s=s>9?9:s;let i;return t>30&&t<=60?i=-.6:t>60&&t<=90?i=-.4:t>90&&t<=120?i=s<3?.4:-.3:t>120&&t<=150?i=s<3?.6:-.5:t>150&&t<=180?i=s<3?.7:-.6:i=-.7,Math.round(i*(.144*Math.pow(s,2)+.178*s)*1e4)/1e4}static assembleProperties(s,t,i,n){var M;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=((M=s==null?void 0:s.type)==null?void 0:M.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),M=A.currentFactor(s.bearing,d==null?void 0:d.current,o),f=Math.round((s.speed*1.943844+l+M)*100)/100;r={meteo:{...d},wxFactor:l,cFactor:M,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=[],M=[];let f=0,m=0,I,j;for(let g=0;g<a.length-1;g++){let p=a[g];p.distanceFromStart=o+m;const h=a[g+1];if(s.bearing=O.LaneHelper.calculateBearing(p,h,!h.gcToPrevious),p.bearing=s.bearing,p.suspend&&r){p.eta=p.eta||t.format("YYYY-MM-DDTHH:mm[Z]"),p.elapsed=p.elapsed??0;const y=p.suspend-p.elapsed;if(n-f>y)n=n-f-y,t.add(y,"hour"),p.elapsed=p.suspend;else{const b=n-f;p.elapsed+=b,t.add(b,"hour"),n=0}if(D==null||D.info(`[%s] suspend ${p.elapsed} hours at %j, and remain ${n} hours need to go...`,d.requestId,p),n===0)return p.distanceFromPrevious=m,{etd:t,from:j||p,to:p,next:a.filter(b=>b),wps:l,days:M}}else p.suspend=0;p=await A.speedLoseAt(s,p,t,e,0,c,r,d),j=j||p,p.important&&l.push(p),t.isSameOrAfter(i)&&(M.push(p),i.add(24,"hour"));const Y=O.LaneHelper.calculateDistance(p,h,!h.gcToPrevious);let S=Math.ceil(Y/j.speed*1e4)/1e4;if(f+S<n){if(f+=S,t.add(S,"hour"),delete a[g],D==null||D.info(`[%s] go to %j from %j with ${Y}nm, and cost ${S} hours`,d.requestId,{lat:h.lat,lng:h.lng},{lat:j.lat,lng:j.lng,etd:j.etd}),m+=Y,a.filter(y=>y).length<=1){I=h,I.eta=t.format("YYYY-MM-DDTHH:mm[Z]"),I.distanceFromPrevious=Y,I.distanceFromStart=o+m,l.push(I),delete a[g+1];break}}else{S=n-f,t.add(S,"hour");const y=O.LngLatHelper.roundPrecision(j.speed*S,4);I=O.LaneHelper.calculateCoordinate(p,s.bearing,y,"nauticalmiles",!h.gcToPrevious),I.eta=t.format("YYYY-MM-DDTHH:mm[Z]"),a[g]=I,D==null||D.info(`[%s] go to %j from %j with ${y}nm, and cost ${S} hours`,d.requestId,{lat:I.lat,lng:I.lng},{lat:p.lat,lng:p.lng,etd:p.etd}),m+=y,I.distanceFromPrevious=m,I.distanceFromStart=o+m;break}}return{etd:t,from:j,to:I,next:a.filter(g=>g),wps:l,days:M}}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,M,f,m,I,j,g;D==null||D.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,(M=t==null?void 0:t.wind)==null?void 0:M.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)),D==null||D.debug("wind wx factor = %d",r),a=Math.abs(s.bearing%360-(((I=(m=t==null?void 0:t.wave)==null?void 0:m.sig)==null?void 0:I.degree)%360||0));const d=A.waveHeightFactor(((g=(j=t==null?void 0:t.wave)==null?void 0:j.sig)==null?void 0:g.height)??1,a);return D==null||D.debug("wave wx factor = %d",d),r=r*.4+d,D==null||D.debug("weather factor = %d",r),r=Math.abs(r)>4?4*(Math.abs(r)/r)+Math.abs(r)/r*(Math.abs(r)-4)*.1: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=v().valueOf();s.lng=O.LngLatHelper.convertToStdLng(s.lng);const{route:M,waypoints:f}=o.points,m=O.LaneHelper.calculateSubRoute(s,M);if(((P=m[0])==null?void 0:P.length)<=1)return;const{v0:I,label:j}=s.sog?{v0:s.sog,label:"Other"}:{v0:n.speed,label:"CP"},g=A.assembleProperties(i,n.loadCondition,I,0),p=f.length?O.LaneHelper.calculateSubWaypoints(s,f):[];p.forEach(x=>x.important=!0);const h={from:{...s},route:m,waypoints:p,v0:I,label:j},Y={hours:[],days:[],wps:[]};e||(O.LaneHelper.calculateRouteDistance(m)/n.speed<=72?e=3:e=6);let S=O.LaneHelper.simplifyRouteToCoordinates(m,p,0),y=0,b=0,F=0,E=0;t=v(t).utc();const W=t.clone();for(;S.length>0;){const x=e-t.hour()%e,B=Math.ceil(t.clone().add(x,"h").set({minute:0,second:0,millisecond:0}).diff(t,"h",!0)*1e4)/1e4,L=await A.speedLoseInHoursStep(g,t,W,B,y,S,a,c,r,d);($=L.from)!=null&&$.speed&&(Y.hours.push(L.from),Y.wps.push(...L.wps),Y.days.push(...L.days)),S=L==null?void 0:L.next,S.length||Y.hours.push(L==null?void 0:L.to),y+=((tt=L==null?void 0:L.to)==null?void 0:tt.distanceFromPrevious)??0}const q=Y.hours;for(let x=0;x<q.length-1;x++){const B=v(q[x+1].eta).diff(q[x].etd,"hour",!0)||1;b+=(q[x].wxFactor||0)*B,F+=(q[x].cFactor||0)*B,E+=B}(et=Y.wps)==null||et.forEach((x,B)=>{if(B){const L=Y.wps[B-1],ht=x.distanceFromStart-L.distanceFromStart,at=v(x.eta).diff(v(L.etd),"h",!0);if(at<1)x.avgSpd=L.speed;else{x.avgSpd=Math.round(ht/at*100)/100;const nt=Math.round((L.speed+x.speed)/2*100)/100;x.avgSpd=x.avgSpd>nt?nt:x.avgSpd}}}),h.sample=Y;const _=Y.hours.at(0),V=Y.hours.at(-1);h.distance=Math.round(V.distanceFromStart*1e4)/1e4,h.etd=v(_.eta).utc().format(),h.eta=v(V.eta).utc().format(),h.wxFactor=Math.round(b/E*1e4)/1e4,h.cFactor=Math.round(F/E*1e4)/1e4,h.avgSpeed=Math.round(V.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=v().valueOf()-l,N=((st=Y==null?void 0:Y.hours)==null?void 0:st.length)||1;return D==null||D.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,M={}){var V,H,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"},I=A.assembleProperties(n,o.loadCondition,f,0),j=O.LaneHelper.calculateSubRoute(s,a);if(((V=j[0])==null?void 0:V.length)<=1)return;const g=e.length?O.LaneHelper.calculateSubWaypoints(s,e):[];g.forEach(N=>N.important=!0);let p=O.LaneHelper.simplifyRouteToCoordinates(j,g,0),h=0,Y=0,S=0,y=0,b;const F={hours:[],wps:[],days:[]};for(t=v(t).utc();p.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(I,t,i.clone(),P,h,p,c,d,l,M),(H=b.from)!=null&&H.speed&&(F.hours.push(b.from),b!=null&&b.wps&&F.wps.push(...b.wps),F.days.push(...b.days)),p=b==null?void 0:b.next,p.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=v(E[N+1].eta).diff(E[N].etd,"hour",!0);Y+=E[N].wxFactor*P,S+=E[N].cFactor*P,y+=P}const W=F.hours.at(0),q=F.hours.at(-1);return{sample:F,distance:Math.round(((q==null?void 0:q.distanceFromStart)||0)*1e4)/1e4,etd:v(W.eta).utc().format(),eta:v(q==null?void 0:q.eta).utc().format(),wxFactor:Math.round(Y/y*1e4)/1e4,cFactor:Math.round(S/y*1e4)/1e4,avgSpeed:Math.round(((q==null?void 0:q.distanceFromStart)||0)/y*1e4)/1e4,totalHrs:Math.round(y*1e4)/1e4,from:s,to:q,route:j,waypoints:g,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"})});
|
|
1
|
+
(function(w,T){typeof exports=="object"&&typeof module<"u"?T(exports,require("got"),require("@log4js-node/log4js-api"),require("moment"),require("@idm-plugin/geo"),require("@idm-plugin/meteo2"),require("@idm-plugin/meteo")):typeof define=="function"&&define.amd?define(["exports","got","@log4js-node/log4js-api","moment","@idm-plugin/geo","@idm-plugin/meteo2","@idm-plugin/meteo"],T):(w=typeof globalThis<"u"?globalThis:w||self,T(w["idm-plugin-rabbitmq"]={},w.got,w["@log4js-node/log4js-api"],w.moment,w["@idm-plugin/geo"],w["@idm-plugin/meteo2"],w["@idm-plugin/meteo"]))})(this,function(w,T,Z,v,O,G,U){"use strict";var mt=Object.defineProperty;var pt=(w,T,Z)=>T in w?mt(w,T,{enumerable:!0,configurable:!0,writable:!0,value:Z}):w[T]=Z;var K=(w,T,Z)=>(pt(w,typeof T!="symbol"?T+"":T,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 rt 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 T.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:v().utc().format()})}async realTimePosition(t,i={}){var d,f,M;(!this.token||v().diff(v(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:`${(f=this.token)==null?void 0:f.tokenType} ${(M=this.token)==null?void 0:M.accessToken}`},searchParams:{mmsi:t}};u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,n,o);const a=await T.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 m in e)!isNaN(e[m])&&Number(e[m])!==1/0&&(e[m]=Number(e[m]));const c=v(`${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:/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e.eta)?v.utc(e.eta).format():void 0,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||v().diff(v(this.token.issuedAt),"seconds")>this.token.expiresIn-300)&&await this.authToken(e);const c=await this.realTimePosition(t,e),r=v(i),d=v(n),f=[];for(;d.diff(r,"day",!0)>30;)await this.trajectoryIn30Day(t,r,r.clone().add(30,"day"),c,o,f,e),r.add(30,"day");return await this.trajectoryIn30Day(t,r,d,c,o,f,e),f}async trajectoryIn30Day(t,i,n,o,a,e,c={}){var h,I,j,b,p;const r="https://svc.data.myvessel.cn/sdc/v1/vessels/status/track",d={headers:{Authorization:`${(h=this.token)==null?void 0:h.tokenType} ${(I=this.token)==null?void 0:I.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 f=await T.post(r,d).json();if(f.code)return u==null||u.warn("[%s] fetch trajectory failed: %j",c.requestId,r,{message:f.message,status:f.status,code:f.code}),f;let M=-1;const m=v(`${(b=(j=f.data)==null?void 0:j[0])==null?void 0:b.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return(p=f.data)==null||p.forEach(l=>{for(const W in l)!isNaN(l[W])&&Number(l[W])!==1/0&&(l[W]=Number(l[W]));const Y=v(`${l.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"),H=l.status,{labelCn:y,labelEn:g}=this.parseStatus(H),F={mmsi:l.mmsi,imo:o==null?void 0:o.imo,lat:l.lat,lng:l.lon,sog:l.sog,cog:l.cog,hdg:l.hdg,draught:l.draught,status:H,eta:/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(l.eta)?v(`${l.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00").utc().format():void 0,destination:l.dest,positionTime:Y.unix(),labelCn:y,labelEn:g,method:"trajectory",vendor:"myVessel",utc:Y.utc().format()},E=Math.floor(Y.diff(m,"minute",!0)/(a||1));E!==M&&(M=E,e.push(F))}),e}}class ct 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 T.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 m in e)!isNaN(e[m])&&Number(e[m])!==1/0&&(e[m]=Number(e[m]));e.status=e.sp>3?0:1;const c=e.status,{labelCn:r,labelEn:d}=this.parseStatus(c),f=v(`${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)?v.utc(e.eta).format():void 0,destination:e.destination,positionTime:f.unix(),utc:f.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 T.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 T.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 l,Y,H;const c=await this.realTimePosition(t,e);let r=v(i);const d=v(n),f=v();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=f.diff(d,"d",!0),d.add(y>10?240:y*24,"h")}const M={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}},m="https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token",h=await T.get(m,M).json();u==null||u.info("[%s] fetch trajectory from: %s - %j",e.requestId,m,M);let I;h&&(I=((Y=(l=h.ships)==null?void 0:l.offors)==null?void 0:Y.ship)||[],I.length||u==null||u.warn("[%s] fetch trajectory failed: %j",e.requestId,h));const j=[];let b=-1;const p=v(`${(H=I==null?void 0:I[0])==null?void 0:H.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");for(const y of I){for(const _ in y)!isNaN(y[_])&&Number(y[_])!==1/0&&(y[_]=Number(y[_]));const g=v(`${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),W={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:g.unix(),utc:g.utc().format(),status:y.status,labelCn:E,labelEn:F,method:"trajectory",vendor:"hifleet"},q=Math.floor(g.diff(p,"minute",!0)/(o||1));q!==b&&(b=q,j.push(W))}return j}}class dt 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 T.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 M in e)!isNaN(e[M])&&Number(e[M])!==1/0&&(e[M]=Number(e[M]));const{labelCn:c,labelEn:r}=await this.parseStatus(e.navistat),d=v.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 p;const c=await this.realTimePosition(t,e),r=v(i),d=v(n),f="https://api.shipxy.com/apicall/GetShipTrack",M={searchParams:{id:t,k:this.token,enc:1,cut:0,btm:r.unix(),etm:d.unix()}},m=await T.get(f,M).json();if(u==null||u.info("[%s] fetch trajectory from: %s - %j",e.requestId,f,M),(m==null?void 0:m.status)!==0)return m;const h=m==null?void 0:m.points,I=[],j=v.unix((p=h[0])==null?void 0:p.utc);let b=-1;for(const l of h){const Y=v.unix(l.utc),H={imo:c==null?void 0:c.imo,mmsi:t,sog:Math.round(l.sog*3600/1e3/1852*100)/100,cog:Math.round(l.cog/100*100)/100,lat:Math.round(l.lat/1e6*1e5)/1e5,lng:Math.round(l.lon/1e6*1e5)/1e5,positionTime:Y.unix(),utc:Y.utc().format(),method:"trajectory",vendor:"shipxy"},y=Math.floor(Y.diff(j,"minute",!0)/(o||1));y!==b&&(b=y,I.push(H))}return I}}class ut 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 T.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 T.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 T.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 h in r)!isNaN(r[h])&&Number(r[h])!==1/0&&(r[h]=Number(r[h]));const{labelCn:d,labelEn:f}=await this.parseStatus(r.aisNavStatus),M=v.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:M.utc().format(),status:r.aisNavStatus,labelEn:f,labelCn:d,method:"position",vendor:"myship"}}async trajectory(t,i,n,o,a=!0,e={}){const c=v(i),r=v(n),d=await this.getShipId(t),f=await this.getShipInfo(d),M=[];for(;r.diff(c,"day",!0)>30;)await this.trajectoryIn30Day(d,c.unix(),c.add(30,"day").unix(),f,t,o,M);return await this.trajectoryIn30Day(d,c.unix(),r.unix(),f,t,o,M),M}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}},f="https://api3.myships.com/sp/ships/position/history",M=await T.post(f,d).json();if(u==null||u.info("[%s] fetch trajectory from: %s - %j",r.requestId,f,d),M.code!=="0")return u==null||u.warn("[%s] invoke myship trajectory failed: %j",r.requestId,M),M;const m=M.data;for(const b in m)!isNaN(m[b])&&Number(m[b])!==1/0&&(m[b]=Number(m[b]));const h=v.unix((j=m[0])==null?void 0:j.posTime);let I=-1;for(const b of m){const p=v.unix(b.posTime),l={imo:o==null?void 0:o.imo,mmsi:a,lat:Math.round(b.lat/1e4/60*1e5)/1e5,lng:Math.round(b.lon/1e4/60*1e5)/1e5,sog:Math.round(b.sog/10*100)/100,cog:Math.round(b.cog/10*100)/100,hdg:Math.round(b.heading*100)/100,rot:Math.round(b.rot*100)/100,positionTime:p.unix(),utc:p.utc().format(),method:"trajectory",vendor:"myship"},Y=Math.floor(p.diff(h,"minute",!0)/(e||1));Y!==I&&(I=Y,c.push(l))}return c}}let R;try{R=Z.getLogger("vessel")}catch{}finally{}var J=(k=>(k.NOTICE="NOTICE",k.WARN="WARN",k.HEAVY="HEAVY",k.SEVERE="SEVERE",k.ERROR="ERROR",k.FATAL="FATAL",k))(J||{});class Q{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 f=(r=(c=o[d].match(i))==null?void 0:c[0])==null?void 0:r.split("],");if(d===0&&!f)a.scope=o[0];else if(f)for(let M=0,m=f.length;M<m;M++){const h=this.parseRule(f[M]);h&&(a[h.level]?h.key?a[h.level][h==null?void 0:h.key]=h:a[h.level]=h:h.key?a[h.level]={[h==null?void 0:h.key]:h}:a[h.level]=h)}}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 h,I,j,b,p,l,Y,H,y,g,F,E,W,q,_;let n=0,o=0,a=0,e=0;const c=Math.round(((I=(h=t==null?void 0:t.SEVERE)==null?void 0:h.sigWave)==null?void 0:I.number)*1.6*100)/100,r=(b=(j=t==null?void 0:t.SEVERE)==null?void 0:j.sigWave)==null?void 0:b.number,d=(l=(p=t==null?void 0:t.HEAVY)==null?void 0:p.sigWave)==null?void 0:l.number,f=Math.round((((H=(Y=t==null?void 0:t.SEVERE)==null?void 0:Y.wind)==null?void 0:H.number)+2)*100)/100,M=(g=(y=t==null?void 0:t.SEVERE)==null?void 0:y.wind)==null?void 0:g.number,m=(E=(F=t==null?void 0:t.HEAVY)==null?void 0:F.wind)==null?void 0:E.number;for(let V=0;V<(s==null?void 0:s.length);V++){const S=s[V],C=(q=(W=S==null?void 0:S.meteo)==null?void 0:W.wave)==null?void 0:q.sig,N=(_=S==null?void 0:S.meteo)==null?void 0:_.wind,L=V?v(S.eta).diff(v(s[V-1].eta),"hour",!0):0;e=L>e?L: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?S.isDangerous=!0:(C==null?void 0:C.height)>=r?S.isSevere=!0:(C==null?void 0:C.height)>=d&&(S.isHeavy=!0),R==null||R.info("[%s] check wind: %j",i.requestId,{...N,dgThd4Wd:f,svThd4Wd:M,hvThd4Wd:m}),(N==null?void 0:N.scale)>=f?(S.isDangerous=!0,delete S.isSevere,delete S.isHeavy):(N==null?void 0:N.scale)>M?(S.isDangerous||(S.isSevere=!0),delete S.isHeavy):(N==null?void 0:N.scale)===m&&!S.isDangerous&&!S.isSevere&&(S.isHeavy=!0),n+=S.isDangerous?L:0,o+=S.isSevere?L:0,a+=S.isHeavy?L: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:f,svThd4Wd:M,hvThd4Wd:m},sig:{dgThd4Wv:c,svThd4Wv:r,hvThd4Wv:d}}}}const ht=new Q;let D;try{D=Z.getLogger("vessel")}catch{}finally{}const lt=new G.MeteoHelper2("",!0);var X=(k=>(k.common="common",k.container="container",k.tugs="tugs",k))(X||{}),$=(k=>(k.Ballast="Ballast",k.Laden="Laden",k))($||{}),tt=(k=>(k.Cp="CP",k.Perf="Basis",k.Instruct="Other",k))(tt||{});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,t){s=s<0?.2:s,s=s>6?s-.9*(s-6):s,s=s>9?9:s;let i;return t>30&&t<=60?i=-.6:t>60&&t<=90?i=-.4:t>90&&t<=120?i=s<3?.4:-.3:t>120&&t<=150?i=s<3?.6:-.5:t>150&&t<=180?i=s<3?.7:-.6:i=-.7,Math.round(i*(.144*Math.pow(s,2)+.178*s)*1e4)/1e4}static assembleProperties(s,t,i,n){var M;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=((M=s==null?void 0:s.type)==null?void 0:M.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){let d;if(c.meteo2){const h=await lt.spotForecast(t.lat,t.lng,i.utc().format(),!1,!1,!0,c),[I]=U.Meteo2Assist.pickHourly(h,i);d=U.Meteo2Assist.toLegacy(I)}else d=await G.MeteoHelper.queryPointFactor(t.lng,t.lat,i.valueOf(),"wind,wave,current,watertemp",n,c);const f=A.weatherFactor(s,d),M=A.currentFactor(s.bearing,d==null?void 0:d.current,o),m=Math.round((s.speed*1.943844+f+M)*100)/100;r={meteo:{...d},wxFactor:f,cFactor:M,speed:t.velocity&&e?t.velocity:m<0?1:m,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 f=[],M=[];let m=0,h=0,I,j;for(let b=0;b<a.length-1;b++){let p=a[b];p.distanceFromStart=o+h;const l=a[b+1];if(s.bearing=O.LaneHelper.calculateBearing(p,l,!l.gcToPrevious),p.bearing=s.bearing,p.suspend&&r){p.eta=p.eta||t.format("YYYY-MM-DDTHH:mm[Z]"),p.elapsed=p.elapsed??0;const y=p.suspend-p.elapsed;if(n-m>y)n=n-m-y,t.add(y,"hour"),p.elapsed=p.suspend;else{const g=n-m;p.elapsed+=g,t.add(g,"hour"),n=0}if(D==null||D.info(`[%s] suspend ${p.elapsed} hours at %j, and remain ${n} hours need to go...`,d.requestId,p),n===0)return p.distanceFromPrevious=h,{etd:t,from:j||p,to:p,next:a.filter(g=>g),wps:f,days:M}}else p.suspend=0;p=await A.speedLoseAt(s,p,t,e,0,c,r,d),j=j||p,p.important&&f.push(p),t.isSameOrAfter(i)&&(M.push(p),i.add(24,"hour"));const Y=O.LaneHelper.calculateDistance(p,l,!l.gcToPrevious);let H=Math.ceil(Y/j.speed*1e4)/1e4;if(m+H<n){if(m+=H,t.add(H,"hour"),delete a[b],D==null||D.info(`[%s] go to %j from %j with ${Y}nm, and cost ${H} hours`,d.requestId,{lat:l.lat,lng:l.lng},{lat:j.lat,lng:j.lng,etd:j.etd}),h+=Y,a.filter(y=>y).length<=1){I=l,I.eta=t.format("YYYY-MM-DDTHH:mm[Z]"),I.distanceFromPrevious=Y,I.distanceFromStart=o+h,f.push(I),delete a[b+1];break}}else{H=n-m,t.add(H,"hour");const y=O.LngLatHelper.roundPrecision(j.speed*H,4);I=O.LaneHelper.calculateCoordinate(p,s.bearing,y,"nauticalmiles",!l.gcToPrevious),I.eta=t.format("YYYY-MM-DDTHH:mm[Z]"),a[b]=I,D==null||D.info(`[%s] go to %j from %j with ${y}nm, and cost ${H} hours`,d.requestId,{lat:I.lat,lng:I.lng},{lat:p.lat,lng:p.lng,etd:p.etd}),h+=y,I.distanceFromPrevious=h,I.distanceFromStart=o+h;break}}return{etd:t,from:j,to:I,next:a.filter(b=>b),wps:f,days:M}}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 f,M,m,h,I,j,b;D==null||D.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-(((f=t==null?void 0:t.wind)==null?void 0:f.degree)%360||0));a=a>180?360-a:a;const e=A.directionFactor(a,(M=t==null?void 0:t.wind)==null?void 0:M.scale),c=A.vesselTagFactor(s.displacement,s.loadCondition,s.tag,(m=t==null?void 0:t.wind)==null?void 0:m.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)),D==null||D.debug("wind wx factor = %d",r),a=Math.abs(s.bearing%360-(((I=(h=t==null?void 0:t.wave)==null?void 0:h.sig)==null?void 0:I.degree)%360||0));const d=A.waveHeightFactor(((b=(j=t==null?void 0:t.wave)==null?void 0:j.sig)==null?void 0:b.height)??1,a);return D==null||D.debug("wave wx factor = %d",d),r=r*.4+d,D==null||D.debug("weather factor = %d",r),r=Math.abs(r)>4?4*(Math.abs(r)/r)+Math.abs(r)/r*(Math.abs(r)-4)*.1:r,Math.round(r*100)/100}static async analyseInstant(s,t,i,n,o,a="",e=0,c=!0,r=!1,d={}){var L,et,st,at,nt;const f=v().valueOf();s.lng=O.LngLatHelper.convertToStdLng(s.lng);const{route:M,waypoints:m}=o.points,h=O.LaneHelper.calculateSubRoute(s,M);if(((L=h[0])==null?void 0:L.length)<=1)return;const{v0:I,label:j}=s.sog?{v0:s.sog,label:"Other"}:{v0:n.speed,label:"CP"},b=A.assembleProperties(i,n.loadCondition,I,0),p=m.length?O.LaneHelper.calculateSubWaypoints(s,m):[];p.forEach(x=>x.important=!0);const l={from:{...s},route:h,waypoints:p,v0:I,label:j},Y={hours:[],days:[],wps:[]};e||(O.LaneHelper.calculateRouteDistance(h)/n.speed<=72?e=3:e=6);let H=O.LaneHelper.simplifyRouteToCoordinates(h,p,0),y=0,g=0,F=0,E=0;t=v(t).utc();const W=t.clone();for(;H.length>0;){const x=e-t.hour()%e,B=Math.ceil(t.clone().add(x,"h").set({minute:0,second:0,millisecond:0}).diff(t,"h",!0)*1e4)/1e4,P=await A.speedLoseInHoursStep(b,t,W,B,y,H,a,c,r,d);(et=P.from)!=null&&et.speed&&(Y.hours.push(P.from),Y.wps.push(...P.wps),Y.days.push(...P.days)),H=P==null?void 0:P.next,H.length||Y.hours.push(P==null?void 0:P.to),y+=((st=P==null?void 0:P.to)==null?void 0:st.distanceFromPrevious)??0}const q=Y.hours;for(let x=0;x<q.length-1;x++){const B=v(q[x+1].eta).diff(q[x].etd,"hour",!0)||1;g+=(q[x].wxFactor||0)*B,F+=(q[x].cFactor||0)*B,E+=B}(at=Y.wps)==null||at.forEach((x,B)=>{if(B){const P=Y.wps[B-1],ft=x.distanceFromStart-P.distanceFromStart,ot=v(x.eta).diff(v(P.etd),"h",!0);if(ot<1)x.avgSpd=P.speed;else{x.avgSpd=Math.round(ft/ot*100)/100;const it=Math.round((P.speed+x.speed)/2*100)/100;x.avgSpd=x.avgSpd>it?it:x.avgSpd}}}),l.sample=Y;const _=Y.hours.at(0),V=Y.hours.at(-1);l.distance=Math.round(V.distanceFromStart*1e4)/1e4,l.etd=v(_.eta).utc().format(),l.eta=v(V.eta).utc().format(),l.wxFactor=Math.round(g/E*1e4)/1e4,l.cFactor=Math.round(F/E*1e4)/1e4,l.avgSpeed=Math.round(V.distanceFromStart/E*1e4)/1e4,l.totalHrs=Math.round(E*1e4)/1e4,l.totalFoCons=Math.round((n==null?void 0:n.fo)/24*l.totalHrs*1e3)/1e3,l.totalDgoCons=Math.round((n==null?void 0:n.dgo)/24*l.totalHrs*1e3)/1e3;const C=v().valueOf()-f,N=((nt=Y==null?void 0:Y.hours)==null?void 0:nt.length)||1;return D==null||D.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),l}static async analyseInstantWithThreshed(s,t,i,n,o,a,e,c="",r=3,d=!0,f=!1,M={}){var V,S,C;s.lng=O.LngLatHelper.convertToStdLng(s.lng);const{v0:m,label:h}=s.sog?{v0:s.sog,label:"Other"}:{v0:o.speed,label:"CP"},I=A.assembleProperties(n,o.loadCondition,m,0),j=O.LaneHelper.calculateSubRoute(s,a);if(((V=j[0])==null?void 0:V.length)<=1)return;const b=e.length?O.LaneHelper.calculateSubWaypoints(s,e):[];b.forEach(N=>N.important=!0);let p=O.LaneHelper.simplifyRouteToCoordinates(j,b,0),l=0,Y=0,H=0,y=0,g;const F={hours:[],wps:[],days:[]};for(t=v(t).utc();p.length>0;){const N=r-t.hour()%r;let L=Math.ceil(t.clone().add(N,"h").set({minute:0,second:0,millisecond:0}).diff(t,"h",!0)*1e4)/1e4;if(L=t.clone().add(L,"h").isAfter(i)?i.diff(t,"h",!0)*1e4/1e4:L,L)g=await A.speedLoseInHoursStep(I,t,i.clone(),L,l,p,c,d,f,M),(S=g.from)!=null&&S.speed&&(F.hours.push(g.from),g!=null&&g.wps&&F.wps.push(...g.wps),F.days.push(...g.days)),p=g==null?void 0:g.next,p.length||(F.hours.push(g==null?void 0:g.to),g!=null&&g.wps&&F.wps.push(...g.wps),F.days.push(g==null?void 0:g.to)),l+=((C=g==null?void 0:g.to)==null?void 0:C.distanceFromPrevious)??0;else{g&&(F.hours.push(g.to),g!=null&&g.wps&&F.wps.push(...g.wps),F.days.push(g.to));break}}const E=F.hours;for(let N=0;N<E.length-1;N++){const L=v(E[N+1].eta).diff(E[N].etd,"hour",!0);Y+=E[N].wxFactor*L,H+=E[N].cFactor*L,y+=L}const W=F.hours.at(0),q=F.hours.at(-1);return{sample:F,distance:Math.round(((q==null?void 0:q.distanceFromStart)||0)*1e4)/1e4,etd:v(W.eta).utc().format(),eta:v(q==null?void 0:q.eta).utc().format(),wxFactor:Math.round(Y/y*1e4)/1e4,cFactor:Math.round(H/y*1e4)/1e4,avgSpeed:Math.round(((q==null?void 0:q.distanceFromStart)||0)/y*1e4)/1e4,totalHrs:Math.round(y*1e4)/1e4,from:s,to:q,route:j,waypoints:b,v0:m,label:h}}}w.AISImpl=z,w.AlertHelper=Q,w.AlertLevel=J,w.HifleetImpl=ct,w.LoadCondition=$,w.MyShipImpl=ut,w.MyVesselImpl=rt,w.ShipxyImpl=dt,w.SpeedHelper=A,w.SpeedLabel=tt,w.VesselTag=X,w.alertHelper=ht,Object.defineProperty(w,Symbol.toStringTag,{value:"Module"})});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Current, Meteo } from '@idm-plugin/
|
|
1
|
+
import { Current, Meteo } from '@idm-plugin/meteo2';
|
|
2
2
|
import moment from 'moment';
|
|
3
3
|
/**
|
|
4
4
|
* 船舶标签,不同标签适用不同分析模型
|
|
@@ -136,6 +136,7 @@ export declare class SpeedHelper {
|
|
|
136
136
|
*/
|
|
137
137
|
static speedLoseAt(props: VesselProperties, coordinate: any, eta: moment.Moment, source?: string, role?: number, useMeteo?: boolean, useRouteParam?: boolean, options?: {
|
|
138
138
|
requestId?: string;
|
|
139
|
+
meteo2?: boolean;
|
|
139
140
|
}): Promise<any>;
|
|
140
141
|
/**
|
|
141
142
|
* 基于步长计算失速样本
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@idm-plugin/vessel",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.7",
|
|
5
5
|
"description": "idm plugin for vessel",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"keywords": [
|
|
@@ -28,7 +28,8 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@idm-plugin/geo": "^1.5.7",
|
|
31
|
-
"@idm-plugin/meteo": "^0.
|
|
31
|
+
"@idm-plugin/meteo": "^0.1.9",
|
|
32
|
+
"@idm-plugin/meteo2": "^0.0.8",
|
|
32
33
|
"@log4js-node/log4js-api": "^1.0.2",
|
|
33
34
|
"got": "11",
|
|
34
35
|
"moment": "^2.30.1"
|
|
@@ -39,6 +40,7 @@
|
|
|
39
40
|
"@typescript-eslint/eslint-plugin": "^5.53.0",
|
|
40
41
|
"@typescript-eslint/parser": "^5.53.0",
|
|
41
42
|
"@vitejs/plugin-vue": "^4.2.3",
|
|
43
|
+
"cross-fetch": "^4.1.0",
|
|
42
44
|
"eslint": "^8.35.0",
|
|
43
45
|
"eslint-config-prettier": "^8.6.0",
|
|
44
46
|
"eslint-define-config": "^1.15.0",
|