@idm-plugin/vessel 1.4.4 → 1.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,7 +15,7 @@ export interface AISRecord {
15
15
  cog?: number;
16
16
  hdg?: number;
17
17
  rot?: number;
18
- eta?: number;
18
+ eta?: string;
19
19
  destination?: string;
20
20
  positionTime?: number;
21
21
  status?: number;
@@ -25,6 +25,8 @@ export interface AISRecord {
25
25
  vendor?: string;
26
26
  deleted?: boolean;
27
27
  utc?: string;
28
+ meteo?: string;
29
+ type?: string;
28
30
  }
29
31
  export interface VesselRecord {
30
32
  mmsi?: number;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  var et = Object.defineProperty;
2
2
  var st = (I, s, t) => s in I ? et(I, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : I[s] = t;
3
3
  var Z = (I, s, t) => (st(I, typeof s != "symbol" ? s + "" : s, t), t);
4
- import R from "got";
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";
@@ -68,7 +68,7 @@ class pt extends K {
68
68
  client_secret: this.clientSecret,
69
69
  grant_type: "client_credentials"
70
70
  }
71
- }, n = await R.post(i, o).json();
71
+ }, n = await A.post(i, o).json();
72
72
  u == null || u.info("[%s] fetch access token from: %s - %j", t.requestId, i, n), n.error || (this.token = {
73
73
  accessToken: n.access_token,
74
74
  tokenType: n.token_type,
@@ -88,7 +88,7 @@ class pt extends K {
88
88
  searchParams: { mmsi: t }
89
89
  };
90
90
  u == null || u.info("[%s] fetch realtime position from: %s - %j", i.requestId, o, n);
91
- const a = await R.get(o, n).json();
91
+ const a = await A.get(o, n).json();
92
92
  if (a.code)
93
93
  return u == null || u.warn("[%s] fetch realtime position failed: %j", i.requestId, o, { message: a.message, status: a.status, code: a.code }), a;
94
94
  const e = a.data;
@@ -109,7 +109,7 @@ class pt extends K {
109
109
  cog: e.cog,
110
110
  hdg: e.hdg,
111
111
  rot: e.rot,
112
- eta: e.eta,
112
+ eta: /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e.eta) ? v.utc(e.eta).format() : void 0,
113
113
  destination: e.dest,
114
114
  positionTime: c.unix(),
115
115
  status: e.status,
@@ -140,15 +140,15 @@ class pt extends K {
140
140
  }
141
141
  };
142
142
  u == null || u.info("[%s] fetch trajectory from: %s - %j", c.requestId, r, d);
143
- const l = await R.post(r, d).json();
143
+ const l = await A.post(r, d).json();
144
144
  if (l.code)
145
145
  return u == null || u.warn("[%s] fetch trajectory failed: %j", c.requestId, r, { message: l.message, status: l.status, code: l.code }), l;
146
146
  let M = -1;
147
147
  const f = v(`${(b = (j = l.data) == null ? void 0 : j[0]) == null ? void 0 : b.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
148
148
  return (p = l.data) == null || p.forEach((h) => {
149
- for (const T in h)
150
- !isNaN(h[T]) && Number(h[T]) !== 1 / 0 && (h[T] = Number(h[T]));
151
- const k = v(`${h.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00"), w = h.eta ? v(`${h.eta} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00") : void 0, y = h.status, { labelCn: g, labelEn: N } = this.parseStatus(y), F = {
149
+ for (const O in h)
150
+ !isNaN(h[O]) && Number(h[O]) !== 1 / 0 && (h[O] = Number(h[O]));
151
+ const k = v(`${h.postime} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00"), w = h.status, { labelCn: y, labelEn: g } = this.parseStatus(w), N = {
152
152
  mmsi: h.mmsi,
153
153
  imo: n == null ? void 0 : n.imo,
154
154
  lat: h.lat,
@@ -157,17 +157,17 @@ class pt extends K {
157
157
  cog: h.cog,
158
158
  hdg: h.hdg,
159
159
  draught: h.draught,
160
- status: y,
161
- eta: w == null ? void 0 : w.unix(),
160
+ status: w,
161
+ 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,
162
162
  destination: h.dest,
163
163
  positionTime: k.unix(),
164
- labelCn: g,
165
- labelEn: N,
164
+ labelCn: y,
165
+ labelEn: g,
166
166
  method: "trajectory",
167
167
  vendor: "myVessel",
168
168
  utc: k.utc().format()
169
- }, W = Math.floor(k.diff(f, "minute", !0) / (a || 1));
170
- W !== M && (M = W, e.push(F));
169
+ }, F = Math.floor(k.diff(f, "minute", !0) / (a || 1));
170
+ F !== M && (M = F, e.push(N));
171
171
  }), e;
172
172
  }
173
173
  }
@@ -183,7 +183,7 @@ class Mt extends K {
183
183
  mmsi: t,
184
184
  usertoken: this.token
185
185
  }
186
- }, a = await R.post(o, n).json();
186
+ }, a = await A.post(o, n).json();
187
187
  u == null || u.info("[%s] fetch realtime position from: %s - %j", i.requestId, o, n);
188
188
  const e = a == null ? void 0 : a.list;
189
189
  if (!e)
@@ -206,7 +206,7 @@ class Mt extends K {
206
206
  cog: e.co,
207
207
  hdg: e.h,
208
208
  rot: isNaN(e.rot) ? 0 : e.rot,
209
- eta: /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e.eta) ? v(`${e.eta} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00").unix() : void 0,
209
+ eta: /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e.eta) ? v.utc(e.eta).format() : void 0,
210
210
  destination: e.destination,
211
211
  positionTime: l.unix(),
212
212
  utc: l.utc().format(),
@@ -229,7 +229,7 @@ class Mt extends K {
229
229
  Host: "www.hifleet.com"
230
230
  }
231
231
  };
232
- let a = await R.post(o, n).json();
232
+ let a = await A.post(o, n).json();
233
233
  u == null || u.info("[%s] fetch vessel props from: %s - %j", i.requestId, o, n), a instanceof Array && (a = a[0]);
234
234
  for (const c in a)
235
235
  !isNaN(a[c]) && Number(a[c]) !== 1 / 0 && (a[c] = Number(a[c]));
@@ -242,7 +242,7 @@ class Mt extends K {
242
242
  breadth: a.b,
243
243
  draught: a.dr
244
244
  };
245
- return o = "https://www.hifleet.com/hifleetapi/sameShipSearch.do", a = await R.post(o, n).json(), u == null || u.info("[%s] fetch vessel dead weight from: %s - %j", i.requestId, o, n), a instanceof Array && (a = a[0]), a && (e.deadweight = Number(a.dwt)), e;
245
+ return o = "https://www.hifleet.com/hifleetapi/sameShipSearch.do", a = await A.post(o, n).json(), u == null || u.info("[%s] fetch vessel dead weight from: %s - %j", i.requestId, o, n), a instanceof Array && (a = a[0]), a && (e.deadweight = Number(a.dwt)), e;
246
246
  }
247
247
  async trajectory(t, i, o, n, a = !0, e = {}) {
248
248
  var h, k, w;
@@ -260,7 +260,7 @@ class Mt extends K {
260
260
  mmsi: t,
261
261
  usertoken: this.token
262
262
  }
263
- }, f = "https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token", m = await R.get(f, M).json();
263
+ }, f = "https://api.hifleet.com/position/trajectory/nocompressed/withstatic/token", m = await A.get(f, M).json();
264
264
  u == null || u.info("[%s] fetch trajectory from: %s - %j", e.requestId, f, M);
265
265
  let Y;
266
266
  m && (Y = ((k = (h = m.ships) == null ? void 0 : h.offors) == null ? void 0 : k.ship) || [], Y.length || u == null || u.warn("[%s] fetch trajectory failed: %j", e.requestId, m));
@@ -272,7 +272,7 @@ class Mt extends K {
272
272
  !isNaN(y[L]) && Number(y[L]) !== 1 / 0 && (y[L] = Number(y[L]));
273
273
  const g = v(`${y.ti} +08:00`, "YYYY-MM-DD HH:mm:ss +08:00");
274
274
  y.status = y.sp > 4 ? 0 : 1;
275
- const { labelEn: N, labelCn: F } = this.parseStatus(y.status), W = {
275
+ const { labelEn: N, labelCn: F } = this.parseStatus(y.status), O = {
276
276
  mmsi: y.m,
277
277
  name: y.n,
278
278
  imo: c == null ? void 0 : c.imo,
@@ -289,8 +289,8 @@ class Mt extends K {
289
289
  labelEn: N,
290
290
  method: "trajectory",
291
291
  vendor: "hifleet"
292
- }, T = Math.floor(g.diff(p, "minute", !0) / (n || 1));
293
- T !== b && (b = T, j.push(W));
292
+ }, x = Math.floor(g.diff(p, "minute", !0) / (n || 1));
293
+ x !== b && (b = x, j.push(O));
294
294
  }
295
295
  return j;
296
296
  }
@@ -308,7 +308,7 @@ class yt extends K {
308
308
  k: this.token,
309
309
  enc: 1
310
310
  }
311
- }, n = "https://api.shipxy.com/apicall/GetSingleShip", a = await R.get(n, o).json();
311
+ }, n = "https://api.shipxy.com/apicall/GetSingleShip", a = await A.get(n, o).json();
312
312
  if (u == null || u.info("[%s] fetch realtime position from: %s - %j", i.requestId, n, o), (a == null ? void 0 : a.status) !== 0)
313
313
  return a;
314
314
  const e = a.data[0];
@@ -349,7 +349,7 @@ class yt extends K {
349
349
  btm: r.unix(),
350
350
  etm: d.unix()
351
351
  }
352
- }, f = await R.get(l, M).json();
352
+ }, f = await A.get(l, M).json();
353
353
  if (u == null || u.info("[%s] fetch trajectory from: %s - %j", e.requestId, l, M), (f == null ? void 0 : f.status) !== 0)
354
354
  return f;
355
355
  const m = f == null ? void 0 : f.points, Y = [], j = v.unix((p = m[0]) == null ? void 0 : p.utc);
@@ -386,7 +386,7 @@ class gt extends K {
386
386
  json: {
387
387
  mmsiList: t
388
388
  }
389
- }, n = "https://api3.myships.com/sp/ships/getShipIdByMMSI", a = await R.post(n, o).json();
389
+ }, n = "https://api3.myships.com/sp/ships/getShipIdByMMSI", a = await A.post(n, o).json();
390
390
  return u == null || u.info("[%s] fetch ship id from: %s - %j", i.requestId, n, o), a.code !== "0" ? a : a.data[0].shipId;
391
391
  }
392
392
  async getShipInfo(t, i = {}) {
@@ -397,7 +397,7 @@ class gt extends K {
397
397
  json: {
398
398
  shipId: t
399
399
  }
400
- }, n = "https://api3.myships.com/sp/ships/aissta", a = await R.post(n, o).json();
400
+ }, n = "https://api3.myships.com/sp/ships/aissta", a = await A.post(n, o).json();
401
401
  if (u == null || u.info("[%s] fetch ship info from: %s - %j", i.requestId, n, o), a.code !== "0")
402
402
  return a;
403
403
  const e = a.data;
@@ -420,7 +420,7 @@ class gt extends K {
420
420
  json: {
421
421
  shipId: o
422
422
  }
423
- }, e = "https://api3.myships.com/sp/ships/position/latest", c = await R.post(e, a).json();
423
+ }, e = "https://api3.myships.com/sp/ships/position/latest", c = await A.post(e, a).json();
424
424
  u == null || u.info("[%s] fetch realtime position from: %s - %j", i.requestId, e, a);
425
425
  const r = c.data[0];
426
426
  for (const m in r)
@@ -461,7 +461,7 @@ class gt extends K {
461
461
  startTime: i,
462
462
  endTime: o
463
463
  }
464
- }, l = "https://api3.myships.com/sp/ships/position/history", M = await R.post(l, d).json();
464
+ }, l = "https://api3.myships.com/sp/ships/position/history", M = await A.post(l, d).json();
465
465
  if (u == null || u.info("[%s] fetch trajectory from: %s - %j", r.requestId, l, d), M.code !== "0")
466
466
  return u == null || u.warn("[%s] invoke myship trajectory failed: %j", r.requestId, M), M;
467
467
  const f = M.data;
@@ -489,9 +489,9 @@ class gt extends K {
489
489
  return c;
490
490
  }
491
491
  }
492
- let O;
492
+ let R;
493
493
  try {
494
- O = z.getLogger("vessel");
494
+ R = z.getLogger("vessel");
495
495
  } catch {
496
496
  } finally {
497
497
  }
@@ -507,7 +507,7 @@ class nt {
507
507
  */
508
508
  parsePrinciple(s, t = {}) {
509
509
  var e, c, r;
510
- O == null || O.info("[%s] parse rule: %s", t.requestId, s);
510
+ R == null || R.info("[%s] parse rule: %s", t.requestId, s);
511
511
  const i = new RegExp("(?<=\\[)(.+)(?=])", "g"), o = s.match(i) ? (e = s.match(i)) == null ? void 0 : e[0] : void 0, n = o == null ? void 0 : o.split(";");
512
512
  if (!n)
513
513
  return;
@@ -532,7 +532,7 @@ class nt {
532
532
  */
533
533
  parseRule(s, t = {}) {
534
534
  var a;
535
- O == null || O.info("[%s] parse rule: %s", t.requestId, s), s = s.startsWith("[") ? s : `[${s}`, s = s.endsWith("]") ? s : `${s}]`;
535
+ R == null || R.info("[%s] parse rule: %s", t.requestId, s), s = s.startsWith("[") ? s : `[${s}`, s = s.endsWith("]") ? s : `${s}]`;
536
536
  const i = new RegExp("(?<=\\[)(.+?)(?=])", "g"), o = (a = s == null ? void 0 : s.match(i)) == null ? void 0 : a[0], n = o == null ? void 0 : o.split(",");
537
537
  if (n)
538
538
  return {
@@ -550,20 +550,20 @@ class nt {
550
550
  * @param options
551
551
  */
552
552
  checkWeather(s, t, i = {}) {
553
- var m, Y, j, b, p, h, k, w, y, g, N, F, W, T, L;
553
+ var m, Y, j, b, p, h, k, w, y, g, N, F, O, x, L;
554
554
  let o = 0, n = 0, a = 0, e = 0;
555
555
  const c = Math.round(((Y = (m = t == null ? void 0 : t.SEVERE) == null ? void 0 : m.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 = (h = (p = t == null ? void 0 : t.HEAVY) == null ? void 0 : p.sigWave) == null ? void 0 : h.number, l = 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, f = (F = (N = t == null ? void 0 : t.HEAVY) == null ? void 0 : N.wind) == null ? void 0 : F.number;
556
- for (let A = 0; A < (s == null ? void 0 : s.length); A++) {
557
- const S = s[A], P = (T = (W = S == null ? void 0 : S.meteo) == null ? void 0 : W.wave) == null ? void 0 : T.sig, x = (L = S == null ? void 0 : S.meteo) == null ? void 0 : L.wind, E = A ? v(S.eta).diff(v(s[A - 1].eta), "hour", !0) : 0;
558
- e = E > e ? E : e, O == null || O.info("[%s] check sig.wave: %j", i.requestId, { ...P, dgThd4Wv: c, svThd4Wv: r, hvThd4Wv: d }), (P == null ? void 0 : P.height) >= c ? S.isDangerous = !0 : (P == null ? void 0 : P.height) >= r ? S.isSevere = !0 : (P == null ? void 0 : P.height) >= d && (S.isHeavy = !0), O == null || O.info("[%s] check wind: %j", i.requestId, { ...x, dgThd4Wd: l, svThd4Wd: M, hvThd4Wd: f }), (x == null ? void 0 : x.scale) >= l ? (S.isDangerous = !0, delete S.isSevere, delete S.isHeavy) : (x == null ? void 0 : x.scale) > M ? (S.isDangerous || (S.isSevere = !0), delete S.isHeavy) : (x == null ? void 0 : x.scale) === f && !S.isDangerous && !S.isSevere && (S.isHeavy = !0), o += S.isDangerous ? E : 0, n += S.isSevere ? E : 0, a += S.isHeavy ? E : 0;
556
+ for (let W = 0; W < (s == null ? void 0 : s.length); W++) {
557
+ const T = s[W], P = (x = (O = T == null ? void 0 : T.meteo) == null ? void 0 : O.wave) == null ? void 0 : x.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;
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: l, svThd4Wd: M, hvThd4Wd: f }), (D == null ? void 0 : D.scale) >= l ? (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) === f && !T.isDangerous && !T.isSevere && (T.isHeavy = !0), o += T.isDangerous ? E : 0, n += T.isSevere ? E : 0, a += T.isHeavy ? E : 0;
559
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: l, svThd4Wd: M, hvThd4Wd: f }, sig: { dgThd4Wv: c, svThd4Wv: r, hvThd4Wv: d } };
561
561
  }
562
562
  }
563
563
  const bt = new nt();
564
- let D;
564
+ let S;
565
565
  try {
566
- D = z.getLogger("vessel");
566
+ S = z.getLogger("vessel");
567
567
  } catch {
568
568
  } finally {
569
569
  }
@@ -758,7 +758,7 @@ class C {
758
758
  const g = o - f;
759
759
  p.elapsed += g, t.add(g, "hour"), o = 0;
760
760
  }
761
- if (D == null || D.info(`[%s] suspend ${p.elapsed} hours at %j, and remain ${o} hours need to go...`, d.requestId, p), o === 0)
761
+ 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
762
  return p.distanceFromPrevious = m, { etd: t, from: j || p, to: p, next: a.filter((g) => g), wps: l, days: M };
763
763
  } else
764
764
  p.suspend = 0;
@@ -766,7 +766,7 @@ class C {
766
766
  const k = V.calculateDistance(p, h, !h.gcToPrevious);
767
767
  let w = Math.ceil(k / j.speed * 1e4) / 1e4;
768
768
  if (f + w < o) {
769
- if (f += w, t.add(w, "hour"), delete a[b], D == null || D.info(
769
+ if (f += w, t.add(w, "hour"), delete a[b], S == null || S.info(
770
770
  `[%s] go to %j from %j with ${k}nm, and cost ${w} hours`,
771
771
  d.requestId,
772
772
  { lat: h.lat, lng: h.lng },
@@ -778,7 +778,7 @@ class C {
778
778
  } else {
779
779
  w = o - f, t.add(w, "hour");
780
780
  const y = B.roundPrecision(j.speed * w, 4);
781
- Y = V.calculateCoordinate(p, s.bearing, y, "nauticalmiles", !h.gcToPrevious), Y.eta = t.format("YYYY-MM-DDTHH:mm[Z]"), a[b] = Y, D == null || D.info(
781
+ Y = V.calculateCoordinate(p, s.bearing, y, "nauticalmiles", !h.gcToPrevious), Y.eta = t.format("YYYY-MM-DDTHH:mm[Z]"), a[b] = Y, S == null || S.info(
782
782
  `[%s] go to %j from %j with ${y}nm, and cost ${w} hours`,
783
783
  d.requestId,
784
784
  { lat: Y.lat, lng: Y.lng },
@@ -809,15 +809,15 @@ class C {
809
809
  */
810
810
  static weatherFactor(s, t) {
811
811
  var l, M, f, m, Y, j, b;
812
- D == null || D.debug("calculate weather factor via: %j", { ...s, ...t });
812
+ S == null || S.debug("calculate weather factor via: %j", { ...s, ...t });
813
813
  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
814
  let a = Math.abs(s.bearing % 360 - (((l = t == null ? void 0 : t.wind) == null ? void 0 : l.degree) % 360 || 0));
815
815
  a = a > 180 ? 360 - a : a;
816
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, (f = t == null ? void 0 : t.wind) == null ? void 0 : f.scale);
817
817
  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)), D == null || D.debug("wind wx factor = %d", r), a = Math.abs(s.bearing % 360 - (((Y = (m = t == null ? void 0 : t.wave) == null ? void 0 : m.sig) == null ? void 0 : Y.degree) % 360 || 0));
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 = (m = t == null ? void 0 : t.wave) == null ? void 0 : m.sig) == null ? void 0 : Y.degree) % 360 || 0));
819
819
  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
- return D == null || D.debug("wave wx factor = %d", d), r = r * 0.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) * 0.1 : r, Math.round(r * 100) / 100;
820
+ 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
821
  }
822
822
  /**
823
823
  * 全程失速分析(走完航程)
@@ -862,12 +862,12 @@ class C {
862
862
  e || (V.calculateRouteDistance(m) / o.speed <= 72 ? e = 3 : e = 6);
863
863
  let w = V.simplifyRouteToCoordinates(m, p, 0), y = 0, g = 0, N = 0, F = 0;
864
864
  t = v(t).utc();
865
- const W = t.clone();
865
+ const O = t.clone();
866
866
  for (; w.length > 0; ) {
867
867
  const H = e - t.hour() % e, _ = Math.ceil(t.clone().add(H, "h").set({ minute: 0, second: 0, millisecond: 0 }).diff(t, "h", !0) * 1e4) / 1e4, q = await C.speedLoseInHoursStep(
868
868
  b,
869
869
  t,
870
- W,
870
+ O,
871
871
  _,
872
872
  y,
873
873
  w,
@@ -878,10 +878,10 @@ class C {
878
878
  );
879
879
  (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
880
  }
881
- const T = k.hours;
882
- for (let H = 0; H < T.length - 1; H++) {
883
- const _ = v(T[H + 1].eta).diff(T[H].etd, "hour", !0) || 1;
884
- g += (T[H].wxFactor || 0) * _, N += (T[H].cFactor || 0) * _, F += _;
881
+ const x = k.hours;
882
+ for (let H = 0; H < x.length - 1; H++) {
883
+ const _ = v(x[H + 1].eta).diff(x[H].etd, "hour", !0) || 1;
884
+ g += (x[H].wxFactor || 0) * _, N += (x[H].cFactor || 0) * _, F += _;
885
885
  }
886
886
  (J = k.wps) == null || J.forEach((H, _) => {
887
887
  if (_) {
@@ -895,10 +895,10 @@ class C {
895
895
  }
896
896
  }
897
897
  }), h.sample = k;
898
- const L = k.hours.at(0), A = k.hours.at(-1);
899
- h.distance = Math.round(A.distanceFromStart * 1e4) / 1e4, h.etd = v(L.eta).utc().format(), h.eta = v(A.eta).utc().format(), h.wxFactor = Math.round(g / F * 1e4) / 1e4, h.cFactor = Math.round(N / F * 1e4) / 1e4, h.avgSpeed = Math.round(A.distanceFromStart / F * 1e4) / 1e4, h.totalHrs = Math.round(F * 1e4) / 1e4, h.totalFoCons = Math.round((o == null ? void 0 : o.fo) / 24 * h.totalHrs * 1e3) / 1e3, h.totalDgoCons = Math.round((o == null ? void 0 : o.dgo) / 24 * h.totalHrs * 1e3) / 1e3;
900
- const P = v().valueOf() - l, x = ((Q = k == null ? void 0 : k.hours) == null ? void 0 : Q.length) || 1;
901
- return D == null || D.info("[%s] each hour-sample speed analyse cost: (%d / %d = %d) ms", d == null ? void 0 : d.requestId, P, x, Math.round(P / x * 1e3) / 1e3), h;
898
+ const L = k.hours.at(0), W = k.hours.at(-1);
899
+ h.distance = Math.round(W.distanceFromStart * 1e4) / 1e4, h.etd = v(L.eta).utc().format(), h.eta = v(W.eta).utc().format(), h.wxFactor = Math.round(g / F * 1e4) / 1e4, h.cFactor = Math.round(N / F * 1e4) / 1e4, h.avgSpeed = Math.round(W.distanceFromStart / F * 1e4) / 1e4, h.totalHrs = Math.round(F * 1e4) / 1e4, h.totalFoCons = Math.round((o == null ? void 0 : o.fo) / 24 * h.totalHrs * 1e3) / 1e3, h.totalDgoCons = Math.round((o == null ? void 0 : o.dgo) / 24 * h.totalHrs * 1e3) / 1e3;
900
+ const P = v().valueOf() - l, D = ((Q = k == null ? void 0 : k.hours) == null ? void 0 : Q.length) || 1;
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), h;
902
902
  }
903
903
  /**
904
904
  * 分段失速分析(最多走hours 小时)
@@ -914,7 +914,7 @@ class C {
914
914
  * @param useRouteParam
915
915
  */
916
916
  static async analyseInstantWithThreshed(s, t, i, o, n, a, e, c = "", r = 3, d = !0, l = !1, M = {}) {
917
- var A, S, P;
917
+ var W, T, P;
918
918
  s.lng = B.convertToStdLng(s.lng);
919
919
  const { v0: f, label: m } = s.sog ? {
920
920
  v0: s.sog,
@@ -925,10 +925,10 @@ class C {
925
925
  label: "CP"
926
926
  /* Cp */
927
927
  }, Y = C.assembleProperties(o, n.loadCondition, f, 0), j = V.calculateSubRoute(s, a);
928
- if (((A = j[0]) == null ? void 0 : A.length) <= 1)
928
+ if (((W = j[0]) == null ? void 0 : W.length) <= 1)
929
929
  return;
930
930
  const b = e.length ? V.calculateSubWaypoints(s, e) : [];
931
- b.forEach((x) => x.important = !0);
931
+ b.forEach((D) => D.important = !0);
932
932
  let p = V.simplifyRouteToCoordinates(j, b, 0), h = 0, k = 0, w = 0, y = 0, g;
933
933
  const N = {
934
934
  hours: [],
@@ -936,8 +936,8 @@ class C {
936
936
  days: []
937
937
  };
938
938
  for (t = v(t).utc(); p.length > 0; ) {
939
- const x = r - t.hour() % r;
940
- let E = Math.ceil(t.clone().add(x, "h").set({ minute: 0, second: 0, millisecond: 0 }).diff(t, "h", !0) * 1e4) / 1e4;
939
+ const D = r - t.hour() % r;
940
+ let E = Math.ceil(t.clone().add(D, "h").set({ minute: 0, second: 0, millisecond: 0 }).diff(t, "h", !0) * 1e4) / 1e4;
941
941
  if (E = t.clone().add(E, "h").isAfter(i) ? i.diff(t, "h", !0) * 1e4 / 1e4 : E, E)
942
942
  g = await C.speedLoseInHoursStep(
943
943
  Y,
@@ -950,30 +950,30 @@ class C {
950
950
  d,
951
951
  l,
952
952
  M
953
- ), (S = g.from) != null && S.speed && (N.hours.push(g.from), g != null && g.wps && N.wps.push(...g.wps), N.days.push(...g.days)), p = g == null ? void 0 : g.next, p.length || (N.hours.push(g == null ? void 0 : g.to), g != null && g.wps && N.wps.push(...g.wps), N.days.push(g == null ? void 0 : g.to)), h += ((P = g == null ? void 0 : g.to) == null ? void 0 : P.distanceFromPrevious) ?? 0;
953
+ ), (T = g.from) != null && T.speed && (N.hours.push(g.from), g != null && g.wps && N.wps.push(...g.wps), N.days.push(...g.days)), p = g == null ? void 0 : g.next, p.length || (N.hours.push(g == null ? void 0 : g.to), g != null && g.wps && N.wps.push(...g.wps), N.days.push(g == null ? void 0 : g.to)), h += ((P = g == null ? void 0 : g.to) == null ? void 0 : P.distanceFromPrevious) ?? 0;
954
954
  else {
955
955
  g && (N.hours.push(g.to), g != null && g.wps && N.wps.push(...g.wps), N.days.push(g.to));
956
956
  break;
957
957
  }
958
958
  }
959
959
  const F = N.hours;
960
- for (let x = 0; x < F.length - 1; x++) {
961
- const E = v(F[x + 1].eta).diff(F[x].etd, "hour", !0);
962
- k += F[x].wxFactor * E, w += F[x].cFactor * E, y += E;
960
+ for (let D = 0; D < F.length - 1; D++) {
961
+ const E = v(F[D + 1].eta).diff(F[D].etd, "hour", !0);
962
+ k += F[D].wxFactor * E, w += F[D].cFactor * E, y += E;
963
963
  }
964
- const W = N.hours.at(0), T = N.hours.at(-1);
964
+ const O = N.hours.at(0), x = N.hours.at(-1);
965
965
  return {
966
966
  sample: N,
967
- distance: Math.round(((T == null ? void 0 : T.distanceFromStart) || 0) * 1e4) / 1e4,
967
+ distance: Math.round(((x == null ? void 0 : x.distanceFromStart) || 0) * 1e4) / 1e4,
968
968
  // 注意,可能会在first节点Drift,所有采用eta做为初始出发时间
969
- etd: v(W.eta).utc().format(),
970
- eta: v(T == null ? void 0 : T.eta).utc().format(),
969
+ etd: v(O.eta).utc().format(),
970
+ eta: v(x == null ? void 0 : x.eta).utc().format(),
971
971
  wxFactor: Math.round(k / y * 1e4) / 1e4,
972
972
  cFactor: Math.round(w / y * 1e4) / 1e4,
973
- avgSpeed: Math.round(((T == null ? void 0 : T.distanceFromStart) || 0) / y * 1e4) / 1e4,
973
+ avgSpeed: Math.round(((x == null ? void 0 : x.distanceFromStart) || 0) / y * 1e4) / 1e4,
974
974
  totalHrs: Math.round(y * 1e4) / 1e4,
975
975
  from: s,
976
- to: T,
976
+ to: x,
977
977
  route: j,
978
978
  waypoints: b,
979
979
  v0: f,
@@ -1 +1 @@
1
- (function(H,D){typeof exports=="object"&&typeof module<"u"?D(exports,require("got"),require("@log4js-node/log4js-api"),require("moment"),require("@idm-plugin/geo"),require("@idm-plugin/meteo")):typeof define=="function"&&define.amd?define(["exports","got","@log4js-node/log4js-api","moment","@idm-plugin/geo","@idm-plugin/meteo"],D):(H=typeof globalThis<"u"?globalThis:H||self,D(H["idm-plugin-rabbitmq"]={},H.got,H["@log4js-node/log4js-api"],H.moment,H["@idm-plugin/geo"],H["@idm-plugin/meteo"]))})(this,function(H,D,Z,g,O,ot){"use strict";var lt=Object.defineProperty;var ft=(H,D,Z)=>D in H?lt(H,D,{enumerable:!0,configurable:!0,writable:!0,value:Z}):H[D]=Z;var K=(H,D,Z)=>(ft(H,typeof D!="symbol"?D+"":D,Z),Z);let u;try{u=Z.getLogger("vessel")}catch{}finally{}class z{parseStatus(s){let t,i;switch(s){case 0:t="在航(主机推动)",i="The engine is in use";break;case 1:t="锚泊",i="Anchored";break;case 2:t="失控",i="Not operated";break;case 3:t="操纵受限",i="Limited airworthiness";break;case 4:t="吃水受限",i="Limited by ship's draft";break;case 5:t="靠泊",i="Mooring";break;case 6:t="搁浅",i="Stranded";break;case 7:t="捕捞作业",i="Engaged in fishing";break;case 8:t="靠帆船提供动力",i="Sailing";break;default:t="未定义",i="Undefined"}return{labelCn:t,labelEn:i}}}class it extends z{constructor(t,i){super();K(this,"clientId");K(this,"clientSecret");K(this,"token");this.clientId=t,this.clientSecret=i}async authToken(t={}){const i="https://svc.data.myvessel.cn/ada/oauth/token",n={searchParams:{client_id:this.clientId,client_secret:this.clientSecret,grant_type:"client_credentials"}},o=await D.post(i,n).json();u==null||u.info("[%s] fetch access token from: %s - %j",t.requestId,i,o),o.error||(this.token={accessToken:o.access_token,tokenType:o.token_type,expiresIn:o.expires_in,scope:o.scope,jti:o.jti,issuedAt:g().utc().format()})}async realTimePosition(t,i={}){var d,l,M;(!this.token||g().diff(g(this.token.issuedAt),"seconds")>((d=this.token)==null?void 0:d.expiresIn)-300)&&await this.authToken(i);const n="https://svc.data.myvessel.cn/sdc/v1/vessels/status/location/unit",o={headers:{Authorization:`${(l=this.token)==null?void 0:l.tokenType} ${(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 D.get(n,o).json();if(a.code)return u==null||u.warn("[%s] fetch realtime position failed: %j",i.requestId,n,{message:a.message,status:a.status,code:a.code}),a;const e=a.data;for(const f in e)!isNaN(e[f])&&Number(e[f])!==1/0&&(e[f]=Number(e[f]));const c=g(`${e.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:e.mmsi,name:e.vesselName,imo:e.imo,callSign:e.callsign,lat:e.lat,lng:e.lon,length:e.length,width:e.width,draught:e.currDraught,sog:e.sog,cog:e.cog,hdg:e.hdg,rot:e.rot,eta:e.eta,destination:e.dest,positionTime:c.unix(),status:e.status,labelCn:e.statusNameCn,labelEn:e.statusNameEn,method:"position",vendor:"myVessel",utc:c.utc().format()}}async trajectory(t,i,n,o,a=!0,e={}){(!this.token||g().diff(g(this.token.issuedAt),"seconds")>this.token.expiresIn-300)&&await this.authToken(e);const c=await this.realTimePosition(t,e),r=g(i),d=g(n),l=[];for(;d.diff(r,"day",!0)>30;)await this.trajectoryIn30Day(t,r,r.clone().add(30,"day"),c,o,l,e),r.add(30,"day");return await this.trajectoryIn30Day(t,r,d,c,o,l,e),l}async trajectoryIn30Day(t,i,n,o,a,e,c={}){var m,Y,j,v,p;const r="https://svc.data.myvessel.cn/sdc/v1/vessels/status/track",d={headers:{Authorization:`${(m=this.token)==null?void 0:m.tokenType} ${(Y=this.token)==null?void 0:Y.accessToken}`},json:{mmsi:t,startTime:i.utcOffset(8).format("YYYY-MM-DD HH:mm:ss"),endTime:n.utcOffset(8).format("YYYY-MM-DD HH:mm:ss")}};u==null||u.info("[%s] fetch trajectory from: %s - %j",c.requestId,r,d);const l=await D.post(r,d).json();if(l.code)return u==null||u.warn("[%s] fetch trajectory failed: %j",c.requestId,r,{message:l.message,status:l.status,code:l.code}),l;let M=-1;const f=g(`${(v=(j=l.data)==null?void 0:j[0])==null?void 0:v.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return(p=l.data)==null||p.forEach(h=>{for(const S in h)!isNaN(h[S])&&Number(h[S])!==1/0&&(h[S]=Number(h[S]));const I=g(`${h.postime} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"),w=h.eta?g(`${h.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00"):void 0,y=h.status,{labelCn:b,labelEn:x}=this.parseStatus(y),E={mmsi:h.mmsi,imo:o==null?void 0:o.imo,lat:h.lat,lng:h.lon,sog:h.sog,cog:h.cog,hdg:h.hdg,draught:h.draught,status:y,eta:w==null?void 0:w.unix(),destination:h.dest,positionTime:I.unix(),labelCn:b,labelEn:x,method:"trajectory",vendor:"myVessel",utc:I.utc().format()},V=Math.floor(I.diff(f,"minute",!0)/(a||1));V!==M&&(M=V,e.push(E))}),e}}class rt extends z{constructor(t){super();K(this,"token");this.token=t}async realTimePosition(t,i={}){const n="https://api.hifleet.com/position/position/get/token",o={searchParams:{mmsi:t,usertoken:this.token}},a=await D.post(n,o).json();u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,n,o);const e=a==null?void 0:a.list;if(!e)return u==null||u.warn("[%s] fetch realtime position failed: %j",i.requestId,n,a),a;for(const f in e)!isNaN(e[f])&&Number(e[f])!==1/0&&(e[f]=Number(e[f]));e.status=e.sp>3?0:1;const c=e.status,{labelCn:r,labelEn:d}=this.parseStatus(c),l=g(`${e.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");return{mmsi:e.m,name:e.n,imo:e.imonumber,callSign:e.callsign,lat:Math.round(e.la/60*1e5)/1e5,lng:Math.round(e.lo/60*1e5)/1e5,length:e.l,width:e.w,draught:e.draught,sog:e.sp,cog:e.co,hdg:e.h,rot:isNaN(e.rot)?0:e.rot,eta:/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e.eta)?g(`${e.eta} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00").unix():void 0,destination:e.destination,positionTime:l.unix(),utc:l.utc().format(),status:c,labelCn:r,labelEn:d,method:"position",vendor:"hifleet"}}async search(t,i={}){let n="https://www.hifleet.com/hifleetapi/searchVesselOL.do";const o={searchParams:{keyword:t},headers:{Referer:"https://www.hifleet.com",Origin:"https://www.hifleet.com",Host:"www.hifleet.com"}};let a=await D.post(n,o).json();u==null||u.info("[%s] fetch vessel props from: %s - %j",i.requestId,n,o),a instanceof Array&&(a=a[0]);for(const c in a)!isNaN(a[c])&&Number(a[c])!==1/0&&(a[c]=Number(a[c]));const e={mmsi:a.m,name:a.n,imo:a.i,callSign:a.c,length:a.l,breadth:a.b,draught:a.dr};return n="https://www.hifleet.com/hifleetapi/sameShipSearch.do",a=await D.post(n,o).json(),u==null||u.info("[%s] fetch vessel dead weight from: %s - %j",i.requestId,n,o),a instanceof Array&&(a=a[0]),a&&(e.deadweight=Number(a.dwt)),e}async trajectory(t,i,n,o,a=!0,e={}){var h,I,w;const c=await this.realTimePosition(t,e);let r=g(i);const d=g(n),l=g();if(a){let y=d.diff(r,"d",!0);y<0?r=d.clone().subtract(40,"d"):y<30?r.subtract(10,"d"):y<60?r.subtract(5,"d"):r=d.clone().subtract(80,"d"),y=l.diff(d,"d",!0),d.add(y>10?240:y*24,"h")}const 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 D.get(f,M).json();u==null||u.info("[%s] fetch trajectory from: %s - %j",e.requestId,f,M);let Y;m&&(Y=((I=(h=m.ships)==null?void 0:h.offors)==null?void 0:I.ship)||[],Y.length||u==null||u.warn("[%s] fetch trajectory failed: %j",e.requestId,m));const j=[];let v=-1;const p=g(`${(w=Y==null?void 0:Y[0])==null?void 0:w.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");for(const y of Y){for(const _ in y)!isNaN(y[_])&&Number(y[_])!==1/0&&(y[_]=Number(y[_]));const b=g(`${y.ti} +08:00`,"YYYY-MM-DD HH:mm:ss +08:00");y.status=y.sp>4?0:1;const{labelEn:x,labelCn:E}=this.parseStatus(y.status),V={mmsi:y.m,name:y.n,imo:c==null?void 0:c.imo,lat:y.la,lng:y.lo,draught:y.draught,sog:y.sp,cog:y.co,hdg:y.hdg,positionTime:b.unix(),utc:b.utc().format(),status:y.status,labelCn:E,labelEn:x,method:"trajectory",vendor:"hifleet"},S=Math.floor(b.diff(p,"minute",!0)/(o||1));S!==v&&(v=S,j.push(V))}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 D.get(o,n).json();if(u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,o,n),(a==null?void 0:a.status)!==0)return a;const e=a.data[0];for(const 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=g.unix(e.lasttime);return{mmsi:e.ShipID,name:e.name,imo:e.imo,callSign:e.callsign,lat:Math.round(e.lat/1e6*1e5)/1e5,lng:Math.round(e.lon/1e6*1e5)/1e5,length:Math.round(e.length/10*100)/100,width:Math.round(e.width/10*100)/100,draught:Math.round(e.draught/1e3*100)/100,sog:Math.round(e.sog*3600/1e3/1852*100)/100,cog:Math.round(e.cog/100*100)/100,hdg:Math.round(e.hdg/100*100)/100,rot:Math.round(e.rot/100*100)/100,positionTime:e.lasttime,utc:d.utc().format(),status:e.navistat,labelEn:r,labelCn:c,method:"position",vendor:"shipxy"}}async trajectory(t,i,n,o,a=!0,e={}){var p;const c=await this.realTimePosition(t,e),r=g(i),d=g(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 D.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,Y=[],j=g.unix((p=m[0])==null?void 0:p.utc);let v=-1;for(const h of m){const I=g.unix(h.utc),w={imo:c==null?void 0:c.imo,mmsi:t,sog:Math.round(h.sog*3600/1e3/1852*100)/100,cog:Math.round(h.cog/100*100)/100,lat:Math.round(h.lat/1e6*1e5)/1e5,lng:Math.round(h.lon/1e6*1e5)/1e5,positionTime:I.unix(),utc:I.utc().format(),method:"trajectory",vendor:"shipxy"},y=Math.floor(I.diff(j,"minute",!0)/(o||1));y!==v&&(v=y,Y.push(w))}return Y}}class dt extends z{constructor(t){super();K(this,"token");this.token=t}async getShipId(t,i={}){const n={headers:{appKey:this.token},json:{mmsiList:t}},o="https://api3.myships.com/sp/ships/getShipIdByMMSI",a=await D.post(o,n).json();return u==null||u.info("[%s] fetch ship id from: %s - %j",i.requestId,o,n),a.code!=="0"?a:a.data[0].shipId}async getShipInfo(t,i={}){const n={headers:{appKey:this.token},json:{shipId:t}},o="https://api3.myships.com/sp/ships/aissta",a=await D.post(o,n).json();if(u==null||u.info("[%s] fetch ship info from: %s - %j",i.requestId,o,n),a.code!=="0")return a;const e=a.data;let c=e.imo;return t==="407170"&&(c="9198379",u==null||u.warn("[%s] ship(%s) imo error: %s, should be %s",i.requestId,t,e.imo,c)),{mmsi:e.mmsi,name:e.shipnameEn,imo:c,callSign:e.callSign,length:e.length,width:e.breadth,draught:(e.draught||100)/10}}async realTimePosition(t,i={}){const n=await this.getShipId(t,i),o=await this.getShipInfo(n,i),a={headers:{appKey:this.token},json:{shipId:n}},e="https://api3.myships.com/sp/ships/position/latest",c=await D.post(e,a).json();u==null||u.info("[%s] fetch realtime position from: %s - %j",i.requestId,e,a);const r=c.data[0];for(const m in r)!isNaN(r[m])&&Number(r[m])!==1/0&&(r[m]=Number(r[m]));const{labelCn:d,labelEn:l}=await this.parseStatus(r.aisNavStatus),M=g.unix(r.posTime);return{...o,mmsi:t,lat:Math.round(r.lat/1e4/60*1e5)/1e5,lng:Math.round(r.lon/1e4/60*1e5)/1e5,sog:Math.round(r.sog/10*100)/100,cog:Math.round(r.cog/10*100)/100,hdg:Math.round(r.heading*100)/100,rot:Math.round(r.rot*100)/100,positionTime:r.posTime,utc: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=g(i),r=g(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 D.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 v in f)!isNaN(f[v])&&Number(f[v])!==1/0&&(f[v]=Number(f[v]));const m=g.unix((j=f[0])==null?void 0:j.posTime);let Y=-1;for(const v of f){const p=g.unix(v.posTime),h={imo:o==null?void 0:o.imo,mmsi:a,lat:Math.round(v.lat/1e4/60*1e5)/1e5,lng:Math.round(v.lon/1e4/60*1e5)/1e5,sog:Math.round(v.sog/10*100)/100,cog:Math.round(v.cog/10*100)/100,hdg:Math.round(v.heading*100)/100,rot:Math.round(v.rot*100)/100,positionTime:p.unix(),utc:p.utc().format(),method:"trajectory",vendor:"myship"},I=Math.floor(p.diff(m,"minute",!0)/(e||1));I!==Y&&(Y=I,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,Y,j,v,p,h,I,w,y,b,x,E,V,S,_;let n=0,o=0,a=0,e=0;const c=Math.round(((Y=(m=t==null?void 0:t.SEVERE)==null?void 0:m.sigWave)==null?void 0:Y.number)*1.6*100)/100,r=(v=(j=t==null?void 0:t.SEVERE)==null?void 0:j.sigWave)==null?void 0:v.number,d=(h=(p=t==null?void 0:t.HEAVY)==null?void 0:p.sigWave)==null?void 0:h.number,l=Math.round((((w=(I=t==null?void 0:t.SEVERE)==null?void 0:I.wind)==null?void 0:w.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=(x=t==null?void 0:t.HEAVY)==null?void 0:x.wind)==null?void 0:E.number;for(let W=0;W<(s==null?void 0:s.length);W++){const T=s[W],C=(S=(V=T==null?void 0:T.meteo)==null?void 0:V.wave)==null?void 0:S.sig,F=(_=T==null?void 0:T.meteo)==null?void 0:_.wind,P=W?g(T.eta).diff(g(s[W-1].eta),"hour",!0):0;e=P>e?P:e,R==null||R.info("[%s] check sig.wave: %j",i.requestId,{...C,dgThd4Wv:c,svThd4Wv:r,hvThd4Wv:d}),(C==null?void 0:C.height)>=c?T.isDangerous=!0:(C==null?void 0:C.height)>=r?T.isSevere=!0:(C==null?void 0:C.height)>=d&&(T.isHeavy=!0),R==null||R.info("[%s] check wind: %j",i.requestId,{...F,dgThd4Wd:l,svThd4Wd:M,hvThd4Wd:f}),(F==null?void 0:F.scale)>=l?(T.isDangerous=!0,delete T.isSevere,delete T.isHeavy):(F==null?void 0:F.scale)>M?(T.isDangerous||(T.isSevere=!0),delete T.isHeavy):(F==null?void 0:F.scale)===f&&!T.isDangerous&&!T.isSevere&&(T.isHeavy=!0),n+=T.isDangerous?P:0,o+=T.isSevere?P:0,a+=T.isHeavy?P:0}return n=Math.round(n*100)/100,o=Math.round(o*100)/100,a=Math.round(a*100)/100,e=Math.round(e),{sample:s,dangerous:n,severe:o,heavy:a,step:e<3?3:e,wind:{dgThd4Wd:l,svThd4Wd:M,hvThd4Wd:f},sig:{dgThd4Wv:c,svThd4Wv:r,hvThd4Wv:d}}}}const ut=new U;let N;try{N=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,Y,j;for(let v=0;v<a.length-1;v++){let p=a[v];p.distanceFromStart=o+m;const h=a[v+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(N==null||N.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 I=O.LaneHelper.calculateDistance(p,h,!h.gcToPrevious);let w=Math.ceil(I/j.speed*1e4)/1e4;if(f+w<n){if(f+=w,t.add(w,"hour"),delete a[v],N==null||N.info(`[%s] go to %j from %j with ${I}nm, and cost ${w} hours`,d.requestId,{lat:h.lat,lng:h.lng},{lat:j.lat,lng:j.lng,etd:j.etd}),m+=I,a.filter(y=>y).length<=1){Y=h,Y.eta=t.format("YYYY-MM-DDTHH:mm[Z]"),Y.distanceFromPrevious=I,Y.distanceFromStart=o+m,l.push(Y),delete a[v+1];break}}else{w=n-f,t.add(w,"hour");const y=O.LngLatHelper.roundPrecision(j.speed*w,4);Y=O.LaneHelper.calculateCoordinate(p,s.bearing,y,"nauticalmiles",!h.gcToPrevious),Y.eta=t.format("YYYY-MM-DDTHH:mm[Z]"),a[v]=Y,N==null||N.info(`[%s] go to %j from %j with ${y}nm, and cost ${w} hours`,d.requestId,{lat:Y.lat,lng:Y.lng},{lat:p.lat,lng:p.lng,etd:p.etd}),m+=y,Y.distanceFromPrevious=m,Y.distanceFromStart=o+m;break}}return{etd:t,from:j,to:Y,next:a.filter(v=>v),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,Y,j,v;N==null||N.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)),N==null||N.debug("wind wx factor = %d",r),a=Math.abs(s.bearing%360-(((Y=(m=t==null?void 0:t.wave)==null?void 0:m.sig)==null?void 0:Y.degree)%360||0));const d=A.waveHeightFactor(((v=(j=t==null?void 0:t.wave)==null?void 0:j.sig)==null?void 0:v.height)??1,a);return N==null||N.debug("wave wx factor = %d",d),r=r*.4+d,N==null||N.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=g().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:Y,label:j}=s.sog?{v0:s.sog,label:"Other"}:{v0:n.speed,label:"CP"},v=A.assembleProperties(i,n.loadCondition,Y,0),p=f.length?O.LaneHelper.calculateSubWaypoints(s,f):[];p.forEach(q=>q.important=!0);const h={from:{...s},route:m,waypoints:p,v0:Y,label:j},I={hours:[],days:[],wps:[]};e||(O.LaneHelper.calculateRouteDistance(m)/n.speed<=72?e=3:e=6);let w=O.LaneHelper.simplifyRouteToCoordinates(m,p,0),y=0,b=0,x=0,E=0;t=g(t).utc();const V=t.clone();for(;w.length>0;){const q=e-t.hour()%e,B=Math.ceil(t.clone().add(q,"h").set({minute:0,second:0,millisecond:0}).diff(t,"h",!0)*1e4)/1e4,L=await A.speedLoseInHoursStep(v,t,V,B,y,w,a,c,r,d);($=L.from)!=null&&$.speed&&(I.hours.push(L.from),I.wps.push(...L.wps),I.days.push(...L.days)),w=L==null?void 0:L.next,w.length||I.hours.push(L==null?void 0:L.to),y+=((tt=L==null?void 0:L.to)==null?void 0:tt.distanceFromPrevious)??0}const S=I.hours;for(let q=0;q<S.length-1;q++){const B=g(S[q+1].eta).diff(S[q].etd,"hour",!0)||1;b+=(S[q].wxFactor||0)*B,x+=(S[q].cFactor||0)*B,E+=B}(et=I.wps)==null||et.forEach((q,B)=>{if(B){const L=I.wps[B-1],ht=q.distanceFromStart-L.distanceFromStart,at=g(q.eta).diff(g(L.etd),"h",!0);if(at<1)q.avgSpd=L.speed;else{q.avgSpd=Math.round(ht/at*100)/100;const nt=Math.round((L.speed+q.speed)/2*100)/100;q.avgSpd=q.avgSpd>nt?nt:q.avgSpd}}}),h.sample=I;const _=I.hours.at(0),W=I.hours.at(-1);h.distance=Math.round(W.distanceFromStart*1e4)/1e4,h.etd=g(_.eta).utc().format(),h.eta=g(W.eta).utc().format(),h.wxFactor=Math.round(b/E*1e4)/1e4,h.cFactor=Math.round(x/E*1e4)/1e4,h.avgSpeed=Math.round(W.distanceFromStart/E*1e4)/1e4,h.totalHrs=Math.round(E*1e4)/1e4,h.totalFoCons=Math.round((n==null?void 0:n.fo)/24*h.totalHrs*1e3)/1e3,h.totalDgoCons=Math.round((n==null?void 0:n.dgo)/24*h.totalHrs*1e3)/1e3;const C=g().valueOf()-l,F=((st=I==null?void 0:I.hours)==null?void 0:st.length)||1;return N==null||N.info("[%s] each hour-sample speed analyse cost: (%d / %d = %d) ms",d==null?void 0:d.requestId,C,F,Math.round(C/F*1e3)/1e3),h}static async analyseInstantWithThreshed(s,t,i,n,o,a,e,c="",r=3,d=!0,l=!1,M={}){var W,T,C;s.lng=O.LngLatHelper.convertToStdLng(s.lng);const{v0:f,label:m}=s.sog?{v0:s.sog,label:"Other"}:{v0:o.speed,label:"CP"},Y=A.assembleProperties(n,o.loadCondition,f,0),j=O.LaneHelper.calculateSubRoute(s,a);if(((W=j[0])==null?void 0:W.length)<=1)return;const v=e.length?O.LaneHelper.calculateSubWaypoints(s,e):[];v.forEach(F=>F.important=!0);let p=O.LaneHelper.simplifyRouteToCoordinates(j,v,0),h=0,I=0,w=0,y=0,b;const x={hours:[],wps:[],days:[]};for(t=g(t).utc();p.length>0;){const F=r-t.hour()%r;let P=Math.ceil(t.clone().add(F,"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(Y,t,i.clone(),P,h,p,c,d,l,M),(T=b.from)!=null&&T.speed&&(x.hours.push(b.from),b!=null&&b.wps&&x.wps.push(...b.wps),x.days.push(...b.days)),p=b==null?void 0:b.next,p.length||(x.hours.push(b==null?void 0:b.to),b!=null&&b.wps&&x.wps.push(...b.wps),x.days.push(b==null?void 0:b.to)),h+=((C=b==null?void 0:b.to)==null?void 0:C.distanceFromPrevious)??0;else{b&&(x.hours.push(b.to),b!=null&&b.wps&&x.wps.push(...b.wps),x.days.push(b.to));break}}const E=x.hours;for(let F=0;F<E.length-1;F++){const P=g(E[F+1].eta).diff(E[F].etd,"hour",!0);I+=E[F].wxFactor*P,w+=E[F].cFactor*P,y+=P}const V=x.hours.at(0),S=x.hours.at(-1);return{sample:x,distance:Math.round(((S==null?void 0:S.distanceFromStart)||0)*1e4)/1e4,etd:g(V.eta).utc().format(),eta:g(S==null?void 0:S.eta).utc().format(),wxFactor:Math.round(I/y*1e4)/1e4,cFactor:Math.round(w/y*1e4)/1e4,avgSpeed:Math.round(((S==null?void 0:S.distanceFromStart)||0)/y*1e4)/1e4,totalHrs:Math.round(y*1e4)/1e4,from:s,to:S,route:j,waypoints:v,v0:f,label:m}}}H.AISImpl=z,H.AlertHelper=U,H.AlertLevel=G,H.HifleetImpl=rt,H.LoadCondition=Q,H.MyShipImpl=dt,H.MyVesselImpl=it,H.ShipxyImpl=ct,H.SpeedHelper=A,H.SpeedLabel=X,H.VesselTag=J,H.alertHelper=ut,Object.defineProperty(H,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/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"})});
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",
4
+ "version": "1.4.6",
5
5
  "description": "idm plugin for vessel",
6
6
  "type": "module",
7
7
  "keywords": [
@@ -27,7 +27,7 @@
27
27
  "release": "yarn build && yarn publish --access public"
28
28
  },
29
29
  "dependencies": {
30
- "@idm-plugin/geo": "^1.3.2",
30
+ "@idm-plugin/geo": "^1.5.7",
31
31
  "@idm-plugin/meteo": "^0.0.2",
32
32
  "@log4js-node/log4js-api": "^1.0.2",
33
33
  "got": "11",