@idm-plugin/vessel 1.0.2 → 1.0.4

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