Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
dstTechnologyPlatform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
node_server
dstTechnologyPlatform
Commits
59999959
Commit
59999959
authored
Aug 18, 2026
by
PC-20251223ZVQQ\Administrator
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
星纵电表数据接入
parent
b3046c21
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1542 additions
and
175 deletions
+1542
-175
package-lock.json
package-lock.json
+978
-64
package.json
package.json
+1
-0
serverConfig.xml
serverConfig.xml
+7
-0
dataIntegration.ts
src/biz/dataIntegration.ts
+51
-10
device.ts
src/biz/device.ts
+162
-84
mqttClient.ts
src/biz/mqttClient.ts
+66
-0
running.ts
src/biz/running.ts
+158
-14
serverConfig.ts
src/config/serverConfig.ts
+15
-1
systemClass.ts
src/config/systemClass.ts
+9
-0
main.ts
src/main.ts
+5
-2
admin.ts
src/routers/admin.ts
+44
-0
mqttInit.ts
src/service/mqttInit.ts
+46
-0
No files found.
package-lock.json
View file @
59999959
...
...
@@ -24,6 +24,7 @@
"md5"
:
"^2.2.1"
,
"moment"
:
"^2.24.0"
,
"mongoose"
:
"^7.6.0"
,
"mqtt"
:
"^5.15.2"
,
"mysql"
:
"^2.18.1"
,
"mysql2"
:
"^3.6.0"
,
"node-xlsx"
:
"^0.16.1"
,
...
...
@@ -110,18 +111,14 @@
}
},
"node_modules/@babel/runtime"
:
{
"version"
:
"7.13.10"
,
"resolved"
:
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz"
,
"integrity"
:
"sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw=="
,
"dependencies"
:
{
"regenerator-runtime"
:
"^0.13.4"
"version"
:
"7.29.7"
,
"resolved"
:
"https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.7.tgz"
,
"integrity"
:
"sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=6.9.0"
}
},
"node_modules/@babel/runtime/node_modules/regenerator-runtime"
:
{
"version"
:
"0.13.7"
,
"resolved"
:
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz"
,
"integrity"
:
"sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
},
"node_modules/@colors/colors"
:
{
"version"
:
"1.6.0"
,
"resolved"
:
"https://registry.npmmirror.com/@colors/colors/-/colors-1.6.0.tgz"
,
...
...
@@ -234,6 +231,15 @@
"integrity"
:
"sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="
,
"dev"
:
true
},
"node_modules/@types/readable-stream"
:
{
"version"
:
"4.0.24"
,
"resolved"
:
"https://registry.npmmirror.com/@types/readable-stream/-/readable-stream-4.0.24.tgz"
,
"integrity"
:
"sha512-NRvUNC/JFGPJvqdAfEve8oginbM6V08u5NzLWpG8MwA2kTPOLnqk+wpwuPT+mp3aUsxyuT6m2gnrPuHYCruzEg=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@types/node"
:
"*"
}
},
"node_modules/@types/send"
:
{
"version"
:
"0.17.4"
,
"resolved"
:
"https://registry.npmmirror.com/@types/send/-/send-0.17.4.tgz"
,
...
...
@@ -279,6 +285,27 @@
"@types/webidl-conversions"
:
"*"
}
},
"node_modules/@types/ws"
:
{
"version"
:
"8.18.1"
,
"resolved"
:
"https://registry.npmmirror.com/@types/ws/-/ws-8.18.1.tgz"
,
"integrity"
:
"sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@types/node"
:
"*"
}
},
"node_modules/abort-controller"
:
{
"version"
:
"3.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/abort-controller/-/abort-controller-3.0.0.tgz"
,
"integrity"
:
"sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"event-target-shim"
:
"^5.0.0"
},
"engines"
:
{
"node"
:
">=6.5"
}
},
"node_modules/accepts"
:
{
"version"
:
"1.3.7"
,
"resolved"
:
"https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz"
,
...
...
@@ -411,6 +438,26 @@
"regenerator-runtime"
:
"^0.11.0"
}
},
"node_modules/base64-js"
:
{
"version"
:
"1.5.1"
,
"resolved"
:
"https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz"
,
"integrity"
:
"sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
,
"funding"
:
[
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/feross"
},
{
"type"
:
"patreon"
,
"url"
:
"https://www.patreon.com/feross"
},
{
"type"
:
"consulting"
,
"url"
:
"https://feross.org/support"
}
],
"license"
:
"MIT"
},
"node_modules/bcrypt-pbkdf"
:
{
"version"
:
"1.0.2"
,
"resolved"
:
"https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz"
,
...
...
@@ -427,6 +474,63 @@
"node"
:
"*"
}
},
"node_modules/bl"
:
{
"version"
:
"6.1.6"
,
"resolved"
:
"https://registry.npmmirror.com/bl/-/bl-6.1.6.tgz"
,
"integrity"
:
"sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@types/readable-stream"
:
"^4.0.0"
,
"buffer"
:
"^6.0.3"
,
"inherits"
:
"^2.0.4"
,
"readable-stream"
:
"^4.2.0"
}
},
"node_modules/bl/node_modules/readable-stream"
:
{
"version"
:
"4.7.0"
,
"resolved"
:
"https://registry.npmmirror.com/readable-stream/-/readable-stream-4.7.0.tgz"
,
"integrity"
:
"sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"abort-controller"
:
"^3.0.0"
,
"buffer"
:
"^6.0.3"
,
"events"
:
"^3.3.0"
,
"process"
:
"^0.11.10"
,
"string_decoder"
:
"^1.3.0"
},
"engines"
:
{
"node"
:
"^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/bl/node_modules/safe-buffer"
:
{
"version"
:
"5.2.1"
,
"resolved"
:
"https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz"
,
"integrity"
:
"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
,
"funding"
:
[
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/feross"
},
{
"type"
:
"patreon"
,
"url"
:
"https://www.patreon.com/feross"
},
{
"type"
:
"consulting"
,
"url"
:
"https://feross.org/support"
}
],
"license"
:
"MIT"
},
"node_modules/bl/node_modules/string_decoder"
:
{
"version"
:
"1.3.0"
,
"resolved"
:
"https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz"
,
"integrity"
:
"sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"safe-buffer"
:
"~5.2.0"
}
},
"node_modules/body-parser"
:
{
"version"
:
"1.20.3"
,
"resolved"
:
"https://registry.npmmirror.com/body-parser/-/body-parser-1.20.3.tgz"
,
...
...
@@ -512,6 +616,24 @@
"url"
:
"https://github.com/sponsors/ljharb"
}
},
"node_modules/broker-factory"
:
{
"version"
:
"3.1.15"
,
"resolved"
:
"https://registry.npmmirror.com/broker-factory/-/broker-factory-3.1.15.tgz"
,
"integrity"
:
"sha512-ko+aWvgNuP49meGrdjUu7rC+Y+Wai3cCPxP3xWwHsHfehFjOh5ZQM2yC4gEB2UddeZ/YXhm0K1eG/L6fxym2Og=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/runtime"
:
"^7.29.7"
,
"fast-unique-numbers"
:
"^9.0.27"
,
"tslib"
:
"^2.8.1"
,
"worker-factory"
:
"^7.0.50"
}
},
"node_modules/broker-factory/node_modules/tslib"
:
{
"version"
:
"2.8.1"
,
"resolved"
:
"https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
,
"integrity"
:
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
,
"license"
:
"0BSD"
},
"node_modules/bson"
:
{
"version"
:
"6.1.0"
,
"resolved"
:
"https://registry.npmmirror.com/bson/-/bson-6.1.0.tgz"
,
...
...
@@ -520,6 +642,30 @@
"node"
:
">=16.20.1"
}
},
"node_modules/buffer"
:
{
"version"
:
"6.0.3"
,
"resolved"
:
"https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz"
,
"integrity"
:
"sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="
,
"funding"
:
[
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/feross"
},
{
"type"
:
"patreon"
,
"url"
:
"https://www.patreon.com/feross"
},
{
"type"
:
"consulting"
,
"url"
:
"https://feross.org/support"
}
],
"license"
:
"MIT"
,
"dependencies"
:
{
"base64-js"
:
"^1.3.1"
,
"ieee754"
:
"^1.2.1"
}
},
"node_modules/buffer-from"
:
{
"version"
:
"1.1.1"
,
"resolved"
:
"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz"
,
...
...
@@ -733,6 +879,12 @@
"resolved"
:
"https://registry.npmjs.org/commander/-/commander-2.17.1.tgz"
,
"integrity"
:
"sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
},
"node_modules/commist"
:
{
"version"
:
"3.2.0"
,
"resolved"
:
"https://registry.npmmirror.com/commist/-/commist-3.2.0.tgz"
,
"integrity"
:
"sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw=="
,
"license"
:
"MIT"
},
"node_modules/compressible"
:
{
"version"
:
"2.0.18"
,
"resolved"
:
"https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz"
,
...
...
@@ -761,6 +913,35 @@
"node"
:
">= 0.8.0"
}
},
"node_modules/concat-stream"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/concat-stream/-/concat-stream-2.0.0.tgz"
,
"integrity"
:
"sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A=="
,
"engines"
:
[
"node >= 6.0"
],
"license"
:
"MIT"
,
"dependencies"
:
{
"buffer-from"
:
"^1.0.0"
,
"inherits"
:
"^2.0.3"
,
"readable-stream"
:
"^3.0.2"
,
"typedarray"
:
"^0.0.6"
}
},
"node_modules/concat-stream/node_modules/readable-stream"
:
{
"version"
:
"3.6.2"
,
"resolved"
:
"https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz"
,
"integrity"
:
"sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"inherits"
:
"^2.0.3"
,
"string_decoder"
:
"^1.1.1"
,
"util-deprecate"
:
"^1.0.1"
},
"engines"
:
{
"node"
:
">= 6"
}
},
"node_modules/connect-history-api-fallback"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz"
,
...
...
@@ -1006,6 +1187,24 @@
"node"
:
">= 0.6"
}
},
"node_modules/event-target-shim"
:
{
"version"
:
"5.0.1"
,
"resolved"
:
"https://registry.npmmirror.com/event-target-shim/-/event-target-shim-5.0.1.tgz"
,
"integrity"
:
"sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=6"
}
},
"node_modules/events"
:
{
"version"
:
"3.3.0"
,
"resolved"
:
"https://registry.npmmirror.com/events/-/events-3.3.0.tgz"
,
"integrity"
:
"sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=0.8.x"
}
},
"node_modules/exit-on-epipe"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"https://registry.npmmirror.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz"
,
...
...
@@ -1193,6 +1392,25 @@
"resolved"
:
"https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz"
,
"integrity"
:
"sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM="
},
"node_modules/fast-unique-numbers"
:
{
"version"
:
"9.0.27"
,
"resolved"
:
"https://registry.npmmirror.com/fast-unique-numbers/-/fast-unique-numbers-9.0.27.tgz"
,
"integrity"
:
"sha512-nDA9ADeINN8SA2u2wCtU+siWFTTDqQR37XvgPIDDmboWQeExz7X0mImxuaN+kJddliIqy2FpVRmnvRZ+j8i1/A=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/runtime"
:
"^7.29.2"
,
"tslib"
:
"^2.8.1"
},
"engines"
:
{
"node"
:
">=18.2.0"
}
},
"node_modules/fast-unique-numbers/node_modules/tslib"
:
{
"version"
:
"2.8.1"
,
"resolved"
:
"https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
,
"integrity"
:
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
,
"license"
:
"0BSD"
},
"node_modules/fecha"
:
{
"version"
:
"4.2.3"
,
"resolved"
:
"https://registry.npmmirror.com/fecha/-/fecha-4.2.3.tgz"
,
...
...
@@ -1432,6 +1650,12 @@
"url"
:
"https://github.com/sponsors/ljharb"
}
},
"node_modules/help-me"
:
{
"version"
:
"5.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/help-me/-/help-me-5.0.0.tgz"
,
"integrity"
:
"sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg=="
,
"license"
:
"MIT"
},
"node_modules/http-errors"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz"
,
...
...
@@ -1447,11 +1671,6 @@
"node"
:
">= 0.8"
}
},
"node_modules/http-errors/node_modules/inherits"
:
{
"version"
:
"2.0.4"
,
"resolved"
:
"https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz"
,
"integrity"
:
"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/http-signature"
:
{
"version"
:
"1.2.0"
,
"resolved"
:
"https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz?cache=0&sync_timestamp=1600868613104&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-signature%2Fdownload%2Fhttp-signature-1.2.0.tgz"
,
...
...
@@ -1549,6 +1768,26 @@
"url"
:
"https://opencollective.com/express"
}
},
"node_modules/ieee754"
:
{
"version"
:
"1.2.1"
,
"resolved"
:
"https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz"
,
"integrity"
:
"sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
,
"funding"
:
[
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/feross"
},
{
"type"
:
"patreon"
,
"url"
:
"https://www.patreon.com/feross"
},
{
"type"
:
"consulting"
,
"url"
:
"https://feross.org/support"
}
],
"license"
:
"BSD-3-Clause"
},
"node_modules/inflection"
:
{
"version"
:
"1.13.4"
,
"resolved"
:
"https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz"
,
...
...
@@ -1558,14 +1797,19 @@
]
},
"node_modules/inherits"
:
{
"version"
:
"2.0.3"
,
"resolved"
:
"https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz"
,
"integrity"
:
"sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
"version"
:
"2.0.4"
,
"resolved"
:
"https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz"
,
"integrity"
:
"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
,
"license"
:
"ISC"
},
"node_modules/ip"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/ip/-/ip-2.0.0.tgz"
,
"integrity"
:
"sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
"node_modules/ip-address"
:
{
"version"
:
"10.5.0"
,
"resolved"
:
"https://registry.npmmirror.com/ip-address/-/ip-address-10.5.0.tgz"
,
"integrity"
:
"sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g=="
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">= 12"
}
},
"node_modules/ipaddr.js"
:
{
"version"
:
"1.9.1"
,
...
...
@@ -1616,6 +1860,16 @@
"resolved"
:
"https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz"
,
"integrity"
:
"sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"node_modules/js-sdsl"
:
{
"version"
:
"4.3.0"
,
"resolved"
:
"https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.3.0.tgz"
,
"integrity"
:
"sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ=="
,
"license"
:
"MIT"
,
"funding"
:
{
"type"
:
"opencollective"
,
"url"
:
"https://opencollective.com/js-sdsl"
}
},
"node_modules/jsbn"
:
{
"version"
:
"0.1.1"
,
"resolved"
:
"https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz"
,
...
...
@@ -1838,6 +2092,15 @@
"node"
:
">= 0.6"
}
},
"node_modules/minimist"
:
{
"version"
:
"1.2.8"
,
"resolved"
:
"https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz"
,
"integrity"
:
"sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
,
"license"
:
"MIT"
,
"funding"
:
{
"url"
:
"https://github.com/sponsors/ljharb"
}
},
"node_modules/moment"
:
{
"version"
:
"2.29.1"
,
"resolved"
:
"https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz?cache=0&sync_timestamp=1601983320283&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment%2Fdownload%2Fmoment-2.29.1.tgz"
,
...
...
@@ -1995,6 +2258,167 @@
"node"
:
">=4.0.0"
}
},
"node_modules/mqtt"
:
{
"version"
:
"5.15.2"
,
"resolved"
:
"https://registry.npmmirror.com/mqtt/-/mqtt-5.15.2.tgz"
,
"integrity"
:
"sha512-VWZU2CSUY3U3oN0PSBRDE5SNsFi4zqqNeQ/uv3pZWqY3CrBXD/dhd0ZLjlsk5YnebGlrapi4lRVNJPUNQ5aZ3w=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@types/readable-stream"
:
"^4.0.21"
,
"@types/ws"
:
"^8.18.1"
,
"commist"
:
"^3.2.0"
,
"concat-stream"
:
"^2.0.0"
,
"debug"
:
"^4.4.1"
,
"help-me"
:
"^5.0.0"
,
"lru-cache"
:
"^10.4.3"
,
"minimist"
:
"^1.2.8"
,
"mqtt-packet"
:
"^9.0.2"
,
"number-allocator"
:
"^1.0.14"
,
"readable-stream"
:
"^4.7.0"
,
"rfdc"
:
"^1.4.1"
,
"socks"
:
"^2.8.6"
,
"split2"
:
"^4.2.0"
,
"worker-timers"
:
"^8.0.23"
,
"ws"
:
"^8.18.3"
},
"bin"
:
{
"mqtt"
:
"build/bin/mqtt.js"
,
"mqtt_pub"
:
"build/bin/pub.js"
,
"mqtt_sub"
:
"build/bin/sub.js"
},
"engines"
:
{
"node"
:
">=16.0.0"
}
},
"node_modules/mqtt-packet"
:
{
"version"
:
"9.0.2"
,
"resolved"
:
"https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-9.0.2.tgz"
,
"integrity"
:
"sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"bl"
:
"^6.0.8"
,
"debug"
:
"^4.3.4"
,
"process-nextick-args"
:
"^2.0.1"
}
},
"node_modules/mqtt-packet/node_modules/debug"
:
{
"version"
:
"4.4.3"
,
"resolved"
:
"https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz"
,
"integrity"
:
"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"ms"
:
"^2.1.3"
},
"engines"
:
{
"node"
:
">=6.0"
},
"peerDependenciesMeta"
:
{
"supports-color"
:
{
"optional"
:
true
}
}
},
"node_modules/mqtt-packet/node_modules/ms"
:
{
"version"
:
"2.1.3"
,
"resolved"
:
"https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz"
,
"integrity"
:
"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
,
"license"
:
"MIT"
},
"node_modules/mqtt/node_modules/debug"
:
{
"version"
:
"4.4.3"
,
"resolved"
:
"https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz"
,
"integrity"
:
"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"ms"
:
"^2.1.3"
},
"engines"
:
{
"node"
:
">=6.0"
},
"peerDependenciesMeta"
:
{
"supports-color"
:
{
"optional"
:
true
}
}
},
"node_modules/mqtt/node_modules/lru-cache"
:
{
"version"
:
"10.4.3"
,
"resolved"
:
"https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz"
,
"integrity"
:
"sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
,
"license"
:
"ISC"
},
"node_modules/mqtt/node_modules/ms"
:
{
"version"
:
"2.1.3"
,
"resolved"
:
"https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz"
,
"integrity"
:
"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
,
"license"
:
"MIT"
},
"node_modules/mqtt/node_modules/readable-stream"
:
{
"version"
:
"4.7.0"
,
"resolved"
:
"https://registry.npmmirror.com/readable-stream/-/readable-stream-4.7.0.tgz"
,
"integrity"
:
"sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"abort-controller"
:
"^3.0.0"
,
"buffer"
:
"^6.0.3"
,
"events"
:
"^3.3.0"
,
"process"
:
"^0.11.10"
,
"string_decoder"
:
"^1.3.0"
},
"engines"
:
{
"node"
:
"^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/mqtt/node_modules/safe-buffer"
:
{
"version"
:
"5.2.1"
,
"resolved"
:
"https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz"
,
"integrity"
:
"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
,
"funding"
:
[
{
"type"
:
"github"
,
"url"
:
"https://github.com/sponsors/feross"
},
{
"type"
:
"patreon"
,
"url"
:
"https://www.patreon.com/feross"
},
{
"type"
:
"consulting"
,
"url"
:
"https://feross.org/support"
}
],
"license"
:
"MIT"
},
"node_modules/mqtt/node_modules/string_decoder"
:
{
"version"
:
"1.3.0"
,
"resolved"
:
"https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz"
,
"integrity"
:
"sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"safe-buffer"
:
"~5.2.0"
}
},
"node_modules/mqtt/node_modules/ws"
:
{
"version"
:
"8.21.3"
,
"resolved"
:
"https://registry.npmmirror.com/ws/-/ws-8.21.3.tgz"
,
"integrity"
:
"sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">=10.0.0"
},
"peerDependencies"
:
{
"bufferutil"
:
"^4.0.1"
,
"utf-8-validate"
:
">=5.0.2"
},
"peerDependenciesMeta"
:
{
"bufferutil"
:
{
"optional"
:
true
},
"utf-8-validate"
:
{
"optional"
:
true
}
}
},
"node_modules/mquery"
:
{
"version"
:
"5.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/mquery/-/mquery-5.0.0.tgz"
,
...
...
@@ -2180,6 +2604,39 @@
"node"
:
">=6.0.0"
}
},
"node_modules/number-allocator"
:
{
"version"
:
"1.0.14"
,
"resolved"
:
"https://registry.npmmirror.com/number-allocator/-/number-allocator-1.0.14.tgz"
,
"integrity"
:
"sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"debug"
:
"^4.3.1"
,
"js-sdsl"
:
"4.3.0"
}
},
"node_modules/number-allocator/node_modules/debug"
:
{
"version"
:
"4.4.3"
,
"resolved"
:
"https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz"
,
"integrity"
:
"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"ms"
:
"^2.1.3"
},
"engines"
:
{
"node"
:
">=6.0"
},
"peerDependenciesMeta"
:
{
"supports-color"
:
{
"optional"
:
true
}
}
},
"node_modules/number-allocator/node_modules/ms"
:
{
"version"
:
"2.1.3"
,
"resolved"
:
"https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz"
,
"integrity"
:
"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
,
"license"
:
"MIT"
},
"node_modules/oauth-sign"
:
{
"version"
:
"0.9.0"
,
"resolved"
:
"https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz"
,
...
...
@@ -2268,6 +2725,15 @@
"node"
:
">=0.8"
}
},
"node_modules/process"
:
{
"version"
:
"0.11.10"
,
"resolved"
:
"https://registry.npmmirror.com/process/-/process-0.11.10.tgz"
,
"integrity"
:
"sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
,
"license"
:
"MIT"
,
"engines"
:
{
"node"
:
">= 0.6.0"
}
},
"node_modules/process-nextick-args"
:
{
"version"
:
"2.0.1"
,
"resolved"
:
"https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz"
,
...
...
@@ -2422,9 +2888,10 @@
"integrity"
:
"sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA=="
},
"node_modules/rfdc"
:
{
"version"
:
"1.3.0"
,
"resolved"
:
"https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz"
,
"integrity"
:
"sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
"version"
:
"1.4.1"
,
"resolved"
:
"https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz"
,
"integrity"
:
"sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="
,
"license"
:
"MIT"
},
"node_modules/safe-buffer"
:
{
"version"
:
"5.1.2"
,
...
...
@@ -2848,15 +3315,16 @@
}
},
"node_modules/socks"
:
{
"version"
:
"2.7.1"
,
"resolved"
:
"https://registry.npmmirror.com/socks/-/socks-2.7.1.tgz"
,
"integrity"
:
"sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ=="
,
"version"
:
"2.8.9"
,
"resolved"
:
"https://registry.npmmirror.com/socks/-/socks-2.8.9.tgz"
,
"integrity"
:
"sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"ip
"
:
"^2.0.0
"
,
"ip
-address"
:
"^10.1.1
"
,
"smart-buffer"
:
"^4.2.0"
},
"engines"
:
{
"node"
:
">= 10.
13
.0"
,
"node"
:
">= 10.
0
.0"
,
"npm"
:
">= 3.0.0"
}
},
...
...
@@ -2869,6 +3337,15 @@
"memory-pager"
:
"^1.0.2"
}
},
"node_modules/split2"
:
{
"version"
:
"4.2.0"
,
"resolved"
:
"https://registry.npmmirror.com/split2/-/split2-4.2.0.tgz"
,
"integrity"
:
"sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="
,
"license"
:
"ISC"
,
"engines"
:
{
"node"
:
">= 10.x"
}
},
"node_modules/sqlstring"
:
{
"version"
:
"2.3.1"
,
"resolved"
:
"https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz"
,
...
...
@@ -3108,6 +3585,12 @@
"node"
:
">= 0.6"
}
},
"node_modules/typedarray"
:
{
"version"
:
"0.0.6"
,
"resolved"
:
"https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz"
,
"integrity"
:
"sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
,
"license"
:
"MIT"
},
"node_modules/universalify"
:
{
"version"
:
"0.1.2"
,
"resolved"
:
"https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz"
,
...
...
@@ -3281,6 +3764,77 @@
"node"
:
">=0.8"
}
},
"node_modules/worker-factory"
:
{
"version"
:
"7.0.50"
,
"resolved"
:
"https://registry.npmmirror.com/worker-factory/-/worker-factory-7.0.50.tgz"
,
"integrity"
:
"sha512-hhwc0G+sFwM4qBuhJIUBn2p1Jf8v/FwmLUANBf/Q+Lt2uI8mfIZQhXaZQACodQD4R7Zp6cn/6702bIvNn2puJQ=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/runtime"
:
"^7.29.7"
,
"fast-unique-numbers"
:
"^9.0.27"
,
"tslib"
:
"^2.8.1"
}
},
"node_modules/worker-factory/node_modules/tslib"
:
{
"version"
:
"2.8.1"
,
"resolved"
:
"https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
,
"integrity"
:
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
,
"license"
:
"0BSD"
},
"node_modules/worker-timers"
:
{
"version"
:
"8.0.34"
,
"resolved"
:
"https://registry.npmmirror.com/worker-timers/-/worker-timers-8.0.34.tgz"
,
"integrity"
:
"sha512-WXL+Dqsm0G6dnC66rQsvM3tPT2adhbqSirWUCZGglkALOr8ocS0KlpU0iuKbjflJOlu3ydZikMEVrYnHOM9suw=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/runtime"
:
"^7.29.7"
,
"tslib"
:
"^2.8.1"
,
"worker-timers-broker"
:
"^8.0.18"
,
"worker-timers-worker"
:
"^9.0.15"
}
},
"node_modules/worker-timers-broker"
:
{
"version"
:
"8.0.18"
,
"resolved"
:
"https://registry.npmmirror.com/worker-timers-broker/-/worker-timers-broker-8.0.18.tgz"
,
"integrity"
:
"sha512-FrjzDVX1wKfZN0gRbCFqv8VHuTncG4sbI/WGEg4tSSQeIsnwqg4YBYWMAHYLJtUDEYYmiK65UKFrVMVk2irDSg=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/runtime"
:
"^7.29.7"
,
"broker-factory"
:
"^3.1.15"
,
"fast-unique-numbers"
:
"^9.0.27"
,
"tslib"
:
"^2.8.1"
,
"worker-timers-worker"
:
"^9.0.15"
}
},
"node_modules/worker-timers-broker/node_modules/tslib"
:
{
"version"
:
"2.8.1"
,
"resolved"
:
"https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
,
"integrity"
:
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
,
"license"
:
"0BSD"
},
"node_modules/worker-timers-worker"
:
{
"version"
:
"9.0.15"
,
"resolved"
:
"https://registry.npmmirror.com/worker-timers-worker/-/worker-timers-worker-9.0.15.tgz"
,
"integrity"
:
"sha512-KKUe7lZ/Aignr51H6hOUik8LwTnIgojH/1lwhli8A8qIEIyewogZTpNpMW5B6BF7nmwBOkUoTYgf1H3QShcjSA=="
,
"license"
:
"MIT"
,
"dependencies"
:
{
"@babel/runtime"
:
"^7.29.7"
,
"tslib"
:
"^2.8.1"
,
"worker-factory"
:
"^7.0.50"
}
},
"node_modules/worker-timers-worker/node_modules/tslib"
:
{
"version"
:
"2.8.1"
,
"resolved"
:
"https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
,
"integrity"
:
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
,
"license"
:
"0BSD"
},
"node_modules/worker-timers/node_modules/tslib"
:
{
"version"
:
"2.8.1"
,
"resolved"
:
"https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
,
"integrity"
:
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
,
"license"
:
"0BSD"
},
"node_modules/ws"
:
{
"version"
:
"5.2.2"
,
"resolved"
:
"https://registry.npm.taobao.org/ws/download/ws-5.2.2.tgz?cache=0&sync_timestamp=1615063662500&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-5.2.2.tgz"
,
...
...
@@ -3426,19 +3980,9 @@
}
},
"@babel/runtime"
:
{
"version"
:
"7.13.10"
,
"resolved"
:
"https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz"
,
"integrity"
:
"sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw=="
,
"requires"
:
{
"regenerator-runtime"
:
"^0.13.4"
},
"dependencies"
:
{
"regenerator-runtime"
:
{
"version"
:
"0.13.7"
,
"resolved"
:
"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz"
,
"integrity"
:
"sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
}
}
"version"
:
"7.29.7"
,
"resolved"
:
"https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.7.tgz"
,
"integrity"
:
"sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="
},
"@colors/colors"
:
{
"version"
:
"1.6.0"
,
...
...
@@ -3549,6 +4093,14 @@
"integrity"
:
"sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="
,
"dev"
:
true
},
"@types/readable-stream"
:
{
"version"
:
"4.0.24"
,
"resolved"
:
"https://registry.npmmirror.com/@types/readable-stream/-/readable-stream-4.0.24.tgz"
,
"integrity"
:
"sha512-NRvUNC/JFGPJvqdAfEve8oginbM6V08u5NzLWpG8MwA2kTPOLnqk+wpwuPT+mp3aUsxyuT6m2gnrPuHYCruzEg=="
,
"requires"
:
{
"@types/node"
:
"*"
}
},
"@types/send"
:
{
"version"
:
"0.17.4"
,
"resolved"
:
"https://registry.npmmirror.com/@types/send/-/send-0.17.4.tgz"
,
...
...
@@ -3594,6 +4146,22 @@
"@types/webidl-conversions"
:
"*"
}
},
"@types/ws"
:
{
"version"
:
"8.18.1"
,
"resolved"
:
"https://registry.npmmirror.com/@types/ws/-/ws-8.18.1.tgz"
,
"integrity"
:
"sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="
,
"requires"
:
{
"@types/node"
:
"*"
}
},
"abort-controller"
:
{
"version"
:
"3.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/abort-controller/-/abort-controller-3.0.0.tgz"
,
"integrity"
:
"sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="
,
"requires"
:
{
"event-target-shim"
:
"^5.0.0"
}
},
"accepts"
:
{
"version"
:
"1.3.7"
,
"resolved"
:
"https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz"
,
...
...
@@ -3698,6 +4266,11 @@
"regenerator-runtime"
:
"^0.11.0"
}
},
"base64-js"
:
{
"version"
:
"1.5.1"
,
"resolved"
:
"https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz"
,
"integrity"
:
"sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
},
"bcrypt-pbkdf"
:
{
"version"
:
"1.0.2"
,
"resolved"
:
"https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz"
,
...
...
@@ -3711,6 +4284,44 @@
"resolved"
:
"https://registry.npm.taobao.org/bignumber.js/download/bignumber.js-9.0.1.tgz"
,
"integrity"
:
"sha1-jXuhJMiCv9jkMmDGdHVRjQaJ5OU="
},
"bl"
:
{
"version"
:
"6.1.6"
,
"resolved"
:
"https://registry.npmmirror.com/bl/-/bl-6.1.6.tgz"
,
"integrity"
:
"sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg=="
,
"requires"
:
{
"@types/readable-stream"
:
"^4.0.0"
,
"buffer"
:
"^6.0.3"
,
"inherits"
:
"^2.0.4"
,
"readable-stream"
:
"^4.2.0"
},
"dependencies"
:
{
"readable-stream"
:
{
"version"
:
"4.7.0"
,
"resolved"
:
"https://registry.npmmirror.com/readable-stream/-/readable-stream-4.7.0.tgz"
,
"integrity"
:
"sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="
,
"requires"
:
{
"abort-controller"
:
"^3.0.0"
,
"buffer"
:
"^6.0.3"
,
"events"
:
"^3.3.0"
,
"process"
:
"^0.11.10"
,
"string_decoder"
:
"^1.3.0"
}
},
"safe-buffer"
:
{
"version"
:
"5.2.1"
,
"resolved"
:
"https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz"
,
"integrity"
:
"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
},
"string_decoder"
:
{
"version"
:
"1.3.0"
,
"resolved"
:
"https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz"
,
"integrity"
:
"sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="
,
"requires"
:
{
"safe-buffer"
:
"~5.2.0"
}
}
}
},
"body-parser"
:
{
"version"
:
"1.20.3"
,
"resolved"
:
"https://registry.npmmirror.com/body-parser/-/body-parser-1.20.3.tgz"
,
...
...
@@ -3770,11 +4381,38 @@
}
}
},
"broker-factory"
:
{
"version"
:
"3.1.15"
,
"resolved"
:
"https://registry.npmmirror.com/broker-factory/-/broker-factory-3.1.15.tgz"
,
"integrity"
:
"sha512-ko+aWvgNuP49meGrdjUu7rC+Y+Wai3cCPxP3xWwHsHfehFjOh5ZQM2yC4gEB2UddeZ/YXhm0K1eG/L6fxym2Og=="
,
"requires"
:
{
"@babel/runtime"
:
"^7.29.7"
,
"fast-unique-numbers"
:
"^9.0.27"
,
"tslib"
:
"^2.8.1"
,
"worker-factory"
:
"^7.0.50"
},
"dependencies"
:
{
"tslib"
:
{
"version"
:
"2.8.1"
,
"resolved"
:
"https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
,
"integrity"
:
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
}
}
},
"bson"
:
{
"version"
:
"6.1.0"
,
"resolved"
:
"https://registry.npmmirror.com/bson/-/bson-6.1.0.tgz"
,
"integrity"
:
"sha512-yiQ3KxvpVoRpx1oD1uPz4Jit9tAVTJgjdmjDKtUErkOoL9VNoF8Dd58qtAOL5E40exx2jvAT9sqdRSK/r+SHlA=="
},
"buffer"
:
{
"version"
:
"6.0.3"
,
"resolved"
:
"https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz"
,
"integrity"
:
"sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="
,
"requires"
:
{
"base64-js"
:
"^1.3.1"
,
"ieee754"
:
"^1.2.1"
}
},
"buffer-from"
:
{
"version"
:
"1.1.1"
,
"resolved"
:
"https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz"
,
...
...
@@ -3943,6 +4581,11 @@
"resolved"
:
"https://registry.npmjs.org/commander/-/commander-2.17.1.tgz"
,
"integrity"
:
"sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
},
"commist"
:
{
"version"
:
"3.2.0"
,
"resolved"
:
"https://registry.npmmirror.com/commist/-/commist-3.2.0.tgz"
,
"integrity"
:
"sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw=="
},
"compressible"
:
{
"version"
:
"2.0.18"
,
"resolved"
:
"https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz"
,
...
...
@@ -3965,6 +4608,29 @@
"vary"
:
"~1.1.2"
}
},
"concat-stream"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/concat-stream/-/concat-stream-2.0.0.tgz"
,
"integrity"
:
"sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A=="
,
"requires"
:
{
"buffer-from"
:
"^1.0.0"
,
"inherits"
:
"^2.0.3"
,
"readable-stream"
:
"^3.0.2"
,
"typedarray"
:
"^0.0.6"
},
"dependencies"
:
{
"readable-stream"
:
{
"version"
:
"3.6.2"
,
"resolved"
:
"https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz"
,
"integrity"
:
"sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="
,
"requires"
:
{
"inherits"
:
"^2.0.3"
,
"string_decoder"
:
"^1.1.1"
,
"util-deprecate"
:
"^1.0.1"
}
}
}
},
"connect-history-api-fallback"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz"
,
...
...
@@ -4137,6 +4803,16 @@
"resolved"
:
"https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz"
,
"integrity"
:
"sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
},
"event-target-shim"
:
{
"version"
:
"5.0.1"
,
"resolved"
:
"https://registry.npmmirror.com/event-target-shim/-/event-target-shim-5.0.1.tgz"
,
"integrity"
:
"sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
},
"events"
:
{
"version"
:
"3.3.0"
,
"resolved"
:
"https://registry.npmmirror.com/events/-/events-3.3.0.tgz"
,
"integrity"
:
"sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
},
"exit-on-epipe"
:
{
"version"
:
"1.0.1"
,
"resolved"
:
"https://registry.npmmirror.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz"
,
...
...
@@ -4269,6 +4945,22 @@
"resolved"
:
"https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz"
,
"integrity"
:
"sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM="
},
"fast-unique-numbers"
:
{
"version"
:
"9.0.27"
,
"resolved"
:
"https://registry.npmmirror.com/fast-unique-numbers/-/fast-unique-numbers-9.0.27.tgz"
,
"integrity"
:
"sha512-nDA9ADeINN8SA2u2wCtU+siWFTTDqQR37XvgPIDDmboWQeExz7X0mImxuaN+kJddliIqy2FpVRmnvRZ+j8i1/A=="
,
"requires"
:
{
"@babel/runtime"
:
"^7.29.2"
,
"tslib"
:
"^2.8.1"
},
"dependencies"
:
{
"tslib"
:
{
"version"
:
"2.8.1"
,
"resolved"
:
"https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
,
"integrity"
:
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
}
}
},
"fecha"
:
{
"version"
:
"4.2.3"
,
"resolved"
:
"https://registry.npmmirror.com/fecha/-/fecha-4.2.3.tgz"
,
...
...
@@ -4445,6 +5137,11 @@
}
}
},
"help-me"
:
{
"version"
:
"5.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/help-me/-/help-me-5.0.0.tgz"
,
"integrity"
:
"sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg=="
},
"http-errors"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz"
,
...
...
@@ -4455,13 +5152,6 @@
"setprototypeof"
:
"1.2.0"
,
"statuses"
:
"2.0.1"
,
"toidentifier"
:
"1.0.1"
},
"dependencies"
:
{
"inherits"
:
{
"version"
:
"2.0.4"
,
"resolved"
:
"https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz"
,
"integrity"
:
"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
}
}
},
"http-signature"
:
{
...
...
@@ -4535,20 +5225,25 @@
"safer-buffer"
:
">= 2.1.2 < 3.0.0"
}
},
"ieee754"
:
{
"version"
:
"1.2.1"
,
"resolved"
:
"https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz"
,
"integrity"
:
"sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
},
"inflection"
:
{
"version"
:
"1.13.4"
,
"resolved"
:
"https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz"
,
"integrity"
:
"sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw=="
},
"inherits"
:
{
"version"
:
"2.0.
3
"
,
"resolved"
:
"https://registry.npm
.taobao.org/inherits/download/inherits-2.0.3
.tgz"
,
"integrity"
:
"sha
1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4
="
"version"
:
"2.0.
4
"
,
"resolved"
:
"https://registry.npm
mirror.com/inherits/-/inherits-2.0.4
.tgz"
,
"integrity"
:
"sha
512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=
="
},
"ip"
:
{
"version"
:
"
2.0
.0"
,
"resolved"
:
"https://registry.npmmirror.com/ip
/-/ip-2.0
.0.tgz"
,
"integrity"
:
"sha512-
WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ
=="
"ip
-address
"
:
{
"version"
:
"
10.5
.0"
,
"resolved"
:
"https://registry.npmmirror.com/ip
-address/-/ip-address-10.5
.0.tgz"
,
"integrity"
:
"sha512-
R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g
=="
},
"ipaddr.js"
:
{
"version"
:
"1.9.1"
,
...
...
@@ -4590,6 +5285,11 @@
"resolved"
:
"https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz"
,
"integrity"
:
"sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"js-sdsl"
:
{
"version"
:
"4.3.0"
,
"resolved"
:
"https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.3.0.tgz"
,
"integrity"
:
"sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ=="
},
"jsbn"
:
{
"version"
:
"0.1.1"
,
"resolved"
:
"https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz"
,
...
...
@@ -4772,6 +5472,11 @@
"mime-db"
:
"1.46.0"
}
},
"minimist"
:
{
"version"
:
"1.2.8"
,
"resolved"
:
"https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz"
,
"integrity"
:
"sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
},
"moment"
:
{
"version"
:
"2.29.1"
,
"resolved"
:
"https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz?cache=0&sync_timestamp=1601983320283&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment%2Fdownload%2Fmoment-2.29.1.tgz"
,
...
...
@@ -4874,6 +5579,105 @@
"resolved"
:
"https://registry.npmmirror.com/mpath/-/mpath-0.9.0.tgz"
,
"integrity"
:
"sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew=="
},
"mqtt"
:
{
"version"
:
"5.15.2"
,
"resolved"
:
"https://registry.npmmirror.com/mqtt/-/mqtt-5.15.2.tgz"
,
"integrity"
:
"sha512-VWZU2CSUY3U3oN0PSBRDE5SNsFi4zqqNeQ/uv3pZWqY3CrBXD/dhd0ZLjlsk5YnebGlrapi4lRVNJPUNQ5aZ3w=="
,
"requires"
:
{
"@types/readable-stream"
:
"^4.0.21"
,
"@types/ws"
:
"^8.18.1"
,
"commist"
:
"^3.2.0"
,
"concat-stream"
:
"^2.0.0"
,
"debug"
:
"^4.4.1"
,
"help-me"
:
"^5.0.0"
,
"lru-cache"
:
"^10.4.3"
,
"minimist"
:
"^1.2.8"
,
"mqtt-packet"
:
"^9.0.2"
,
"number-allocator"
:
"^1.0.14"
,
"readable-stream"
:
"^4.7.0"
,
"rfdc"
:
"^1.4.1"
,
"socks"
:
"^2.8.6"
,
"split2"
:
"^4.2.0"
,
"worker-timers"
:
"^8.0.23"
,
"ws"
:
"^8.18.3"
},
"dependencies"
:
{
"debug"
:
{
"version"
:
"4.4.3"
,
"resolved"
:
"https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz"
,
"integrity"
:
"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="
,
"requires"
:
{
"ms"
:
"^2.1.3"
}
},
"lru-cache"
:
{
"version"
:
"10.4.3"
,
"resolved"
:
"https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz"
,
"integrity"
:
"sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
},
"ms"
:
{
"version"
:
"2.1.3"
,
"resolved"
:
"https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz"
,
"integrity"
:
"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"readable-stream"
:
{
"version"
:
"4.7.0"
,
"resolved"
:
"https://registry.npmmirror.com/readable-stream/-/readable-stream-4.7.0.tgz"
,
"integrity"
:
"sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="
,
"requires"
:
{
"abort-controller"
:
"^3.0.0"
,
"buffer"
:
"^6.0.3"
,
"events"
:
"^3.3.0"
,
"process"
:
"^0.11.10"
,
"string_decoder"
:
"^1.3.0"
}
},
"safe-buffer"
:
{
"version"
:
"5.2.1"
,
"resolved"
:
"https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz"
,
"integrity"
:
"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
},
"string_decoder"
:
{
"version"
:
"1.3.0"
,
"resolved"
:
"https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz"
,
"integrity"
:
"sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="
,
"requires"
:
{
"safe-buffer"
:
"~5.2.0"
}
},
"ws"
:
{
"version"
:
"8.21.3"
,
"resolved"
:
"https://registry.npmmirror.com/ws/-/ws-8.21.3.tgz"
,
"integrity"
:
"sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="
,
"requires"
:
{}
}
}
},
"mqtt-packet"
:
{
"version"
:
"9.0.2"
,
"resolved"
:
"https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-9.0.2.tgz"
,
"integrity"
:
"sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA=="
,
"requires"
:
{
"bl"
:
"^6.0.8"
,
"debug"
:
"^4.3.4"
,
"process-nextick-args"
:
"^2.0.1"
},
"dependencies"
:
{
"debug"
:
{
"version"
:
"4.4.3"
,
"resolved"
:
"https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz"
,
"integrity"
:
"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="
,
"requires"
:
{
"ms"
:
"^2.1.3"
}
},
"ms"
:
{
"version"
:
"2.1.3"
,
"resolved"
:
"https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz"
,
"integrity"
:
"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
}
}
},
"mquery"
:
{
"version"
:
"5.0.0"
,
"resolved"
:
"https://registry.npmmirror.com/mquery/-/mquery-5.0.0.tgz"
,
...
...
@@ -5009,6 +5813,30 @@
"resolved"
:
"https://registry.npm.taobao.org/nodemailer/download/nodemailer-6.5.0.tgz?cache=0&sync_timestamp=1614329161993&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnodemailer%2Fdownload%2Fnodemailer-6.5.0.tgz"
,
"integrity"
:
"sha1-0Swo2NSHeJGOJfGZnZeRAjGxddk="
},
"number-allocator"
:
{
"version"
:
"1.0.14"
,
"resolved"
:
"https://registry.npmmirror.com/number-allocator/-/number-allocator-1.0.14.tgz"
,
"integrity"
:
"sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA=="
,
"requires"
:
{
"debug"
:
"^4.3.1"
,
"js-sdsl"
:
"4.3.0"
},
"dependencies"
:
{
"debug"
:
{
"version"
:
"4.4.3"
,
"resolved"
:
"https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz"
,
"integrity"
:
"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="
,
"requires"
:
{
"ms"
:
"^2.1.3"
}
},
"ms"
:
{
"version"
:
"2.1.3"
,
"resolved"
:
"https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz"
,
"integrity"
:
"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
}
}
},
"oauth-sign"
:
{
"version"
:
"0.9.0"
,
"resolved"
:
"https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz"
,
...
...
@@ -5073,6 +5901,11 @@
"resolved"
:
"https://registry.npmmirror.com/printj/-/printj-1.1.2.tgz"
,
"integrity"
:
"sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
},
"process"
:
{
"version"
:
"0.11.10"
,
"resolved"
:
"https://registry.npmmirror.com/process/-/process-0.11.10.tgz"
,
"integrity"
:
"sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
},
"process-nextick-args"
:
{
"version"
:
"2.0.1"
,
"resolved"
:
"https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz"
,
...
...
@@ -5200,9 +6033,9 @@
"integrity"
:
"sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA=="
},
"rfdc"
:
{
"version"
:
"1.
3.0
"
,
"resolved"
:
"https://registry.npmmirror.com/rfdc/-/rfdc-1.
3.0
.tgz"
,
"integrity"
:
"sha512-
V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGr
A=="
"version"
:
"1.
4.1
"
,
"resolved"
:
"https://registry.npmmirror.com/rfdc/-/rfdc-1.
4.1
.tgz"
,
"integrity"
:
"sha512-
q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawI
A=="
},
"safe-buffer"
:
{
"version"
:
"5.1.2"
,
...
...
@@ -5487,11 +6320,11 @@
"integrity"
:
"sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
},
"socks"
:
{
"version"
:
"2.
7.1
"
,
"resolved"
:
"https://registry.npmmirror.com/socks/-/socks-2.
7.1
.tgz"
,
"integrity"
:
"sha512-
7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ
=="
,
"version"
:
"2.
8.9
"
,
"resolved"
:
"https://registry.npmmirror.com/socks/-/socks-2.
8.9
.tgz"
,
"integrity"
:
"sha512-
LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw
=="
,
"requires"
:
{
"ip
"
:
"^2.0.0
"
,
"ip
-address"
:
"^10.1.1
"
,
"smart-buffer"
:
"^4.2.0"
}
},
...
...
@@ -5504,6 +6337,11 @@
"memory-pager"
:
"^1.0.2"
}
},
"split2"
:
{
"version"
:
"4.2.0"
,
"resolved"
:
"https://registry.npmmirror.com/split2/-/split2-4.2.0.tgz"
,
"integrity"
:
"sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="
},
"sqlstring"
:
{
"version"
:
"2.3.1"
,
"resolved"
:
"https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz"
,
...
...
@@ -5686,6 +6524,11 @@
"mime-types"
:
"~2.1.24"
}
},
"typedarray"
:
{
"version"
:
"0.0.6"
,
"resolved"
:
"https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz"
,
"integrity"
:
"sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
},
"universalify"
:
{
"version"
:
"0.1.2"
,
"resolved"
:
"https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz"
,
...
...
@@ -5823,6 +6666,77 @@
"resolved"
:
"https://registry.npmmirror.com/word/-/word-0.3.0.tgz"
,
"integrity"
:
"sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
},
"worker-factory"
:
{
"version"
:
"7.0.50"
,
"resolved"
:
"https://registry.npmmirror.com/worker-factory/-/worker-factory-7.0.50.tgz"
,
"integrity"
:
"sha512-hhwc0G+sFwM4qBuhJIUBn2p1Jf8v/FwmLUANBf/Q+Lt2uI8mfIZQhXaZQACodQD4R7Zp6cn/6702bIvNn2puJQ=="
,
"requires"
:
{
"@babel/runtime"
:
"^7.29.7"
,
"fast-unique-numbers"
:
"^9.0.27"
,
"tslib"
:
"^2.8.1"
},
"dependencies"
:
{
"tslib"
:
{
"version"
:
"2.8.1"
,
"resolved"
:
"https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
,
"integrity"
:
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
}
}
},
"worker-timers"
:
{
"version"
:
"8.0.34"
,
"resolved"
:
"https://registry.npmmirror.com/worker-timers/-/worker-timers-8.0.34.tgz"
,
"integrity"
:
"sha512-WXL+Dqsm0G6dnC66rQsvM3tPT2adhbqSirWUCZGglkALOr8ocS0KlpU0iuKbjflJOlu3ydZikMEVrYnHOM9suw=="
,
"requires"
:
{
"@babel/runtime"
:
"^7.29.7"
,
"tslib"
:
"^2.8.1"
,
"worker-timers-broker"
:
"^8.0.18"
,
"worker-timers-worker"
:
"^9.0.15"
},
"dependencies"
:
{
"tslib"
:
{
"version"
:
"2.8.1"
,
"resolved"
:
"https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
,
"integrity"
:
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
}
}
},
"worker-timers-broker"
:
{
"version"
:
"8.0.18"
,
"resolved"
:
"https://registry.npmmirror.com/worker-timers-broker/-/worker-timers-broker-8.0.18.tgz"
,
"integrity"
:
"sha512-FrjzDVX1wKfZN0gRbCFqv8VHuTncG4sbI/WGEg4tSSQeIsnwqg4YBYWMAHYLJtUDEYYmiK65UKFrVMVk2irDSg=="
,
"requires"
:
{
"@babel/runtime"
:
"^7.29.7"
,
"broker-factory"
:
"^3.1.15"
,
"fast-unique-numbers"
:
"^9.0.27"
,
"tslib"
:
"^2.8.1"
,
"worker-timers-worker"
:
"^9.0.15"
},
"dependencies"
:
{
"tslib"
:
{
"version"
:
"2.8.1"
,
"resolved"
:
"https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
,
"integrity"
:
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
}
}
},
"worker-timers-worker"
:
{
"version"
:
"9.0.15"
,
"resolved"
:
"https://registry.npmmirror.com/worker-timers-worker/-/worker-timers-worker-9.0.15.tgz"
,
"integrity"
:
"sha512-KKUe7lZ/Aignr51H6hOUik8LwTnIgojH/1lwhli8A8qIEIyewogZTpNpMW5B6BF7nmwBOkUoTYgf1H3QShcjSA=="
,
"requires"
:
{
"@babel/runtime"
:
"^7.29.7"
,
"tslib"
:
"^2.8.1"
,
"worker-factory"
:
"^7.0.50"
},
"dependencies"
:
{
"tslib"
:
{
"version"
:
"2.8.1"
,
"resolved"
:
"https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
,
"integrity"
:
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
}
}
},
"ws"
:
{
"version"
:
"5.2.2"
,
"resolved"
:
"https://registry.npm.taobao.org/ws/download/ws-5.2.2.tgz?cache=0&sync_timestamp=1615063662500&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-5.2.2.tgz"
,
...
...
package.json
View file @
59999959
...
...
@@ -19,6 +19,7 @@
"
md5
"
:
"^2.2.1"
,
"
moment
"
:
"^2.24.0"
,
"
mongoose
"
:
"^7.6.0"
,
"
mqtt
"
:
"^5.15.2"
,
"
mysql
"
:
"^2.18.1"
,
"
mysql2
"
:
"^3.6.0"
,
"
node-xlsx
"
:
"^0.16.1"
,
...
...
serverConfig.xml
View file @
59999959
...
...
@@ -36,4 +36,11 @@
<!-- PID-TVOC 换算系数(ppb → μg/m³),入库时换算,默认 0.0013 -->
<diqinTvocConvertFactor>
0.0013
</diqinTvocConvertFactor>
</diqin>
<mqttsrv>
<mqttHost>
49.235.185.26
</mqttHost>
<mqttPort>
1883
</mqttPort>
<mqttTopic>
/milesight/uplink/2026
</mqttTopic>
<username>
admin
</username>
<password>
admin123
</password>
</mqttsrv>
</config>
src/biz/dataIntegration.ts
View file @
59999959
...
...
@@ -727,8 +727,8 @@ async function integrateAcDeviceData() {
// TODO: 考虑是否需要在插入前对数据按 device_time 排序,避免数据库存储顺序混乱
// 5. 补偿:
当天无开关机
记录的设备,拉取内机列表实时状态兜底写库(30 分钟节流)
await
compensateAcRealtimeData
(
deviceModel
,
deviceDataModel
,
deviceIdSet
,
toInsert
);
// 5. 补偿:
最近 30 分钟无
记录的设备,拉取内机列表实时状态兜底写库(30 分钟节流)
await
compensateAcRealtimeData
(
deviceModel
,
deviceDataModel
,
toInsert
);
// 6. 批量插入
if
(
toInsert
.
length
>
0
)
{
...
...
@@ -744,14 +744,19 @@ const AC_REALTIME_COMPENSATE_INTERVAL_MS = 30 * 60 * 1000; // 30 分钟
/**
* 空调数据补偿机制:
*
当天无
开关机记录(或记录不全)的设备,拉取内机列表实时状态作为快照写入 device_data,
*
最近 30 分钟内没有
开关机记录(或记录不全)的设备,拉取内机列表实时状态作为快照写入 device_data,
* 避免"不调温不开关机时空调数据不更新"。
* 只补 rows 未覆盖的设备;完全无记录时补所有空调设备。
*
* 状态判定以开关机记录(最近一条 power)为准,内机列表仅用于修正设备在线/离线/故障:
* - 最近是开机 + 内机在线(0) → 记录开机快照
* - 最近是开机 + 内机离线(1)/故障(2) → 记录关机(设备实际不可用)
* - 最近是关机 → 记录关机
* - 无历史记录(全新设备)→ 以内机列表 onOff 为准(onOff=1 开,0 关)
* 注意:内机列表 state=0 代表设备在线,不代表开机;onOff=0 也不代表用户主动关机。
*/
async
function
compensateAcRealtimeData
(
deviceModel
:
any
,
deviceDataModel
:
any
,
eventDeviceIds
:
Set
<
string
>
,
toInsert
:
any
[],
):
Promise
<
void
>
{
// 节流:距上次补偿不足 30 分钟则跳过
...
...
@@ -771,14 +776,20 @@ async function compensateAcRealtimeData(
return
;
}
// 找出当天无开关机记录的设备(记录不全时只补这些)
const
missingDeviceIds
=
allAcDeviceIds
.
filter
((
id
:
string
)
=>
!
eventDeviceIds
.
has
(
id
));
// 查询每台设备最新的 device_time,找出"最近 30 分钟没有记录"的设备(含全新无记录设备)
const
maxTimeMap
=
await
buildMaxTimeMap
(
deviceDataModel
,
allAcDeviceIds
);
const
thirtyMinAgo
=
new
Date
(
now
-
AC_REALTIME_COMPENSATE_INTERVAL_MS
);
const
missingDeviceIds
=
allAcDeviceIds
.
filter
((
deviceId
:
string
)
=>
{
const
maxTime
=
maxTimeMap
.
get
(
deviceId
);
// 无历史记录,或最新记录已超过 30 分钟 → 需要补偿
return
!
maxTime
||
maxTime
<
thirtyMinAgo
;
});
if
(
missingDeviceIds
.
length
===
0
)
{
// 全部设备
今天都有开关机
记录,无需补偿(仍更新节流时间,避免每次轮询都查设备表)
// 全部设备
最近 30 分钟都有
记录,无需补偿(仍更新节流时间,避免每次轮询都查设备表)
lastAcRealtimeCompensateAt
=
now
;
return
;
}
console
.
log
(
`[空调数据补偿]
${
missingDeviceIds
.
length
}
台设备
当天无开关机
记录,拉取实时状态兜底...`
);
console
.
log
(
`[空调数据补偿]
${
missingDeviceIds
.
length
}
台设备
最近 30 分钟无
记录,拉取实时状态兜底...`
);
// 分页拉取所有内机实时状态,建立 indoorUnitAddressFull → 内机映射
const
unitRows
=
await
fetchAllPages
((
page
,
limit
)
=>
getIndoorUnitList
({
page
,
limit
}));
...
...
@@ -789,6 +800,22 @@ async function compensateAcRealtimeData(
}
}
// 查询缺失设备最近一条开关机记录的 power,用于判断最近是开机还是关机
const
lastPowerMap
=
new
Map
<
string
,
string
>
();
await
Promise
.
all
(
missingDeviceIds
.
map
(
async
(
deviceId
)
=>
{
const
latest
=
await
deviceDataModel
.
findOne
({
where
:
{
device_id
:
deviceId
},
order
:
[[
'device_time'
,
'DESC'
]],
attributes
:
[
'device_data'
],
raw
:
true
,
});
if
(
latest
?.
device_data
?.
power
)
{
lastPowerMap
.
set
(
deviceId
,
latest
.
device_data
.
power
);
}
}),
);
// 只对缺失设备构造实时快照(device_time 用当前轮询时间,source 标记区分)
const
compensateTime
=
new
Date
();
let
compensateCount
=
0
;
...
...
@@ -796,8 +823,22 @@ async function compensateAcRealtimeData(
const
unit
=
unitMap
.
get
(
deviceId
);
if
(
!
unit
)
continue
;
const
lastPower
=
lastPowerMap
.
get
(
deviceId
);
let
power
:
string
;
if
(
lastPower
===
'on'
)
{
// 最近是开机:内机在线则保持开机;离线/故障则记录关机
const
unitState
=
unit
.
state
??
DEVICE_STATE
.
在线
;
power
=
unitState
===
DEVICE_STATE
.
在线
?
'on'
:
'off'
;
}
else
if
(
lastPower
===
'off'
)
{
// 最近是关机:记录关机
power
=
'off'
;
}
else
{
// 无历史记录(全新设备):以内机列表 onOff 为准(1 开 0 关)
power
=
unit
.
onOff
===
1
?
'on'
:
'off'
;
}
const
data
=
{
power
:
unit
.
onOff
===
1
?
'on'
:
'off'
,
power
,
mode
:
WORK_MODE_TEXT_MAP
[
unit
.
workMode
]
||
'未知'
,
fanSpeed
:
FAN_SPEED_TEXT_MAP
[
unit
.
fanSpeed
]
||
'自动'
,
setTemp
:
unit
.
tempSet
||
0
,
...
...
src/biz/device.ts
View file @
59999959
...
...
@@ -4,6 +4,7 @@ import { BizError } from "../util/bizError";
import
{
ERRORENUM
}
from
"../config/errorEnum"
;
import
{
addData
}
from
"../data/addData"
;
import
{
updateManyData
}
from
"../data/updateData"
;
import
{
delData
}
from
"../data/delData"
;
import
{
getIndoorUnitList
,
controlIndoorUnit
}
from
"./feiyiClient"
;
import
{
powerMap
,
workModeMap
,
fanSpeedMap
,
WORK_MODE_TEXT_MAP
,
FAN_SPEED_TEXT_MAP
,
DEVICE_STATE_TEXT_MAP
}
from
"../config/businessEnum"
;
import
{
formatLocalTime
}
from
"../config/eccParam/admin"
;
...
...
@@ -36,11 +37,9 @@ export async function getDeviceList(params: {
}
// 1. 构建查询参数,只查空调设备,排除 region_key=0 的设备
let
paramAnys
:
any
=
{
device_type
:
'空调'
};
let
paramAnys
:
any
=
{
};
if
(
regionKeys
.
length
)
{
paramAnys
.
region_key
=
{
"%in%"
:
regionKeys
};
}
else
{
paramAnys
.
region_key
=
{
"%ne%"
:
0
};
}
// 2. deviceName 模糊搜索
...
...
@@ -59,69 +58,69 @@ export async function getDeviceList(params: {
}
// 4. 判断是否需要飞奕后置过滤
const
needFeiyiFilter
=
params
.
power
||
params
.
deviceMode
;
const
targetOnOff
=
params
.
power
?
powerMap
[
params
.
power
]
:
undefined
;
const
targetMode
=
params
.
deviceMode
?
workModeMap
[
params
.
deviceMode
]
:
undefined
;
if
(
needFeiyiFilter
)
{
// ==== 飞奕筛选模式:查全量设备,后置过滤再内存分页 ====
const
deviceRes
=
await
selectDataListByParam
(
TABLENAME
.
设备表
,
paramAnys
,
[
"device_id"
,
"region_key
"
,
"device_state"
,
"linkage_start"
]
);
let
devices
=
(
deviceRes
.
data
||
[])
as
any
[];
let
filteredRows
:
any
[]
=
[];
const
pad
=
(
n
:
number
)
=>
String
(
n
).
padStart
(
2
,
'0'
);
const
now
=
new
Date
();
const
updateTime
=
`
${
now
.
getFullYear
()}
-
${
pad
(
now
.
getMonth
()
+
1
)}
-
${
pad
(
now
.
getDate
())}
${
pad
(
now
.
getHours
())}
:
${
pad
(
now
.
getMinutes
())}
:
${
pad
(
now
.
getSeconds
())}
`
;
if
(
devices
.
length
>
0
)
{
// 查区域信息
const
regionIdSet
=
[...
new
Set
(
devices
.
map
((
d
:
any
)
=>
d
.
region_key
).
filter
(
Boolean
))];
let
regionMap
:
Map
<
string
,
any
>
=
new
Map
();
if
(
regionIdSet
.
length
)
{
const
regionRes
=
await
selectDataListByParam
(
TABLENAME
.
区域表
,
{
region_key
:
{
"%in%"
:
regionIdSet
}
},
[
"region_key"
,
"region_name"
]
);
(
regionRes
.
data
as
any
[]).
forEach
((
r
:
any
)
=>
regionMap
.
set
(
String
(
r
.
region_key
),
r
));
}
// 逐台调飞奕,收集符合条件的
for
(
const
device
of
devices
)
{
let
feiyiRow
:
any
=
{};
try
{
const
result
=
await
getIndoorUnitList
({
indoorUnitAddressFull
:
device
.
device_id
,
page
:
1
,
limit
:
1
});
feiyiRow
=
result
.
rows
[
0
]
||
{};
}
catch
(
e
)
{
console
.
error
(
`[getDeviceList] 获取设备
${
device
.
device_id
}
飞奕数据失败:`
,
e
);
}
// 飞奕筛选
if
(
targetOnOff
!==
undefined
&&
feiyiRow
.
onOff
!==
targetOnOff
)
continue
;
if
(
targetMode
!==
undefined
&&
feiyiRow
.
workMode
!==
targetMode
)
continue
;
const
region
=
regionMap
.
get
(
String
(
device
.
region_key
));
filteredRows
.
push
({
deviceId
:
device
.
device_id
,
regionName
:
region
?
region
.
region_name
||
''
:
''
,
power
:
feiyiRow
.
onOff
===
1
?
'开'
:
'关'
,
setTemp
:
feiyiRow
.
tempSet
??
''
,
fanSpeed
:
FAN_SPEED_TEXT_MAP
[
feiyiRow
.
fanSpeed
]
||
String
(
feiyiRow
.
fanSpeed
||
''
),
deviceMode
:
WORK_MODE_TEXT_MAP
[
feiyiRow
.
workMode
]
||
String
(
feiyiRow
.
workMode
||
''
),
state
:
DEVICE_STATE_TEXT_MAP
[
device
.
device_state
]
??
String
(
device
.
device_state
??
''
),
linkageStart
:
device
.
linkage_start
??
'on'
,
updateTime
,
});
}
}
const
total
=
filteredRows
.
length
;
const
startIdx
=
(
pageNumber
-
1
)
*
pageSize
;
const
rows
=
filteredRows
.
slice
(
startIdx
,
startIdx
+
pageSize
);
return
{
total
,
rows
};
}
else
{
//
const needFeiyiFilter = params.power || params.deviceMode;
//
const targetOnOff = params.power ? powerMap[params.power] : undefined;
//
const targetMode = params.deviceMode ? workModeMap[params.deviceMode] : undefined;
//
if (needFeiyiFilter) {
//
// ==== 飞奕筛选模式:查全量设备,后置过滤再内存分页 ====
//
const deviceRes = await selectDataListByParam(
//
TABLENAME.设备表, paramAnys,
// ["device_id", "region_key", "device_name", "device_type
", "device_state", "linkage_start"]
//
);
//
let devices = (deviceRes.data || []) as any[];
//
let filteredRows: any[] = [];
//
const pad = (n: number) => String(n).padStart(2, '0');
//
const now = new Date();
//
const updateTime = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;
//
if (devices.length > 0) {
//
// 查区域信息
//
const regionIdSet = [...new Set(devices.map((d: any) => d.region_key).filter(Boolean))];
//
let regionMap: Map<string, any> = new Map();
//
if (regionIdSet.length) {
//
const regionRes = await selectDataListByParam(
//
TABLENAME.区域表,
//
{ region_key: { "%in%": regionIdSet } },
//
["region_key", "region_name"]
//
);
//
(regionRes.data as any[]).forEach((r: any) => regionMap.set(String(r.region_key), r));
//
}
//
// 逐台调飞奕,收集符合条件的
//
for (const device of devices) {
//
let feiyiRow: any = {};
//
try {
//
const result = await getIndoorUnitList({ indoorUnitAddressFull: device.device_id, page: 1, limit: 1 });
//
feiyiRow = result.rows[0] || {};
//
} catch (e) {
//
console.error(`[getDeviceList] 获取设备 ${device.device_id} 飞奕数据失败:`, e);
//
}
//
// 飞奕筛选
//
if (targetOnOff !== undefined && feiyiRow.onOff !== targetOnOff) continue;
//
if (targetMode !== undefined && feiyiRow.workMode !== targetMode) continue;
//
const region = regionMap.get(String(device.region_key));
//
filteredRows.push({
//
deviceId: device.device_id,
//
regionName: region ? region.region_name || '' : '',
//
power: feiyiRow.onOff === 1 ? '开' : '关',
//
setTemp: feiyiRow.tempSet ?? '',
//
fanSpeed: FAN_SPEED_TEXT_MAP[feiyiRow.fanSpeed] || String(feiyiRow.fanSpeed || ''),
//
deviceMode: WORK_MODE_TEXT_MAP[feiyiRow.workMode] || String(feiyiRow.workMode || ''),
//
state: DEVICE_STATE_TEXT_MAP[device.device_state] ?? String(device.device_state ?? ''),
//
linkageStart: device.linkage_start ?? 'on',
//
updateTime,
//
});
//
}
//
}
//
const total = filteredRows.length;
//
const startIdx = (pageNumber - 1) * pageSize;
//
const rows = filteredRows.slice(startIdx, startIdx + pageSize);
//
return { total, rows };
//
} else {
// ==== 无飞奕筛选:DB 层分页(原逻辑) ====
// 查询总数
const
countRes
=
await
selectDataCountByParam
(
TABLENAME
.
设备表
,
paramAnys
);
...
...
@@ -133,7 +132,7 @@ export async function getDeviceList(params: {
// 分页查询设备
const
deviceRes
=
await
selectDataListToPageByParam
(
TABLENAME
.
设备表
,
paramAnys
,
[
"device_id"
,
"region_key"
,
"device_state"
,
"linkage_start"
],
[
"device_id"
,
"region_key"
,
"device_
name"
,
"device_type"
,
"device_
state"
,
"linkage_start"
],
pageNumber
,
pageSize
);
const
devices
=
deviceRes
.
data
as
any
[];
...
...
@@ -154,17 +153,17 @@ export async function getDeviceList(params: {
(
regionRes
.
data
as
any
[]).
forEach
((
r
:
any
)
=>
regionMap
.
set
(
String
(
r
.
region_key
),
r
));
}
// 逐台串行调用飞奕接口获取实时数据
const
feiyiResults
:
any
[]
=
[];
for
(
const
device
of
devices
)
{
try
{
const
result
=
await
getIndoorUnitList
({
indoorUnitAddressFull
:
device
.
device_id
,
page
:
1
,
limit
:
1
});
feiyiResults
.
push
(
result
.
rows
[
0
]
||
{});
}
catch
(
e
)
{
console
.
error
(
`[getDeviceList] 获取设备
${
device
.
device_id
}
飞奕数据失败:`
,
e
);
feiyiResults
.
push
({
});
}
}
//
//
逐台串行调用飞奕接口获取实时数据
//
const feiyiResults: any[] = [];
//
for (const device of devices) {
//
try {
//
const result = await getIndoorUnitList({ indoorUnitAddressFull: device.device_id, page: 1, limit: 1 });
//
feiyiResults.push(result.rows[0] || {});
//
} catch (e) {
//
console.error(`[getDeviceList] 获取设备 ${device.device_id} 飞奕数据失败:`, e);
//
feiyiResults.push({ });
//
}
//
}
// 组装返回数据
const
pad
=
(
n
:
number
)
=>
String
(
n
).
padStart
(
2
,
'0'
);
...
...
@@ -173,15 +172,18 @@ export async function getDeviceList(params: {
const
rows
=
devices
.
map
((
device
:
any
,
index
:
number
)
=>
{
const
region
=
regionMap
.
get
(
String
(
device
.
region_key
));
const
row
=
feiyiResults
[
index
]
||
{};
//
const row = feiyiResults[index] || {};
return
{
deviceId
:
device
.
device_id
,
deviceName
:
device
.
device_name
||
''
,
deviceType
:
device
.
device_type
||
''
,
deviceState
:
device
.
device_state
??
''
,
regionName
:
region
?
region
.
region_name
||
''
:
''
,
power
:
row
.
onOff
===
1
?
'开'
:
'关'
,
setTemp
:
row
.
tempSet
??
''
,
fanSpeed
:
FAN_SPEED_TEXT_MAP
[
row
.
fanSpeed
]
||
String
(
row
.
fanSpeed
||
''
),
deviceMode
:
WORK_MODE_TEXT_MAP
[
row
.
workMode
]
||
String
(
row
.
workMode
||
''
),
//
power: row.onOff === 1 ? '开' : '关',
//
setTemp: row.tempSet ?? '',
//
fanSpeed: FAN_SPEED_TEXT_MAP[row.fanSpeed] || String(row.fanSpeed || ''),
//
deviceMode: WORK_MODE_TEXT_MAP[row.workMode] || String(row.workMode || ''),
state
:
DEVICE_STATE_TEXT_MAP
[
device
.
device_state
]
??
String
(
device
.
device_state
??
''
),
linkageStart
:
device
.
linkage_start
??
'on'
,
updateTime
,
...
...
@@ -189,7 +191,7 @@ export async function getDeviceList(params: {
});
return
{
total
,
rows
};
}
//
}
}
/**
...
...
@@ -495,6 +497,50 @@ export async function batchEditDevices(params: {
// ======= 设备表本地信息编辑(不涉及飞奕API) =======
/**
* 新增单台设备表信息
* @param params deviceId 必填;其余字段可省略(有默认值)
* @returns { isSuccess, deviceId }
*/
export
async
function
addLocalDevice
(
params
:
{
deviceId
:
string
;
deviceName
?:
string
;
regionKey
?:
number
;
deviceType
?:
string
;
deviceState
?:
string
;
linkageStart
?:
string
;
})
{
const
{
deviceId
,
deviceName
,
regionKey
,
deviceType
,
deviceState
,
linkageStart
}
=
params
;
if
(
!
deviceId
)
{
throw
new
BizError
(
ERRORENUM
.
参数错误
,
"缺少必填参数:deviceId"
);
}
// 校验设备是否已存在(device_id 唯一)
const
existRes
=
await
selectOneDataByParam
(
TABLENAME
.
设备表
,
{
device_id
:
deviceId
},
[
"device_id"
]);
if
(
existRes
.
data
&&
existRes
.
data
.
device_id
)
{
throw
new
BizError
(
ERRORENUM
.
参数错误
,
`设备
${
deviceId
}
已存在`
);
}
// 构建插入数据(未传字段用默认值)
const
now
=
new
Date
();
const
dbRow
=
{
device_id
:
deviceId
,
device_name
:
deviceName
||
deviceId
,
region_key
:
regionKey
??
null
,
device_type
:
deviceType
||
'空调'
,
device_state
:
deviceState
!==
undefined
&&
deviceState
!==
''
?
Number
(
deviceState
)
:
0
,
linkage_start
:
linkageStart
||
'on'
,
created_at
:
now
,
updated_at
:
now
,
};
await
addData
(
TABLENAME
.
设备表
,
[
dbRow
]);
console
.
log
(
`[addLocalDevice] 新增设备
${
deviceId
}
:`
,
dbRow
);
return
{
isSuccess
:
true
,
deviceId
};
}
/**
* 编辑单台设备的表信息
* @param params deviceId + 可编辑字段(至少一个)
*/
...
...
@@ -577,4 +623,35 @@ export async function batchEditLocalDevices(params: {
console
.
log
(
`[batchEditLocalDevices] 批量更新,条件:`
,
where
,
"更新内容:"
,
dbEdits
);
return
{
isSuccess
:
true
};
}
/**
* 删除单台设备表信息(含关联数据清理)
* 关联清理:region_device_rel / schedule_device / device_data / device_logs / device_fault
* @param deviceId 设备标识
* @returns { isSuccess, deviceId }
*/
export
async
function
deleteLocalDevices
(
deviceId
:
string
)
{
if
(
!
deviceId
)
{
throw
new
BizError
(
ERRORENUM
.
参数错误
,
"缺少必填参数:deviceId"
);
}
// 校验设备存在
const
deviceRes
=
await
selectOneDataByParam
(
TABLENAME
.
设备表
,
{
device_id
:
deviceId
},
[
"device_id"
]);
if
(
!
deviceRes
.
data
)
{
throw
new
BizError
(
ERRORENUM
.
参数错误
,
`设备
${
deviceId
}
不存在`
);
}
// 1. 删除关联记录(区域关联 / 日程关联 / 数据 / 日志 / 故障)
await
delData
(
TABLENAME
.
区域设备关联表
,
{
device_id
:
deviceId
});
await
delData
(
TABLENAME
.
日程设备关联表
,
{
device_id
:
deviceId
});
await
delData
(
TABLENAME
.
设备数据表
,
{
device_id
:
deviceId
});
await
delData
(
TABLENAME
.
设备日志表
,
{
device_id
:
deviceId
});
await
delData
(
TABLENAME
.
设备故障表
,
{
device_id
:
deviceId
});
// 2. 删除主记录
await
delData
(
TABLENAME
.
设备表
,
{
device_id
:
deviceId
});
console
.
log
(
`[deleteLocalDevices] 已删除设备
${
deviceId
}
及其关联数据`
);
return
{
isSuccess
:
true
,
deviceId
};
}
\ No newline at end of file
src/biz/mqttClient.ts
0 → 100644
View file @
59999959
import
{
TABLENAME
}
from
"../config/dbEnum"
;
import
{
addData
}
from
"../data/addData"
;
import
{
selectOneDataByParam
}
from
"../data/findData"
;
/**
* 处理接收到的电表设备数据,并存入数据库
*
* 消息示例:
* { "CUB": 52.620000000000005, "EPEc": 0, "EPF": 0, "EPG": 0, "EPIc": 243.41, "EPJ": 0, "EPP": 0, "EPc": 243.41, "EQCc": 109.94, "EQLc": 0.01, "IL": 0, "IaTHD": 77.85000000000001, "IbTHD": 77.05, "IcTHD": 48.27, "MD": 14.722, "MDTimeStamp": "8-5 12:5", "RD": 10.763, "TempA": 0, "TempB": 0, "TempC": 0, "UaTHD": 3.47, "Uab": 0, "UbTHD": 3.11, "UcTHD": 3.09, "VUB": 0.53, "devEUI": "009569000005ad2b", "deviceName": "DB_ZDY", "gatewayTime": "2026-08-18T17:09:28+08:00" }
*/
export
async
function
electricDeviceData
(
message
)
{
const
msgStr
=
message
.
toString
();
try
{
// 解析JSON消息
let
data
:
any
;
try
{
data
=
JSON
.
parse
(
msgStr
);
}
catch
(
e
)
{
console
.
error
(
'消息不是合法JSON,跳过:'
,
msgStr
);
return
;
}
console
.
log
(
'收到电表设备数据:'
,
data
.
length
);
// 提取关键字段
const
devEUI
=
data
.
devEUI
?
data
.
devEUI
.
toUpperCase
()
:
null
;
if
(
!
devEUI
)
{
console
.
warn
(
'消息缺少devEUI字段,跳过'
);
return
;
}
const
gatewayTime
=
data
.
gatewayTime
?
new
Date
(
data
.
gatewayTime
)
:
new
Date
();
// ===== 设备校验:设备不存在则自动注册到设备表 =====
const
deviceRow
=
await
selectOneDataByParam
(
TABLENAME
.
设备表
,
{
device_id
:
devEUI
}
);
if
(
!
deviceRow
||
!
deviceRow
.
data
)
{
console
.
warn
(
`设备
${
devEUI
}
不存在,自动注册到设备表...`
);
try
{
const
now
=
new
Date
();
await
addData
(
TABLENAME
.
设备表
,
{
device_id
:
devEUI
,
device_name
:
data
.
deviceName
||
devEUI
,
device_type
:
'电表'
,
device_state
:
0
,
created_at
:
now
,
updated_at
:
now
,
});
console
.
log
(
`设备
${
devEUI
}
自动注册完成`
);
}
catch
(
e
)
{
// 并发上报时可能刚被注册(唯一键冲突),忽略并继续入库数据
console
.
warn
(
`设备
${
devEUI
}
自动注册失败(可能已存在):`
,
e
);
}
}
const
now
=
new
Date
();
await
addData
(
TABLENAME
.
设备数据表
,
{
device_id
:
devEUI
,
device_data
:
data
,
device_time
:
gatewayTime
,
created_at
:
now
}
);
console
.
log
(
`数据入库成功: 设备
${
devEUI
}
`
);
}
catch
(
error
)
{
console
.
error
(
'数据处理失败:'
,
error
);
}
}
src/biz/running.ts
View file @
59999959
...
...
@@ -717,7 +717,9 @@ export async function getRunAnalysis() {
====== MOCK DATA END ====== */
// ---- 真实查询 ----
// 趋势基于 device_data 表:每小时有数据上报的设备数代表在线数
// 设备在线率趋势:每个小时点 T 的在线率 = (设备总数 − 离线数) / 设备总数 × 100
// 离线判定:设备在 [趋势起点 ~ T] 内最近一条 device_data 记录的 power=off(含补偿快照),
// 状态保持直到出现更新的记录;无 power 字段(电表/IEQ)或无记录 → 默认在线
const
trend24hStart
=
getHoursAgo
(
24
);
const
trendEnd
=
formatTime
(
new
Date
());
...
...
@@ -727,10 +729,11 @@ export async function getRunAnalysis() {
[
'device_id'
]
);
const
allDeviceIds
=
(
envDevicesResult
.
data
||
[]).
map
((
d
:
any
)
=>
d
.
device_id
);
const
totalDevices
=
allDeviceIds
.
length
;
let
trendHourly
:
{
key
:
string
;
value
:
number
}[]
=
[];
let
deviceMonitorTrend
:
{
key
:
string
;
value
:
number
}[]
=
[];
if
(
allDeviceIds
.
length
>
0
)
{
if
(
totalDevices
>
0
)
{
const
trendDataResult
=
await
selectDataListByParam
(
TABLENAME
.
设备数据表
,
{
...
...
@@ -738,24 +741,46 @@ export async function getRunAnalysis() {
device_time
:
{
'%gte%'
:
trend24hStart
,
'%lte%'
:
trendEnd
},
'%orderAsc%'
:
'device_time'
,
},
[
'device_id'
,
'device_time'
]
[
'device_id'
,
'device_time'
,
'device_data'
]
);
const
hourlyDevices
=
new
Map
<
string
,
Set
<
string
>>
();
// 生成完整小时 key 序列(起点向上取整到整点,到当前时刻),保证无数据小时也输出
const
startHour
=
new
Date
(
trend24hStart
);
startHour
.
setMinutes
(
0
,
0
,
0
);
if
(
startHour
.
getTime
()
<
new
Date
(
trend24hStart
).
getTime
())
{
startHour
.
setHours
(
startHour
.
getHours
()
+
1
);
}
const
hourKeys
:
string
[]
=
[];
for
(
let
t
=
new
Date
(
startHour
);
t
<=
new
Date
(
trendEnd
);
t
.
setHours
(
t
.
getHours
()
+
1
))
{
hourKeys
.
push
(
formatHourKey
(
t
));
}
// 按小时分组记录
const
recordsByHour
=
new
Map
<
string
,
any
[]
>
();
(
trendDataResult
.
data
||
[]).
forEach
((
r
:
any
)
=>
{
const
t
=
new
Date
(
r
.
device_time
);
const
key
=
formatHourKey
(
t
);
if
(
!
hourlyDevices
.
has
(
key
))
hourlyDevices
.
set
(
key
,
new
Set
());
hourlyDevices
.
get
(
key
)
!
.
add
(
r
.
device_id
);
const
hk
=
formatHourKey
(
new
Date
(
r
.
device_time
));
if
(
!
recordsByHour
.
has
(
hk
))
recordsByHour
.
set
(
hk
,
[]);
recordsByHour
.
get
(
hk
)
!
.
push
(
r
);
});
trendHourly
=
Array
.
from
(
hourlyDevices
.
entries
())
.
map
(([
key
,
devices
])
=>
({
key
,
value
:
devices
.
size
}))
.
sort
((
a
,
b
)
=>
a
.
key
.
localeCompare
(
b
.
key
));
// 状态保持模型:逐小时推进,维护各设备最近一条记录的 power,统计离线数
const
lastPowerMap
=
new
Map
<
string
,
string
>
();
deviceMonitorTrend
=
hourKeys
.
map
((
hk
)
=>
{
for
(
const
r
of
recordsByHour
.
get
(
hk
)
||
[])
{
const
parsed
=
parseDeviceData
(
r
.
device_data
);
if
(
parsed
&&
typeof
parsed
.
power
===
'string'
)
{
lastPowerMap
.
set
(
r
.
device_id
,
parsed
.
power
);
}
}
let
offlineCount
=
0
;
lastPowerMap
.
forEach
((
p
)
=>
{
if
(
p
===
'off'
)
offlineCount
++
;
});
const
onlineRate
=
Math
.
round
(((
totalDevices
-
offlineCount
)
/
totalDevices
)
*
100
);
return
{
key
:
hk
,
value
:
onlineRate
};
});
}
let
deviceMonitorTrend
=
trendHourly
;
// ========================================================================
// 四、预警工单处理
// 1、预警处理状态
...
...
@@ -1311,6 +1336,7 @@ export async function getAnalysisPopup(regionKey: string) {
* @param selectedRegionKey 已选择区域
*/
export
async
function
getAnalysisPopupSubTrend
(
currRegionKey
:
string
,
selectedRegionKey
:
string
)
{
/* ====== MOCK DATA(保留,勿删) ======
// 能耗监测(该区域电表24小时趋势)
let nhjcdb: { key: string; dqqy: string, dbqy: string }[] = [];
// 环境监测(该区域电表24小时趋势)
...
...
@@ -1326,6 +1352,124 @@ export async function getAnalysisPopupSubTrend(currRegionKey: string, selectedRe
"nhjc": nhjcdb,
"hjjc": hjjcdb
};
====== MOCK DATA END ====== */
// ---- 真实查询 ----
// 时间范围:过去 24 小时 ~ 当前时刻(只输出到当前小时,不查未来)
const
trendStart
=
getHoursAgo
(
24
);
const
trendEnd
=
formatTime
(
new
Date
());
// 两区域分别聚合:能耗(电表按小时求和)、环境(IEQ 按小时取最新一条)
const
[
currMeterHourly
,
selMeterHourly
]
=
await
Promise
.
all
([
queryRegionMeterHourly
(
currRegionKey
,
trendStart
,
trendEnd
),
queryRegionMeterHourly
(
selectedRegionKey
,
trendStart
,
trendEnd
),
]);
const
[
currIeqHourly
,
selIeqHourly
]
=
await
Promise
.
all
([
queryRegionIeqHourly
(
currRegionKey
,
trendStart
,
trendEnd
),
queryRegionIeqHourly
(
selectedRegionKey
,
trendStart
,
trendEnd
),
]);
// 能耗对比:hourKey 取两区域并集,缺数据侧输出 null(不补零)
const
nhjcHourKeys
=
Array
.
from
(
new
Set
([...
currMeterHourly
.
keys
(),
...
selMeterHourly
.
keys
()])).
sort
();
let
nhjcdb
:
{
key
:
string
;
dqqy
:
number
|
null
,
dbqy
:
number
|
null
}[]
=
nhjcHourKeys
.
map
((
key
)
=>
({
key
,
dqqy
:
currMeterHourly
.
has
(
key
)
?
Math
.
round
(
currMeterHourly
.
get
(
key
)
!
)
:
null
,
dbqy
:
selMeterHourly
.
has
(
key
)
?
Math
.
round
(
selMeterHourly
.
get
(
key
)
!
)
:
null
,
}));
// 环境对比:六项指标分别取两区域并集小时,缺数据侧输出 null(不补零)
const
ENV_COMPARE_MAP
:
Record
<
string
,
string
>
=
{
wdhjjc
:
'temperature'
,
sdhjjc
:
'humidity'
,
pm25hjjc
:
'pm25'
,
co2hjjc
:
'co2'
,
pm10hjjc
:
'pm10'
,
tvochjjc
:
'tvoc'
,
};
let
hjjcdb
:
any
=
{};
Object
.
entries
(
ENV_COMPARE_MAP
).
forEach
(([
outKey
,
indicator
])
=>
{
const
hourKeys
=
Array
.
from
(
new
Set
([...
currIeqHourly
.
keys
(),
...
selIeqHourly
.
keys
()])).
sort
();
hjjcdb
[
outKey
]
=
hourKeys
.
map
((
key
)
=>
({
key
,
dqqy
:
currIeqHourly
.
get
(
key
)?.
get
(
indicator
)
??
null
,
dbqy
:
selIeqHourly
.
get
(
key
)?.
get
(
indicator
)
??
null
,
}));
});
return
{
"nhjc"
:
nhjcdb
,
"hjjc"
:
hjjcdb
};
}
/**
* 查询某区域电表设备在指定时间范围内的耗电量,按小时聚合(求和)
* @returns Map<hourKey, 该小时耗电量总和>
*/
async
function
queryRegionMeterHourly
(
regionKey
:
string
,
startTime
:
string
,
endTime
:
string
):
Promise
<
Map
<
string
,
number
>>
{
const
devices
=
await
getDevicesByRegion
(
regionKey
,
[
'device_id'
,
'device_type'
]);
const
meterIds
=
devices
.
filter
((
d
:
any
)
=>
d
.
device_type
===
'电表'
).
map
((
d
:
any
)
=>
d
.
device_id
);
if
(
meterIds
.
length
===
0
)
return
new
Map
();
const
dataResult
=
await
selectDataListByParam
(
TABLENAME
.
设备数据表
,
{
device_id
:
{
'%in%'
:
meterIds
},
device_time
:
{
'%gte%'
:
startTime
,
'%lte%'
:
endTime
},
'%orderAsc%'
:
'device_time'
,
},
[
'device_data'
,
'device_time'
]
);
const
hourlyMap
=
new
Map
<
string
,
number
>
();
(
dataResult
.
data
||
[]).
forEach
((
r
:
any
)
=>
{
const
t
=
new
Date
(
r
.
device_time
);
const
hourKey
=
`
${
t
.
getFullYear
()}
-
${
String
(
t
.
getMonth
()
+
1
).
padStart
(
2
,
'0'
)}
-
${
String
(
t
.
getDate
()).
padStart
(
2
,
'0'
)}
${
String
(
t
.
getHours
()).
padStart
(
2
,
'0'
)}
:00`
;
const
parsed
=
parseDeviceData
(
r
.
device_data
);
const
val
=
parsed
&&
parsed
[
ELECTRICITY_KEY
];
if
(
typeof
val
===
'number'
)
{
hourlyMap
.
set
(
hourKey
,
(
hourlyMap
.
get
(
hourKey
)
||
0
)
+
val
);
}
});
return
hourlyMap
;
}
/**
* 查询某区域 IEQ 传感器在指定时间范围内的环境数据,按小时聚合(每小时取最新一条)
* @returns Map<hourKey, Map<indicatorKey, 最新值>>
*/
async
function
queryRegionIeqHourly
(
regionKey
:
string
,
startTime
:
string
,
endTime
:
string
):
Promise
<
Map
<
string
,
Map
<
string
,
number
>>>
{
const
devices
=
await
getDevicesByRegion
(
regionKey
,
[
'device_id'
,
'device_type'
]);
const
ieqIds
=
devices
.
filter
((
d
:
any
)
=>
d
.
device_type
===
'IEQ传感器'
).
map
((
d
:
any
)
=>
d
.
device_id
);
if
(
ieqIds
.
length
===
0
)
return
new
Map
();
const
dataResult
=
await
selectDataListByParam
(
TABLENAME
.
设备数据表
,
{
device_id
:
{
'%in%'
:
ieqIds
},
device_time
:
{
'%gte%'
:
startTime
,
'%lte%'
:
endTime
},
'%orderAsc%'
:
'device_time'
,
},
[
'device_data'
,
'device_time'
]
);
const
hourlyMap
=
new
Map
<
string
,
Map
<
string
,
number
>>
();
(
dataResult
.
data
||
[]).
forEach
((
r
:
any
)
=>
{
const
t
=
new
Date
(
r
.
device_time
);
const
hourKey
=
`
${
t
.
getFullYear
()}
-
${
String
(
t
.
getMonth
()
+
1
).
padStart
(
2
,
'0'
)}
-
${
String
(
t
.
getDate
()).
padStart
(
2
,
'0'
)}
${
String
(
t
.
getHours
()).
padStart
(
2
,
'0'
)}
:00`
;
const
parsed
=
parseDeviceData
(
r
.
device_data
);
if
(
!
parsed
)
return
;
if
(
!
hourlyMap
.
has
(
hourKey
))
hourlyMap
.
set
(
hourKey
,
new
Map
());
const
hourData
=
hourlyMap
.
get
(
hourKey
)
!
;
ENV_INDICATOR_KEYS
.
forEach
((
key
)
=>
{
const
val
=
parsed
[
key
];
if
(
val
!==
undefined
&&
val
!==
null
&&
typeof
val
===
'number'
)
{
// device_time 升序遍历,后写覆盖 → 保留该小时最新一条
hourData
.
set
(
key
,
val
);
}
});
});
return
hourlyMap
;
}
/**
...
...
src/config/serverConfig.ts
View file @
59999959
...
...
@@ -16,7 +16,7 @@ export async function initConfig() {
if
(
!
configInfo
||
!
configInfo
.
config
)
throw
new
BizError
(
'xml中无配置'
);
let
{
port
,
sign
,
img
,
mysqldb
,
feiyi
,
diqin
}
=
configInfo
.
config
;
let
{
port
,
sign
,
img
,
mysqldb
,
feiyi
,
diqin
,
mqttsrv
}
=
configInfo
.
config
;
// 基本配置
systemConfig
.
port
=
parseInt
(
port
[
0
]);
...
...
@@ -56,6 +56,20 @@ export async function initConfig() {
if
(
diqinConfig
.
diqinTvocConvertFactor
)
systemConfig
.
diqin
.
tvocConvertFactor
=
parseFloat
(
diqinConfig
.
diqinTvocConvertFactor
[
0
]);
}
// mqtt
if
(
mqttsrv
)
{
let
configInfo
=
mqttsrv
[
0
];
systemConfig
.
mqttsrv
=
{
host
:
''
,
port
:
0
,
topic_env
:
''
,
username
:
''
,
password
:
''
};
if
(
configInfo
.
mqttHost
&&
configInfo
.
mqttPort
&&
configInfo
.
mqttTopic
)
{
systemConfig
.
mqttsrv
.
host
=
configInfo
.
mqttHost
[
0
];
systemConfig
.
mqttsrv
.
port
=
parseInt
(
configInfo
.
mqttPort
[
0
]);
systemConfig
.
mqttsrv
.
topic_env
=
configInfo
.
mqttTopic
[
0
];
systemConfig
.
mqttsrv
.
username
=
configInfo
.
username
[
0
];
systemConfig
.
mqttsrv
.
password
=
configInfo
.
password
[
0
];
}
}
}
catch
(
err
)
{
console
.
log
(
'ERROR => 服务器配置解析错误 请检查根目录下 serverConfig.xml 文件是否正确'
);
console
.
log
(
err
);
...
...
src/config/systemClass.ts
View file @
59999959
...
...
@@ -29,4 +29,12 @@ export class ServerConfig {
/** PID-TVOC 换算系数(ppb → μg/m³),入库时换算,默认 0.0013 */
tvocConvertFactor
:
number
;
}
/** 星纵MQTT服务配置 */
mqttsrv
:
{
host
:
string
,
port
:
number
,
topic_env
:
string
,
username
:
string
,
password
:
string
}
}
\ No newline at end of file
src/main.ts
View file @
59999959
import
{
initConfig
,
systemConfig
}
from
"./config/serverConfig"
;
import
*
as
mysqlDB
from
"./db/mysqlInit"
;
import
*
as
mqttSrv
from
"./service/mqttInit"
;
import
{
initMysqlModel
}
from
"./model/sqlModelBind"
;
import
{
httpServer
}
from
"./net/http_server"
;
import
{
startSchedule
,
startAlertSchedule
,
startFaultStatusSchedule
}
from
"./config/schedule"
;
...
...
@@ -15,10 +16,12 @@ async function lanuch() {
httpServer
.
createServer
(
systemConfig
.
port
);
/**启动定时任务 */
startSchedule
();
/**启动MQTT订阅服务 */
await
mqttSrv
.
startMqttClient
();
/**启动预警工单定时任务(10分钟) */
//
startAlertSchedule();
startAlertSchedule
();
/**启动故障状态更新定时任务(5分钟) */
//
startFaultStatusSchedule();
startFaultStatusSchedule
();
console
.
log
(
'This indicates that the server is started successfully.'
);
...
...
src/routers/admin.ts
View file @
59999959
...
...
@@ -43,10 +43,14 @@ export function setRouter(httpServer) {
httpServer
.
post
(
"/api/dq/admin/device/edit"
,
asyncHandler
(
editDevice
));
/** 设备管理 - 批量编辑设备 */
httpServer
.
post
(
"/api/dq/admin/device/edit_batch"
,
asyncHandler
(
batchEditDevices
));
/** 设备管理 - 新增设备信息 */
httpServer
.
post
(
"/api/dq/admin/device/addDevice"
,
asyncHandler
(
addLocalDevice
));
/** 设备管理 - 编辑设备信息 */
httpServer
.
post
(
"/api/dq/admin/device/editDevice"
,
asyncHandler
(
editLocalDevice
));
/** 设备管理 - 批量编辑设备信息 */
httpServer
.
post
(
"/api/dq/admin/device/editDevice_batch"
,
asyncHandler
(
batchEditLocalDevices
));
/** 设备管理 - 删除设备信息 */
httpServer
.
post
(
"/api/dq/admin/device/deleteDevice"
,
asyncHandler
(
deleteLocalDevice
));
/** 用户管理 - 列表 */
httpServer
.
get
(
"/api/dq/admin/users/list"
,
asyncHandler
(
getUsersList
));
...
...
@@ -362,6 +366,31 @@ async function batchEditDevices(req, res) {
}
/**
* POST /api/dq/admin/device/addDevice
* 设备管理 - 新增单台设备表信息
* body: { deviceId, deviceName?, regionKey?, deviceType?, controlParams?, deviceState? }
*/
async
function
addLocalDevice
(
req
,
res
)
{
let
reqConf
=
{
deviceId
:
'String'
,
deviceName
:
'String'
,
regionKey
:
'Number'
,
deviceType
:
'String'
,
deviceState
:
'String'
,
linkageStart
:
'String'
,
};
const
NotMustHaveKeys
=
[
"deviceName"
,
"regionKey"
,
"deviceType"
,
"deviceState"
,
"linkageStart"
];
let
{
deviceId
,
deviceName
,
regionKey
,
deviceType
,
deviceState
,
linkageStart
}
=
eccReqParamater
(
reqConf
,
req
.
body
,
NotMustHaveKeys
);
if
(
!
deviceId
)
{
res
.
success
({
success
:
false
,
msg
:
"缺少必填参数:deviceId"
});
return
;
}
const
data
=
await
deviceBiz
.
addLocalDevice
({
deviceId
,
deviceName
,
regionKey
,
deviceType
,
deviceState
,
linkageStart
});
res
.
success
(
data
);
}
/**
* POST /api/dq/admin/device/editDevice
* 设备管理 - 编辑单台设备表信息
* body: { deviceId, deviceName?, regionKey?, deviceType?, controlParams?, deviceState? }
...
...
@@ -423,6 +452,21 @@ async function batchEditLocalDevices(req, res) {
res
.
success
(
data
);
}
/**
* POST /api/dq/admin/device/deleteDevice
* 设备管理 - 删除设备表信息
* body: { deviceId }
*/
async
function
deleteLocalDevice
(
req
,
res
)
{
const
deviceId
:
string
=
req
.
body
?.
deviceId
as
string
;
if
(
!
deviceId
)
{
res
.
success
({
success
:
false
,
msg
:
"缺少参数 deviceId"
});
return
;
}
const
data
=
await
deviceBiz
.
deleteLocalDevices
(
deviceId
);
res
.
success
(
data
);
}
// ======================= 用户管理 =======================
/**
...
...
src/service/mqttInit.ts
0 → 100644
View file @
59999959
import
{
processDeviceData
}
from
"../biz/mqttClient"
;
import
{
systemConfig
}
from
"../config/serverConfig"
;
const
mqtt
=
require
(
'mqtt'
);
// ==================== 启动MQTT客户端并订阅 ====================
export
async
function
startMqttClient
()
{
// 在连接选项中添加用户名和密码
const
mqttOptions
=
{
username
:
systemConfig
.
mqttsrv
.
username
,
password
:
systemConfig
.
mqttsrv
.
password
,
// 可选:如果遇到连接问题,可以添加以下参数
// clientId: 'node_subscriber_' + Math.random().toString(16).substring(2, 8),
// clean: true,
// connectTimeout: 4000,
// reconnectPeriod: 1000,
};
// 连接MQTT Broker
const
client
=
mqtt
.
connect
(
`mqtt://
${
systemConfig
.
mqttsrv
.
host
}
:
${
systemConfig
.
mqttsrv
.
port
}
`
,
mqttOptions
);
client
.
on
(
'connect'
,
()
=>
{
console
.
log
(
'MQTT客户端已连接,正在订阅主题...'
);
// 订阅网关的上行主题
client
.
subscribe
(
systemConfig
.
mqttsrv
.
topic_env
,
(
err
)
=>
{
if
(
err
)
{
console
.
error
(
'总电表订阅失败:'
,
err
);
}
else
{
console
.
log
(
`成功订阅总电表主题:
${
systemConfig
.
mqttsrv
.
topic_env
}
`
);
console
.
log
(
'等待总电表数据...'
);
}
});
});
// 当收到消息时触发处理
client
.
on
(
'message'
,
(
topic
,
message
)
=>
{
// 只处理配置的上行主题
if
(
topic
===
systemConfig
.
mqttsrv
.
topic_env
)
{
processDeviceData
(
message
);
}
});
client
.
on
(
'error'
,
(
err
)
=>
{
console
.
error
(
'MQTT连接错误:'
,
err
);
});
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment