星纵电表数据接入

parent b3046c21
......@@ -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": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
"version": "2.0.4",
"resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-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+8nOrY5cZGrA=="
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="
},
"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",
......
......@@ -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",
......
......@@ -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>
......@@ -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,
......
......@@ -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 + 可编辑字段(至少一个)
*/
......@@ -578,3 +624,34 @@ export async function batchEditLocalDevices(params: {
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
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);
}
}
......@@ -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,23 +741,45 @@ 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;
// ========================================================================
// 四、预警工单处理
......@@ -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;
}
/**
......
......@@ -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);
......
......@@ -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
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.');
......
......@@ -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);
}
// ======================= 用户管理 =======================
/**
......
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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment