@idm-plugin/vessel 1.3.6 → 1.3.7

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