Commit e17adcb5 by chenjinjing

no message

parents
.idea
.vscode
/out
/node_modules
/test
*test*
*.log
*.zip
\ No newline at end of file
{
"name": "gameserver",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@alicloud/dybaseapi": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/@alicloud/dybaseapi/-/dybaseapi-1.0.0.tgz",
"integrity": "sha512-4KEDgqES7IL60T/TWGSkLQkN6BYeHEw8smnPgac2J2MTES5v1ieCWvbLSuUUWi5SAXi7cydKoD4HUOmX7xwM+A==",
"requires": {
"@alicloud/pop-core": "^1.3.3"
}
},
"@alicloud/dysmsapi-2017-05-25": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/@alicloud/dysmsapi-2017-05-25/-/dysmsapi-2017-05-25-1.0.1.tgz",
"integrity": "sha512-CVX/Yl9ntwkAOHAZa3j2Y/Io+SlbETw/ILv4UPIDCEIQm/N0EEcN2OXF8cWCUvHeu7OgnFWZKhdJY5GsbjWHDA==",
"requires": {
"@alicloud/pop-core": "^1.5.1"
}
},
"@alicloud/mns": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/@alicloud/mns/-/mns-1.0.0.tgz",
"integrity": "sha512-SUJYM8+x3iPy6thIy5Wa/5lw7+RodeDDIPcI3QQ3bZPNCSq+yEC3jMtfVlS3vxGPq+dGjAysI9RGeM7NByeHlw==",
"requires": {
"debug": "^2.6.3",
"httpx": "^2.1.1",
"kitx": "^1.2.0",
"xml2js": "^0.4.17"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
},
"@alicloud/pop-core": {
"version": "1.8.0",
"resolved": "https://registry.npmmirror.com/@alicloud/pop-core/-/pop-core-1.8.0.tgz",
"integrity": "sha512-ef6vIVigtr9n8Lw6Ld2GZ9jVUD0+ReHviaQaMqZDPI2HwdpVvrq1Rvn2tBnFToe0tdTpovz9N7XFSf/C274OtA==",
"requires": {
"debug": "^3.1.0",
"httpx": "^2.1.2",
"json-bigint": "^1.0.0",
"kitx": "^1.2.1",
"xml2js": "^0.5.0"
},
"dependencies": {
"xml2js": {
"version": "0.5.0",
"resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.5.0.tgz",
"integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
"requires": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
}
}
}
},
"@alicloud/sms-sdk": {
"version": "1.1.6",
"resolved": "https://registry.npmmirror.com/@alicloud/sms-sdk/-/sms-sdk-1.1.6.tgz",
"integrity": "sha512-jW5ROjpAtOrNFkZSXb8geJWzkgJ9ggnPx+ve+72eatu78/vad2emdZjRx43/xPqqhA9djRoU3xHQt2xFODiaMQ==",
"requires": {
"@alicloud/dybaseapi": "^1.0.0",
"@alicloud/dysmsapi-2017-05-25": "^1.0.1",
"@alicloud/mns": "^1.0.0-beta6",
"babel-runtime": "^6.26.0"
}
},
"@babel/runtime": {
"version": "7.26.0",
"resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.26.0.tgz",
"integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
"requires": {
"regenerator-runtime": "^0.14.0"
},
"dependencies": {
"regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
}
}
},
"@types/node": {
"version": "10.17.55",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-10.17.55.tgz",
"integrity": "sha512-koZJ89uLZufDvToeWO5BrC4CR4OUfHnUz2qoPs/daQH6qq3IN62QFxCTZ+bKaCE0xaoCAJYE4AXre8AbghCrhg=="
},
"@types/webidl-conversions": {
"version": "7.0.3",
"resolved": "https://registry.npmmirror.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
"integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA=="
},
"@types/whatwg-url": {
"version": "8.2.2",
"resolved": "https://registry.npmmirror.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
"integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
"requires": {
"@types/node": "*",
"@types/webidl-conversions": "*"
}
},
"accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz",
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
"requires": {
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
}
},
"adler-32": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.2.0.tgz",
"integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
"asn1": {
"version": "0.2.6",
"resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz",
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
"requires": {
"safer-buffer": "~2.1.0"
}
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
},
"aws4": {
"version": "1.13.2",
"resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.13.2.tgz",
"integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="
},
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
"requires": {
"core-js": "^2.4.0",
"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.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
"requires": {
"tweetnacl": "^0.14.3"
}
},
"bignumber.js": {
"version": "9.1.2",
"resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.2.tgz",
"integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug=="
},
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.19.0.tgz",
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"requires": {
"bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
"qs": "6.7.0",
"raw-body": "2.4.0",
"type-is": "~1.6.17"
},
"dependencies": {
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
},
"bson": {
"version": "4.7.2",
"resolved": "https://registry.npmmirror.com/bson/-/bson-4.7.2.tgz",
"integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
"requires": {
"buffer": "^5.6.0"
}
},
"buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"requires": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
}
},
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
"bytes": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz",
"integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
},
"cfb": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
"integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
"requires": {
"adler-32": "~1.3.0",
"crc-32": "~1.2.0"
},
"dependencies": {
"adler-32": {
"version": "1.3.1",
"resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
"integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
}
}
},
"charenc": {
"version": "0.0.2",
"resolved": "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz",
"integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="
},
"codepage": {
"version": "1.14.0",
"resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.14.0.tgz",
"integrity": "sha512-iz3zJLhlrg37/gYRWgEPkaFTtzmnEv1h+r7NgZum2lFElYQPi0/5bnmuDfODHxfp0INEfnRqyfyeIJDbb7ahRw==",
"requires": {
"commander": "~2.14.1",
"exit-on-epipe": "~1.0.1"
},
"dependencies": {
"commander": {
"version": "2.14.1",
"resolved": "https://registry.npmmirror.com/commander/-/commander-2.14.1.tgz",
"integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
}
}
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"commander": {
"version": "2.17.1",
"resolved": "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz",
"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
},
"compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz",
"integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
"requires": {
"mime-db": ">= 1.43.0 < 2"
}
},
"compression": {
"version": "1.7.4",
"resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz",
"integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
"requires": {
"accepts": "~1.3.5",
"bytes": "3.0.0",
"compressible": "~2.0.16",
"debug": "2.6.9",
"on-headers": "~1.0.2",
"safe-buffer": "5.1.2",
"vary": "~1.1.2"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
},
"content-disposition": {
"version": "0.5.3",
"resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.3.tgz",
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
"requires": {
"safe-buffer": "5.1.2"
}
},
"content-type": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz",
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
},
"cookie": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.4.0.tgz",
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
"core-js": {
"version": "2.6.12",
"resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
},
"crc-32": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
"integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
},
"crypt": {
"version": "0.0.2",
"resolved": "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="
},
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
"requires": {
"assert-plus": "^1.0.0"
}
},
"date-format": {
"version": "4.0.14",
"resolved": "https://registry.npmmirror.com/date-format/-/date-format-4.0.14.tgz",
"integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg=="
},
"debug": {
"version": "3.2.7",
"resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"requires": {
"ms": "^2.1.1"
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"denque": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/denque/-/denque-2.1.0.tgz",
"integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz",
"integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="
},
"destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg=="
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
},
"dependencies": {
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
}
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
},
"exit-on-epipe": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
"integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
},
"express": {
"version": "4.17.1",
"resolved": "https://registry.npmmirror.com/express/-/express-4.17.1.tgz",
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
"requires": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
"body-parser": "1.19.0",
"content-disposition": "0.5.3",
"content-type": "~1.0.4",
"cookie": "0.4.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "~1.1.2",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "~1.1.2",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.5",
"qs": "6.7.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.1.2",
"send": "0.17.1",
"serve-static": "1.14.1",
"setprototypeof": "1.1.1",
"statuses": "~1.5.0",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
},
"express-async-handler": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/express-async-handler/-/express-async-handler-1.1.4.tgz",
"integrity": "sha512-HdmbVF4V4w1q/iz++RV7bUxIeepTukWewiJGkoCKQMtvPF11MLTa7It9PRc/reysXXZSEyD4Pthchju+IUbMiQ=="
},
"express-history-api-fallback": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz",
"integrity": "sha512-swxwm3aP8vrOOvlzOdZvHlSZtJGwHKaY94J6AkrAgCTmcbko3IRwbkhLv2wKV1WeZhjxX58aLMpP3atDBnKuZg=="
},
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
},
"fflate": {
"version": "0.3.11",
"resolved": "https://registry.npmmirror.com/fflate/-/fflate-0.3.11.tgz",
"integrity": "sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A=="
},
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"statuses": "~1.5.0",
"unpipe": "~1.0.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
},
"flatted": {
"version": "3.3.2",
"resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.2.tgz",
"integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA=="
},
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="
},
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
},
"formidable": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/formidable/-/formidable-1.2.2.tgz",
"integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q=="
},
"forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
},
"frac": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
},
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
},
"fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
"requires": {
"assert-plus": "^1.0.0"
}
},
"graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
},
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="
},
"har-validator": {
"version": "5.1.5",
"resolved": "https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz",
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
"requires": {
"ajv": "^6.12.3",
"har-schema": "^2.0.0"
}
},
"http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.7.2.tgz",
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
}
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"httpx": {
"version": "2.3.3",
"resolved": "https://registry.npmmirror.com/httpx/-/httpx-2.3.3.tgz",
"integrity": "sha512-k1qv94u1b6e+XKCxVbLgYlOypVP9MPGpnN5G/vxFf6tDO4V3xpz3d6FUOY/s8NtPgaq5RBVVgSB+7IHpVxMYzw==",
"requires": {
"@types/node": "^20",
"debug": "^4.1.1"
},
"dependencies": {
"@types/node": {
"version": "20.17.10",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-20.17.10.tgz",
"integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==",
"requires": {
"undici-types": "~6.19.2"
}
},
"debug": {
"version": "4.4.0",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz",
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"requires": {
"ms": "^2.1.3"
}
}
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="
},
"ip-address": {
"version": "9.0.5",
"resolved": "https://registry.npmmirror.com/ip-address/-/ip-address-9.0.5.tgz",
"integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
"requires": {
"jsbn": "1.1.0",
"sprintf-js": "^1.1.3"
}
},
"ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
},
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
},
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
},
"jsbn": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-1.1.0.tgz",
"integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="
},
"json-bigint": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz",
"integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
"requires": {
"bignumber.js": "^9.0.0"
}
},
"json-schema": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz",
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
},
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"requires": {
"graceful-fs": "^4.1.6"
}
},
"jsprim": {
"version": "1.4.2",
"resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-1.4.2.tgz",
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.4.0",
"verror": "1.10.0"
}
},
"kareem": {
"version": "2.3.4",
"resolved": "https://registry.npmmirror.com/kareem/-/kareem-2.3.4.tgz",
"integrity": "sha512-Vcrt8lcpVl0s8ePx634BxwRqmFo+5DcOhlmNadehxreMTIQi/9hOL/B3hZQQbK5DgMS7Lem3xABXV7/S3jy+7g=="
},
"kitx": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/kitx/-/kitx-1.3.0.tgz",
"integrity": "sha512-fhBqFlXd0GkKTB+8ayLfpzPUw+LHxZlPAukPNBD1Om7JMeInT+/PxCAf1yLagvD+VKoyWhXtJR68xQkX/a0wOQ=="
},
"log4js": {
"version": "6.9.1",
"resolved": "https://registry.npmmirror.com/log4js/-/log4js-6.9.1.tgz",
"integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==",
"requires": {
"date-format": "^4.0.14",
"debug": "^4.3.4",
"flatted": "^3.2.7",
"rfdc": "^1.3.0",
"streamroller": "^3.1.5"
},
"dependencies": {
"debug": {
"version": "4.4.0",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz",
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"requires": {
"ms": "^2.1.3"
}
}
}
},
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"md5": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
"integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
"requires": {
"charenc": "0.0.2",
"crypt": "0.0.2",
"is-buffer": "~1.1.6"
}
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
},
"memory-pager": {
"version": "1.5.0",
"resolved": "https://registry.npmmirror.com/memory-pager/-/memory-pager-1.5.0.tgz",
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
"optional": true
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
},
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz",
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"requires": {
"mime-db": "1.52.0"
}
},
"moment": {
"version": "2.29.1",
"resolved": "https://registry.npmmirror.com/moment/-/moment-2.29.1.tgz",
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
},
"mongodb": {
"version": "4.3.1",
"resolved": "https://registry.npmmirror.com/mongodb/-/mongodb-4.3.1.tgz",
"integrity": "sha512-sNa8APSIk+r4x31ZwctKjuPSaeKuvUeNb/fu/3B6dRM02HpEgig7hTHM8A/PJQTlxuC/KFWlDlQjhsk/S43tBg==",
"requires": {
"bson": "^4.6.1",
"denque": "^2.0.1",
"mongodb-connection-string-url": "^2.4.1",
"saslprep": "^1.0.3",
"socks": "^2.6.1"
}
},
"mongodb-connection-string-url": {
"version": "2.6.0",
"resolved": "https://registry.npmmirror.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
"integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
"requires": {
"@types/whatwg-url": "^8.2.1",
"whatwg-url": "^11.0.0"
}
},
"mongoose": {
"version": "6.2.3",
"resolved": "https://registry.npmmirror.com/mongoose/-/mongoose-6.2.3.tgz",
"integrity": "sha512-FxF2D0MGGIw9bAJ57nSyM4Hs4tDHbu6dn9gQwT1J/lxmRB8jfaWWJ3FSJXTmeYlQ6BpyKeIaT8fj6SAX0YMNBA==",
"requires": {
"bson": "^4.2.2",
"kareem": "2.3.4",
"mongodb": "4.3.1",
"mpath": "0.8.4",
"mquery": "4.0.2",
"ms": "2.1.3",
"sift": "16.0.0"
}
},
"mpath": {
"version": "0.8.4",
"resolved": "https://registry.npmmirror.com/mpath/-/mpath-0.8.4.tgz",
"integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g=="
},
"mquery": {
"version": "4.0.2",
"resolved": "https://registry.npmmirror.com/mquery/-/mquery-4.0.2.tgz",
"integrity": "sha512-oAVF0Nil1mT3rxty6Zln4YiD6x6QsUWYz927jZzjMxOK2aqmhEz5JQ7xmrKK7xRFA2dwV+YaOpKU/S+vfNqKxA==",
"requires": {
"debug": "4.x"
},
"dependencies": {
"debug": {
"version": "4.4.0",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz",
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"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=="
},
"negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
},
"node-xlsx": {
"version": "0.16.1",
"resolved": "https://registry.npmmirror.com/node-xlsx/-/node-xlsx-0.16.1.tgz",
"integrity": "sha512-mwEZKItGXKO+jp5Pz9+wDCXxqhJITGd6m81A8WmalBpGAzREiR5cIJ0xrSF0BxzU6Mh2mC0fA2X0/3GqNU6dIw==",
"requires": {
"@babel/runtime": "^7.12.5",
"buffer-from": "^1.1.1",
"xlsx": "^0.16.9"
}
},
"nodemailer": {
"version": "6.5.0",
"resolved": "https://registry.npmmirror.com/nodemailer/-/nodemailer-6.5.0.tgz",
"integrity": "sha512-Tm4RPrrIZbnqDKAvX+/4M+zovEReiKlEXWDzG4iwtpL9X34MJY+D5LnQPH/+eghe8DLlAVshHAJZAZWBGhkguw=="
},
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
"requires": {
"ee-first": "1.1.1"
}
},
"on-headers": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
},
"opentype.js": {
"version": "0.7.3",
"resolved": "https://registry.npmmirror.com/opentype.js/-/opentype.js-0.7.3.tgz",
"integrity": "sha512-Veui5vl2bLonFJ/SjX/WRWJT3SncgiZNnKUyahmXCc2sa1xXW15u3R/3TN5+JFiP7RsjK5ER4HA5eWaEmV9deA==",
"requires": {
"tiny-inflate": "^1.0.2"
}
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
},
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
},
"printj": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/printj/-/printj-1.1.2.tgz",
"integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
},
"proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"requires": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
}
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
},
"psl": {
"version": "1.15.0",
"resolved": "https://registry.npmmirror.com/psl/-/psl-1.15.0.tgz",
"integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
"requires": {
"punycode": "^2.3.1"
}
},
"punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="
},
"pyfl": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/pyfl/-/pyfl-1.1.4.tgz",
"integrity": "sha512-tEwj+SYfOk7zMStPrcDvadkUYomRIX6URQA/dl+YDqaEZlP9gEXM501FUsorz5HozCkfIeFOoT7U2jTElQ+zYg=="
},
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
"raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.4.0.tgz",
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"requires": {
"bytes": "3.1.0",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"dependencies": {
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
}
}
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
"har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"dependencies": {
"qs": {
"version": "6.5.3",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz",
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
}
}
},
"rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"saslprep": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/saslprep/-/saslprep-1.0.3.tgz",
"integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
"optional": true,
"requires": {
"sparse-bitfield": "^3.0.3"
}
},
"sax": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz",
"integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="
},
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmmirror.com/send/-/send-0.17.1.tgz",
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
"requires": {
"debug": "2.6.9",
"depd": "~1.1.2",
"destroy": "~1.0.4",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "~1.7.2",
"mime": "1.6.0",
"ms": "2.1.1",
"on-finished": "~2.3.0",
"range-parser": "~1.2.1",
"statuses": "~1.5.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
},
"dependencies": {
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
},
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
}
}
},
"serve-static": {
"version": "1.14.1",
"resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.14.1.tgz",
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.17.1"
}
},
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
},
"sift": {
"version": "16.0.0",
"resolved": "https://registry.npmmirror.com/sift/-/sift-16.0.0.tgz",
"integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ=="
},
"smart-buffer": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz",
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
},
"socks": {
"version": "2.8.3",
"resolved": "https://registry.npmmirror.com/socks/-/socks-2.8.3.tgz",
"integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
"requires": {
"ip-address": "^9.0.5",
"smart-buffer": "^4.2.0"
}
},
"sparse-bitfield": {
"version": "3.0.3",
"resolved": "https://registry.npmmirror.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
"integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
"optional": true,
"requires": {
"memory-pager": "^1.0.2"
}
},
"sprintf-js": {
"version": "1.1.3",
"resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz",
"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
},
"ssf": {
"version": "0.11.2",
"resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
"integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
"requires": {
"frac": "~1.1.2"
}
},
"sshpk": {
"version": "1.18.0",
"resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz",
"integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
},
"dependencies": {
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
}
}
},
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="
},
"streamroller": {
"version": "3.1.5",
"resolved": "https://registry.npmmirror.com/streamroller/-/streamroller-3.1.5.tgz",
"integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==",
"requires": {
"date-format": "^4.0.14",
"debug": "^4.3.4",
"fs-extra": "^8.1.0"
},
"dependencies": {
"debug": {
"version": "4.4.0",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz",
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"requires": {
"ms": "^2.1.3"
}
}
}
},
"svg-captcha": {
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/svg-captcha/-/svg-captcha-1.4.0.tgz",
"integrity": "sha512-/fkkhavXPE57zRRCjNqAP3txRCSncpMx3NnNZL7iEoyAtYwUjPhJxW6FQTQPG5UPEmCrbFoXS10C3YdJlW7PDg==",
"requires": {
"opentype.js": "^0.7.3"
}
},
"tiny-inflate": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
"integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
},
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz",
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"requires": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
}
},
"tr46": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz",
"integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
"requires": {
"punycode": "^2.1.1"
}
},
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"requires": {
"safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
},
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"requires": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
}
},
"undici-types": {
"version": "6.19.8",
"resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="
},
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
},
"uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"requires": {
"punycode": "^2.1.0"
}
},
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
},
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
},
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz",
"integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"webidl-conversions": {
"version": "7.0.0",
"resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
"integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
},
"whatwg-url": {
"version": "11.0.0",
"resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz",
"integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
"requires": {
"tr46": "^3.0.0",
"webidl-conversions": "^7.0.0"
}
},
"wmf": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
"integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
},
"word": {
"version": "0.3.0",
"resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
"integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
},
"xlsx": {
"version": "0.16.9",
"resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.16.9.tgz",
"integrity": "sha512-gxi1I3EasYvgCX1vN9pGyq920Ron4NO8PNfhuoA3Hpq6Y8f0ECXiy4OLrK4QZBnj1jx3QD+8Fq5YZ/3mPZ5iXw==",
"requires": {
"adler-32": "~1.2.0",
"cfb": "^1.1.4",
"codepage": "~1.14.0",
"commander": "~2.17.1",
"crc-32": "~1.2.0",
"exit-on-epipe": "~1.0.1",
"fflate": "^0.3.8",
"ssf": "~0.11.2",
"wmf": "~1.0.1",
"word": "~0.3.0"
}
},
"xml2js": {
"version": "0.4.23",
"resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.4.23.tgz",
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
"requires": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
}
},
"xmlbuilder": {
"version": "11.0.1",
"resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
}
}
}
{
"name": "gameserver",
"version": "1.0.0",
"description": "",
"main": "main.ts",
"dependencies": {
"@alicloud/sms-sdk": "^1.1.6",
"@types/node": "^10.12.18",
"compression": "^1.7.4",
"express": "^4.17.1",
"express-async-handler": "^1.1.4",
"express-history-api-fallback": "^2.2.1",
"formidable": "^1.2.1",
"log4js": "^6.9.1",
"lru-cache": "^4.1.5",
"md5": "^2.2.1",
"moment": "^2.24.0",
"mongoose": "^6.2.3",
"node-xlsx": "^0.16.1",
"nodemailer": "^6.1.1",
"pyfl": "^1.1.4",
"request": "^2.88.0",
"svg-captcha": "^1.3.12",
"xml2js": "^0.4.23"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
File added
File added
<config>
<port>40029</port>
<imgPath>http://192.168.0.189:40028</imgPath>
<token>73n6124cv7rq614c572x80jma7mj3yhs</token>
<userName>1</userName>
<plantId>735608</plantId>
<dataCenterInterface>
<!-- 获取某电站数据概览 -->
<hqmdzsjgl>https://openapi-cn.growatt.com/v1/plant/data</hqmdzsjgl>
<hqmgyhddzlb>https://openapi-cn.growatt.com/v1/plant/user_plant_list</hqmgyhddzlb>
<hqsyyhdz>https://openapi-cn.growatt.com/v1/plant/list</hqsyyhdz>
<hqmdzlsfdl>https://openapi-cn.growatt.com/v1/plant/energy</hqmdzlsfdl>
<hqmdzjbxx>https://openapi-cn.growatt.com/v1/plant/details</hqmdzjbxx>
<hqmdzmytgl>https://openapi-cn.growatt.com/v1/plant/power</hqmdzmytgl>
</dataCenterInterface>
</config>
import { cyszhglTableData } from '../data/table/cyszhglData';
import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, tablePackage } from '../dataPackage/inFrontOut';
import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getTableOut } from '../dataPackage/out';
/* 产业数字化管理 */
export function getData(req, res) {
let excelData = cyszhglTableData();
let ret:any = {};
let mqjcPackageData = onceYBarChartPackage( excelData['苗情检测'], '成熟度','');
ret['mqjc'] = getOnceYBarChartOut('苗情检测', mqjcPackageData);
let zztrpsyqsfxPackageData = onceYBarChartPackage( excelData['种子投入品使用趋势分析'], '斤','');
ret['zztrpsyqsfx'] = getOnceYBarChartOut('种子投入品使用趋势分析', zztrpsyqsfxPackageData);
let zmtrpsyqsfxPackageData = onceYBarChartPackage( excelData['种苗投入品使用趋势分析'], '斤','');
ret['zmtrpsyqsfx'] = getOnceYBarChartOut('种苗投入品使用趋势分析', zmtrpsyqsfxPackageData);
let fltrpsyqsfxPackageData = onceYBarChartPackage( excelData['肥料投入品使用趋势分析'], '斤','');
ret['fltrpsyqsfx'] = getOnceYBarChartOut('肥料投入品使用趋势分析', fltrpsyqsfxPackageData);
let nytrpsyqsfxPackageData = onceYBarChartPackage( excelData['农药投入品使用趋势分析'], '斤','');
ret['nytrpsyqsfx'] = getOnceYBarChartOut('农药投入品使用趋势分析', nytrpsyqsfxPackageData);
let scxyfxPackageData = doubleYBarCharPackage(excelData['蔬菜效益分析'], [], '吨', '万元' );
ret['scxyfx'] = getDoubleYBarChartOut('蔬菜效益分析', scxyfxPackageData);
let yyxyfxPackageData = doubleYBarCharPackage(excelData['渔业效益分析'], [], '吨', '万元' );
ret['yyxyfx'] = getDoubleYBarChartOut('渔业效益分析', yyxyfxPackageData);
let fxlxzbPackageData = keyValuePackage(excelData['风险类型占比'].dataList);
ret['fxlxzb'] = getKeyValueOut('风险类型占比', fxlxzbPackageData);
let sfjdglPackageData = keyValuePackage(excelData['示范基地概览'].dataList);
ret['sfjdgl'] = getKeyValueOut('示范基地概览', sfjdglPackageData);
// let zzzlPackageData = keyValuePackage(excelData['种植种类'].dataList);
// ret['zzzl'] = getKeyValueOut('种植种类', zzzlPackageData);
// let zzfbPackageData = keyValuePackage(excelData['种植分布'].dataList);
// ret['zzfb'] = getKeyValueOut('种植分布', zzfbPackageData);
let zzzlTableData = tablePackage(excelData["种植种类"].headerList[0], excelData["种植种类"].bodyList);
ret['zzzl'] = getTableOut( '种植种类', zzzlTableData);
let zzfbTableData = tablePackage(excelData["种植分布"].headerList[0], excelData["种植分布"].bodyList);
ret['zzfb'] = getTableOut( '种植分布', zzfbTableData);
let sfdtrpsyjlPackageData = keyValuePackage(excelData['示范地投入品使用记录'].dataList);
ret['sfdtrpsyjl'] = getKeyValueOut('示范地投入品使用记录', sfdtrpsyjlPackageData);
let fxyjPackageData = keyValuePackage(excelData['风险预警'].dataList);
ret['fxyj'] = getKeyValueOut('风险预警', fxyjPackageData);
let cyxlphPackageData = keyValuePackage(excelData['产业销量排行'].dataList);
ret['cyxlph'] = getKeyValueOut('产业销量排行', cyxlphPackageData);
// let cpsyxxPackageData = keyValuePackage(excelData['产品溯源信息'].dataList);
// ret['cpsyxx'] = getKeyValueOut('产品溯源信息', cpsyxxPackageData);
let cpsyxxTableData = tablePackage(excelData["产品溯源信息"].headerList[0], excelData["产品溯源信息"].bodyList);
ret['cpsyxx'] = getTableOut( '产品溯源信息', cpsyxxTableData);
let szcyPackageData = keyValuePackage(excelData['数字产业'].dataList);
ret['szcy'] = getKeyValueOut('数字产业', szcyPackageData);
let yjxqgdTableData = tablePackage(excelData["预警详情工单"].headerList[0], excelData["预警详情工单"].bodyList);
ret['yjxqgd'] = getTableOut( '预警详情工单', yjxqgdTableData);
// let znggTableData = onceYBarChartPackage( excelData['智能灌溉'], '','');
// ret['zngg'] = getOnceYBarChartOut('智能灌溉', znggTableData);
// let znggTableData = tablePackage(excelData["智能灌溉"].headerList[0], excelData["智能灌溉"].bodyList);
// let znggTableData = {};
// excelData["智能灌溉"].dataList.forEach( info => {
// let {ntwz, trsd, ggsj, ggjgsj, sfxygg} = info;
// info["img"] =
// znggTableData[ntwz] = info;
// })
let znggTableData = {};
excelData["智能灌溉"].dataList.forEach( info => {
let {ntwz, trsd, ggsj, ggjgsj, sfxygg, imageSrc} = info;
info["img"] = imageSrc || '图片地址';
znggTableData[ntwz] = info;
})
ret['zngg'] = {title:'智能灌溉', dataList:znggTableData};
res.send(ret);
}
\ No newline at end of file
import { gbzscbgjdAqTableData } from '../data/table/gbzscbgjdAq';
import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, tablePackage } from '../dataPackage/inFrontOut';
import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getTableOut } from '../dataPackage/out';
import { systemConfig } from "../config/serverConfig";
/* A区 */
export function getData(req, res) {
let excelData = gbzscbgjdAqTableData();
let ret:any = {};
let zzzwclqkPackageData = onceYBarChartPackage(excelData['种植作物产量情况'], '', '');
// 添加全部作物的数据汇总叶菜和根茎类数据
let allCropsData = excelData['叶菜类']?.dataList.concat(excelData['根茎类']?.dataList || []);
if (allCropsData) {
let allCropsPackageData = onceYBarChartPackage(allCropsData, '', '');
ret['全部作物'] = getOnceYBarChartOut('全部作物', allCropsPackageData);
}
ret['zzzwclqk'] = getOnceYBarChartOut('种植作物产量情况', zzzwclqkPackageData);
let AqjdxqPackageData = keyValuePackage(excelData['A区基地详情'].dataList);
ret['Aqjdxq'] = getKeyValueOut('A区基地详情', AqjdxqPackageData);
let jdfxPackageData = keyValuePackage(excelData['基地分析'].dataList);
ret['jdfx'] = getKeyValueOut('基地分析', jdfxPackageData);
let cpsyPackageData = keyValuePackage(excelData['产品溯源'].dataList);
ret['cpsy'] = getKeyValueOut('产品溯源', cpsyPackageData);
let cpfxzbPackageData = keyValuePackage(excelData['产品分销占比'].dataList);
ret['cpfxzb'] = getKeyValueOut('产品分销占比', cpfxzbPackageData);
let zzzwpzTableData = tablePackage(excelData["种植作物品种"].headerList[0], excelData["种植作物品种"].bodyList);
zzzwpzTableData.titleList.push("图片地址");
let zzzwpz = {dataList:[], titleList:zzzwpzTableData.titleList};
zzzwpzTableData.dataList.forEach(info => {
let {A} = info;
let imgUrl = `${systemConfig.imgPath}/${A}.png`;
info["F"] = imgUrl;
zzzwpz.dataList.push(info);
})
ret['zzzwpz'] = getTableOut( '种植作物品种', zzzwpz);
res.send(ret);
}
\ No newline at end of file
import { info } from 'console';
import { gbzscbgjdBqTableData } from '../data/table/gbzscbgjdBq';
import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, tablePackage } from '../dataPackage/inFrontOut';
import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getTableOut } from '../dataPackage/out';
import { systemConfig } from '../config/serverConfig';
/* B区 */
export function getData(req, res) {
let excelData = gbzscbgjdBqTableData();
let ret:any = {};
let zzzwclqkPackageData = onceYBarChartPackage( excelData['种植作物产量情况'], '','');
ret['zzzwclqk'] = getOnceYBarChartOut('种植作物产量情况', zzzwclqkPackageData);
let BqjdxqPackageData = keyValuePackage(excelData['B区基地详情'].dataList);
ret['Bqjdxq'] = getKeyValueOut('B区基地详情', BqjdxqPackageData);
let jdfxPackageData = keyValuePackage(excelData['基地分析'].dataList);
ret['jdfx'] = getKeyValueOut('基地分析', jdfxPackageData);
let cpsyPackageData = keyValuePackage(excelData['产品溯源'].dataList);
ret['cpsy'] = getKeyValueOut('产品溯源', cpsyPackageData);
let cpfxzbPackageData = keyValuePackage(excelData['产品分销占比'].dataList);
ret['cpfxzb'] = getKeyValueOut('产品分销占比', cpfxzbPackageData);
let zzzwpzTableData = tablePackage(excelData["种植作物品种"].headerList[0], excelData["种植作物品种"].bodyList);
zzzwpzTableData.titleList.push('图片地址');
let zzzwpz = {dataList:[],titleList:zzzwpzTableData.titleList};
zzzwpzTableData.dataList.forEach(info => {
let {B} = info;
let imgUrl = `${systemConfig.imgPath}/${B}.png`;
info['F'] = imgUrl;
zzzwpz.dataList.push(info);
});
ret['zzzwpz'] = getTableOut( '种植作物品种', zzzwpzTableData);
res.send(ret);
}
\ No newline at end of file
/**
* 左屏
*/
import { getGuangFu } from "../data/interface/dataInterface";
import { getKeyValueOut, getOnceYBarChartOut } from "../dataPackage/out";
let guangfuData = {
jbqk: [
],
nhfx: {
count: [
{
key: "年用电量",
value: 0,
},
{
key: "光伏发电量",
value: "61312.7",
},
],
charData: [
],
dayData: [
],
},
trsy: {
count: [
{
key: "光伏投入成本",
value: "123",
},
{
key: "运维成本",
value: "123",
},
{
key: "发电量",
value: "61312.7",
},
{
key: "发电时长",
value: 0,
},
],
charData: [
{
key: "2016",
value: "518",
},
{
key: "2017",
value: "733",
},
{
key: "2018",
value: "116",
},
{
key: "2019",
value: "634",
},
{
key: "2020",
value: "116",
},
{
key: "2021",
value: "634",
},
],
},
ztsj: [
{
key: "装机容量",
value: 46,
},
{
key: "总发电量",
value: "61312.7",
},
{
key: "实时功率",
value: 13.800000190734863,
},
],
xyfxfd: {
count: [
],
chartData: [
],
},
xyfx: {
count: [
{
key: "今日收益",
value: 113.52,
},
{
key: "当月收益",
value: 2008.74,
},
{
key: "累计收益",
value: "123",
},
],
chartData: {
"今年": [
],
"去年": [
],
},
},
jnjp: {
count: [
{
key: "二氧化碳",
value: "832克/千瓦时",
},
{
key: "氮氧化物",
value: "0.179克/千瓦时",
},
{
key: "二氧化硫",
value: "0.16克/千瓦时",
},
{
key: "电力烟尘",
value: "0.032克/千瓦时",
},
],
chartData: [
],
},
};
/**
* 初始化接口数据
*/
export async function guangfuInit() {
await getGuangFu();
console.log();
}
/**
* 左屏
* @param req
* @param res
*/
export async function getLeft(req, res) {
let ret:any = {};
ret['jbqk'] = getKeyValueOut('基本情况', guangfuData.jbqk);
ret['fdglpjzfx'] = getKeyValueOut('能耗分析', guangfuData.nhfx.count);
ret['fdglpjzfxqst'] = getKeyValueOut('发电功率平均值分析趋势图', guangfuData.nhfx.charData);
ret['fdgldtgl'] = getKeyValueOut('发电功率当天分析', guangfuData.nhfx.dayData)
ret['trsy'] = getKeyValueOut('投入使用', guangfuData.trsy.count);
ret['trsyqst'] = getKeyValueOut('投入使用趋势', guangfuData.trsy.charData);
res.send(ret);
}
/**
* 中间
* @param req
* @param res
*/
export async function getData(req, res) {
let ret:any = {};
ret['ztsj'] = getKeyValueOut('整体数据', guangfuData.ztsj);
res.send(ret);
}
/**
* 右屏
* @param req
* @param res
*/
export async function getRight(req, res) {
let ret:any = {};
ret['xyfxfd'] = getKeyValueOut('效益分析-发电量', guangfuData.xyfxfd.count);
ret['xyfxfdqst'] = getKeyValueOut('效益分析-发电量趋势', guangfuData.xyfxfd.chartData);
ret['xyfx'] = getKeyValueOut('效益分析', guangfuData.xyfx.count);
ret['xyfxqst'] = {title:"效益分析趋势", dataList:guangfuData.xyfx.chartData}
ret['jnjp'] = getKeyValueOut('节能减排', guangfuData.jnjp.count);
ret['jnjpqst'] = getKeyValueOut('节能减排趋势', guangfuData.jnjp.chartData);
res.send(ret);
}
import { gfnyTableData } from '../data/table/gfnyData';
import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, tablePackage } from '../dataPackage/inFrontOut';
import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getTableOut } from '../dataPackage/out';
/* 光伏能源 */
export function getData(req, res) {
// let excelData = gfnyTableData();
let ret:any = {};
// let fdglpjzfxPackageData = onceYBarChartPackage( excelData['发电功率平均值分析'], '','');
// ret['fdglpjzfx'] = getOnceYBarChartOut('发电功率平均值分析', fdglpjzfxPackageData);
// let fdglzdzfxPackageData = onceYBarChartPackage( excelData['发电功率最大值分析'], '','');
// ret['fdglzdzfx'] = getOnceYBarChartOut('发电功率最大值分析', fdglzdzfxPackageData);
// let trsyqsPackageData = onceYBarChartPackage( excelData['投入使用趋势'], '','');
// ret['trsyqs'] = getOnceYBarChartOut('投入使用趋势', trsyqsPackageData);
// let fdlqsPackageData = onceYBarChartPackage( excelData['发电量趋势'], '','');
// ret['fdlqs'] = getOnceYBarChartOut('发电量趋势', fdlqsPackageData);
// let ljjptjPackageData = onceYBarChartPackage( excelData['累计减排统计'], '','');
// ret['ljjptj'] = getOnceYBarChartOut('累计减排统计', ljjptjPackageData);
// let jbqkPackageData = keyValuePackage(excelData['基本情况'].dataList);
// ret['jbqk'] = getKeyValueOut('基本情况', jbqkPackageData);
// let nhfxPackageData = keyValuePackage(excelData['能耗分析'].dataList);
// ret['nhfx'] = getKeyValueOut('能耗分析', nhfxPackageData);
// let trsyPackageData = keyValuePackage(excelData['投入使用'].dataList);
// ret['trsy'] = getKeyValueOut('投入使用', trsyPackageData);
// let gfnyPackageData = keyValuePackage(excelData['光伏能源'].dataList);
// ret['gfny'] = getKeyValueOut('光伏能源', gfnyPackageData);
// // let xyfxPackageData = keyValuePackage(excelData['效益分析'].dataList);
// // ret['xyfx'] = getKeyValueOut('效益分析', xyfxPackageData);
// let xyfxPackageData = keyValuePackage(excelData['效益分析'].dataList);
// ret['xyfx'] = getKeyValueOut('效益分析', xyfxPackageData);
// let jnjpPackageData = keyValuePackage(excelData['节能减排'].dataList);
// ret['jnjp'] = getKeyValueOut('节能减排', jnjpPackageData);
res.send(ret);
}
\ No newline at end of file
import { systemConfig } from '../config/serverConfig';
import { hjszzlTableData } from '../data/table/hjszzlData';
import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, stringListPackage, tablePackage } from '../dataPackage/inFrontOut';
import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getStringOut, getTableOut } from '../dataPackage/out';
/* 环境数字治理 */
export function getData(req, res) {
let excelData = hjszzlTableData();
let ret:any = {};
let qwqsPackageData = onceYBarChartPackage( excelData['气温趋势'], '','');
ret['qwqs'] = getOnceYBarChartOut('气温趋势', qwqsPackageData);
let trwlysjcPackageData = onceYBarChartPackage( excelData['土壤微量元素监测'], '','');
ret['trwlysjc'] = getOnceYBarChartOut('土壤微量元素监测', trwlysjcPackageData);
let zdqsbhPackageData = onceYBarChartPackage( excelData['浊度趋势变化'], '','');
ret['zdqsbh'] = getOnceYBarChartOut('浊度趋势变化', zdqsbhPackageData);
let wdbhqsPackageData = onceYBarChartPackage( excelData['温度趋势变化'], '','');
ret['zdqswdbhqsbh'] = getOnceYBarChartOut('温度趋势变化', wdbhqsPackageData);
let PHzqsbhPackageData = onceYBarChartPackage( excelData['PH值趋势变化'], '','');
ret['PHzqsbh'] = getOnceYBarChartOut('浊度趋势变化', PHzqsbhPackageData);
let NH3NqsbhPackageData = onceYBarChartPackage( excelData['NH3-N趋势变化'], '','');
ret['NH3Nqsbh'] = getOnceYBarChartOut('NH3-N趋势变化', NH3NqsbhPackageData);
let rjyqsbhPackageData = onceYBarChartPackage( excelData['溶解氧趋势变化'], '','');
ret['rjyqsbh'] = getOnceYBarChartOut('溶解氧趋势变化', rjyqsbhPackageData);
let chzlcxPackageData = onceYBarChartPackage( excelData['虫害治理成效'], '','');
ret['chzlcx'] = getOnceYBarChartOut('虫害治理成效', chzlcxPackageData);
let tqjcPackageData = keyValuePackage(excelData['天气检测'].dataList);
ret['tqjc'] = getKeyValueOut('天气检测', tqjcPackageData);
let trjcPackageData = keyValuePackage(excelData['土壤检测'].dataList);
ret['trjc'] = getKeyValueOut('土壤检测', trjcPackageData);
let szjcPackageData = keyValuePackage(excelData['水质检测'].dataList);
ret['szjc'] = getKeyValueOut('水质检测', szjcPackageData);
let hjjcfxPackageData = keyValuePackage(excelData['环境基础分析'].dataList);
ret['hjjcfx'] = getKeyValueOut('环境基础分析', hjjcfxPackageData);
let bhczlPackageData = stringListPackage(excelData["病害虫治理"].dataList);
let bhczl = [];
for(let i = 0; i < bhczlPackageData.length; i++) {
let img = `${systemConfig.imgPath}/${bhczlPackageData[i]}`;
bhczl.push(img);
}
ret['bhczl'] = getStringOut('病害虫治理', bhczlPackageData);
let chjcdyjPackageData = keyValuePackage(excelData['虫害检测灯预警'].dataList);
ret['chjcdyj'] = getKeyValueOut('虫害检测灯预警', chjcdyjPackageData);
let zlqkPackageData = keyValuePackage(excelData['治理情况'].dataList);
ret['zlqk'] = getKeyValueOut('治理情况', zlqkPackageData);
let tqjcbTableData = tablePackage(excelData["天气检测表"].headerList[0], excelData["天气检测表"].bodyList);
ret['tqjcb'] = getTableOut( '天气检测表', tqjcbTableData);
let zhxyjglPackageData = keyValuePackage(excelData['灾害性应急管理'].dataList);
ret['zhxyjgl'] = getKeyValueOut('灾害性应急管理', zhxyjglPackageData);
let qxzhlbPackageData = keyValuePackage(excelData['气象灾害列表'].dataList);
ret['qxzhlb'] = getKeyValueOut('气象灾害列表', qxzhlbPackageData);
res.send(ret);
}
\ No newline at end of file
import { jdaqglTableData } from '../data/table/jdaqglData';
import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, tablePackage } from '../dataPackage/inFrontOut';
import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getTableOut } from '../dataPackage/out';
/* 基地安全管理 */
export function getData(req, res) {
let excelData = jdaqglTableData();
let ret:any = {};
let jqtsbzxqkPackageData = onceYBarChartPackage( excelData['近七天设备在线情况'], '','');
ret['jqtsbzxqk'] = getOnceYBarChartOut('近七天设备在线情况', jqtsbzxqkPackageData);
let sblxzbPackageData = keyValuePackage(excelData['设备类型占比'].dataList);
ret['sblxzb'] = getKeyValueOut('设备类型占比', sblxzbPackageData);
let sbslPackageData = keyValuePackage(excelData['设备数量'].dataList);
ret['sbsl'] = getKeyValueOut('设备数量', sbslPackageData);
let sbztqkPackageData = keyValuePackage(excelData['设备状态情况'].dataList);
ret['sbztqk'] = getKeyValueOut('设备状态情况', sbztqkPackageData);
let xfsbPackageData = keyValuePackage(excelData['消防设备'].dataList);
ret['xfsb'] = getKeyValueOut('消防设备', xfsbPackageData);
let xfsbztPackageData = keyValuePackage(excelData['消防设备状态'].dataList);
ret['xfsbzt'] = getKeyValueOut('消防设备状态', xfsbztPackageData);
let jdaqglsjfxPackageData = keyValuePackage(excelData['基地安全管理数据分析'].dataList);
ret['jdaqglsjfx'] = getKeyValueOut('基地安全管理数据分析', jdaqglsjfxPackageData);
let zcztlbTableData = tablePackage(excelData["正常状态列表"].headerList[0], excelData["正常状态列表"].bodyList);
ret['zcztlb'] = getTableOut( '正常状态列表', zcztlbTableData);
let whzztlbTableData = tablePackage(excelData["维护中状态列表"].headerList[0], excelData["维护中状态列表"].bodyList);
ret['whzztlb'] = getTableOut( '维护中状态列表', whzztlbTableData);
let gzztlbTableData = tablePackage(excelData["故障状态列表"].headerList[0], excelData["故障状态列表"].bodyList);
ret['gzztlb'] = getTableOut( '故障状态列表', gzztlbTableData);
let tqsjPackageData = keyValuePackage(excelData['天气数据'].dataList);
ret['tqsj'] = getKeyValueOut('天气数据', tqsjPackageData);
let sbyhjcPackageData = keyValuePackage(excelData['设备运行监测'].dataList);
ret['sbyhjc'] = getKeyValueOut('设备运行监测', sbyhjcPackageData);
let jjcdPackageData = keyValuePackage(excelData['紧急程度'].dataList);
ret['jjcd'] = getKeyValueOut('紧急程度', jjcdPackageData);
let gjqsPackageData = onceYBarChartPackage( excelData['告警趋势'], '个','');
ret['gjqs'] = getOnceYBarChartOut('告警趋势', gjqsPackageData);
let yjczPackageData = keyValuePackage(excelData['预警处置'].dataList);
ret['yjcz'] = getKeyValueOut('预警处置', yjczPackageData);
let yjczlPackageData = keyValuePackage(excelData['预警处置率'].dataList);
ret['yjczl'] = getKeyValueOut('预警处置率', yjczlPackageData);
let zdqyjkPackageData = keyValuePackage(excelData['重点区域监控'].dataList);
ret['zdqyjk'] = getKeyValueOut('重点区域监控', zdqyjkPackageData);
let yjczbTableData = tablePackage(excelData["预警处置表"].headerList[0], excelData["预警处置表"].bodyList);
ret['yjczb'] = getTableOut( '预警处置表', yjczbTableData);
res.send(ret);
}
\ No newline at end of file
/**
* 机器人
*/
import { jiQiRenTableData } from "../data/table/tableData";
import { keyValuePackage, onceYBarChartPackage, tablePackage } from "../dataPackage/inFrontOut";
import { getKeyValueOut, getOnceYBarChartOut, getTableOut } from "../dataPackage/out";
/**
* 左屏
* @param req
* @param res
*/
export async function getLeft(req, res) {
let ret:any = {};
let data = jiQiRenTableData();
ret['jqrlxzb'] = getKeyValueOut('机器人类型占比', data["机器人类型占比"].dataList);
ret['yxzt'] = getKeyValueOut('运行状态', data["运行状态"].dataList);
let yxqsfx = onceYBarChartPackage(data["运行趋势分析"], '');
ret['yxqsfx'] = getOnceYBarChartOut('运行趋势分析', yxqsfx);
let yxjl = tablePackage(data["运行记录"].headerList[0], data["运行记录"].bodyList);
ret['yxjl'] = getTableOut('运行记录', yxjl);
let qybj = onceYBarChartPackage(data["区域布局"], '');
ret['qybj'] = getOnceYBarChartOut('区域布局', qybj);
res.send(ret);
}
/**
* 右屏
* @param req
* @param res
*/
export async function getRight(req, res) {
let ret:any = {};
let data = jiQiRenTableData();
let xjsblx = onceYBarChartPackage(data["巡检设备类型"], '');
ret['xjsblx'] = getOnceYBarChartOut('巡检设备类型', xjsblx);
let xjqs = onceYBarChartPackage(data["巡检趋势"], '');
ret['xjqs'] = getOnceYBarChartOut('巡检趋势', xjqs);
let xjjl = tablePackage(data["巡检记录"].headerList[0], data["巡检记录"].bodyList);
ret['xjjl'] = getTableOut('巡检记录', xjjl);
let znjqrcl = onceYBarChartPackage(data["智能机器人产量"], '');
ret['znjqrcl'] = getOnceYBarChartOut('智能机器人产量', znjqrcl);
res.send(ret);
}
export async function getTop(req, res) {
let ret:any = {};
let data = jiQiRenTableData();
let jcxx = keyValuePackage(data["顶部指标"].dataList);
ret['jcxx'] = getKeyValueOut('顶部指标', jcxx);
res.send(ret);
}
\ No newline at end of file
import { nyjqrTableData } from '../data/table/nyjqrData';
import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, tablePackage } from '../dataPackage/inFrontOut';
import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getTableOut } from '../dataPackage/out';
/* 农业机器人 */
export function getData(req, res) {
let excelData = nyjqrTableData();
let ret:any = {};
let ysqsfxPackageData = onceYBarChartPackage( excelData['运势趋势分析'], '时长','');
ret['ysqsfx'] = getOnceYBarChartOut('运势趋势分析', ysqsfxPackageData);
let qyfbPackageData = onceYBarChartPackage( excelData['区域分布'], '','台套');
ret['qyfb'] = getOnceYBarChartOut('区域分布', qyfbPackageData);
let nyjqrsjPackageData = keyValuePackage(excelData['农业机器人数据'].dataList);
ret['nyjqrsj'] = getKeyValueOut('农业机器人数据', nyjqrsjPackageData);
let jqrlxzbPackageData = keyValuePackage(excelData['机器人类型占比'].dataList);
ret['jqrlxzb'] = getKeyValueOut('机器人类型占比', jqrlxzbPackageData);
let yhztPackageData = keyValuePackage(excelData['运行状态'].dataList);
ret['yhzt'] = getKeyValueOut('运行状态', yhztPackageData);
let yhjlTableData = tablePackage(excelData["运行记录"].headerList[0], excelData["运行记录"].bodyList);
ret['yhjl'] = getTableOut( '运行记录', yhjlTableData);
let jqrsjfxPackageData = keyValuePackage(excelData['机器人数据分析'].dataList);
ret['jqrsjfx'] = getKeyValueOut('机器人数据分析', jqrsjfxPackageData);
let znxjPackageData = keyValuePackage(excelData['智能巡检'].dataList);
ret['znxj'] = getKeyValueOut('智能巡检', znxjPackageData);
let xjsblxPackageData = onceYBarChartPackage( excelData['巡检设备类型'], '次数','');
ret['xjsblx'] = getOnceYBarChartOut('巡检设备类型', xjsblxPackageData);
let xjwcqkPackageData = keyValuePackage(excelData['巡检完成情况'].dataList);
ret['xjwcqk'] = getKeyValueOut('巡检完成情况', xjwcqkPackageData);
let xjqsPackageData = onceYBarChartPackage( excelData['巡检趋势'], '次数','');
ret['xjqs'] = getOnceYBarChartOut('巡检趋势', xjqsPackageData);
let xjjlTableData = tablePackage(excelData["巡检记录"].headerList[0], excelData["巡检记录"].bodyList);
ret['xjjl'] = getTableOut( '巡检记录', xjjlTableData);
let znjqrclPackageData = keyValuePackage(excelData['智能机器人产量'].dataList);
ret['znjqrcl'] = getKeyValueOut('智能机器人产量', znjqrclPackageData);
let jbnclqsPackageData = onceYBarChartPackage( excelData['近半年产量趋势'], '','月');
ret['jbnclqs'] = getOnceYBarChartOut('近半年产量趋势', jbnclqsPackageData);
res.send(ret);
}
\ No newline at end of file
import { sdt1hgfbTableData } from '../data/table/sdt1hgfbData';
import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, tablePackage } from '../dataPackage/inFrontOut';
import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getTableOut } from '../dataPackage/out';
/* 水稻田1号光伏板 */
export function getData(req, res) {
// let excelData = sdt1hgfbTableData();
let ret:any = {};
// let gfsjtjqstPackageData = onceYBarChartPackage( excelData['光伏数据统计趋势图'], '万/kwh','月');
// ret['gfsjtjqst'] = getOnceYBarChartOut('光伏数据统计趋势图', gfsjtjqstPackageData);
// let gfbPackageData = keyValuePackage(excelData['光伏板'].dataList);
// ret['gfb'] = getKeyValueOut('光伏板', gfbPackageData);
// let djPackageData = keyValuePackage(excelData['电机'].dataList);
// ret['dj'] = getKeyValueOut('电机', djPackageData);
// let gfsjtjPackageData = keyValuePackage(excelData['光伏数据统计'].dataList);
// ret['gfsjtj'] = getKeyValueOut('光伏数据统计', gfsjtjPackageData);
// let gfssxxTableData = tablePackage(excelData["光伏实时信息"].headerList[0], excelData["光伏实时信息"].bodyList);
// ret['gfssxx'] = getTableOut( '光伏实时信息', gfssxxTableData);
// let ycysjPackageData = onceYBarChartPackage( excelData['预测与实际'], '万/kWh','');
// ret['ycysj'] = getOnceYBarChartOut('预测与实际', ycysjPackageData);
res.send(ret);
}
\ No newline at end of file
import { yzdqxdnyzlTableData } from '../data/table/yzdqxdnyzlData';
import { doubleYBarCharPackage, keyValuePackage, onceYBarChartPackage, rankPackage, tablePackage } from '../dataPackage/inFrontOut';
import { getDoubleYBarChartOut, getKeyValueOut, getOnceYBarChartOut, getTableOut } from '../dataPackage/out';
/* “一轴多区”现代农业走廊 */
export function getData(req, res) {
let excelData = yzdqxdnyzlTableData();
let ret:any = {};
let szylylPackageData = keyValuePackage(excelData['水资源利用率'].dataList);
ret['szylyl'] = getKeyValueOut('水资源利用率', szylylPackageData);
let zrzyPackageData = keyValuePackage(excelData['自然资源'].dataList);
ret['zrzy'] = getKeyValueOut('自然资源', zrzyPackageData);
let qyqkPackageData = keyValuePackage(excelData['企业情况'].dataList);
ret['qyqk'] = getKeyValueOut('企业情况', qyqkPackageData);
let cyjgPackageData = keyValuePackage(excelData['产业结构'].dataList);
ret['cyjg'] = getKeyValueOut('产业结构', cyjgPackageData);
let cyztjgPackageData = keyValuePackage(excelData['产业主体结构'].dataList);
ret['cyztjg'] = getKeyValueOut('产业主体结构', cyztjgPackageData);
let zdxmjsPackageData = keyValuePackage(excelData['重点项目建设'].dataList);
ret['zdxmjs'] = getKeyValueOut('重点项目建设', zdxmjsPackageData);
let xmfxPackageData = keyValuePackage(excelData['项目分析'].dataList);
ret['xmfx'] = getKeyValueOut('项目分析', xmfxPackageData);
let zjfwPackageData = keyValuePackage(excelData['专家服务'].dataList);
ret['zjfw'] = getKeyValueOut('专家服务', zjfwPackageData);
let cxjsjcsjPackageData = keyValuePackage(excelData['创新技术基础数据'].dataList);
ret['cxjsjcsj'] = getKeyValueOut('创新技术基础数据', cxjsjcsjPackageData);
let yjjsyjqkPackageData = keyValuePackage(excelData['引进技术基础数据'].dataList);
ret['yjjsyjqk'] = getKeyValueOut('引进技术基础数据', yjjsyjqkPackageData);
let jsyjqkPackageData = keyValuePackage(excelData['技术创新引进情况'].dataList);
ret['jsyjqk'] = getKeyValueOut('技术创新引进情况', jsyjqkPackageData);
let jscxqsPackageData = onceYBarChartPackage( excelData['创新技术创新趋势'], '','');
ret['jscxqs'] = getOnceYBarChartOut('创新技术创新趋势', jscxqsPackageData);
let yjjscxqsPackageData = onceYBarChartPackage( excelData['引进技术创新趋势'], '','');
ret['yjjscxqs'] = getOnceYBarChartOut('引进技术创新趋势', yjjscxqsPackageData);
let jyglqkqstPackageData = keyValuePackage( excelData['经营管理情况趋势图'].dataList);
ret['jyglqkqst'] = getKeyValueOut('经营管理情况趋势图', jyglqkqstPackageData);
let jyglqkPackageData = keyValuePackage(excelData['经营管理情况'].dataList);
ret['jyglqk'] = getKeyValueOut('经营管理情况', jyglqkPackageData);
let zyyglxPackageData = keyValuePackage(excelData['专业员工类型'].dataList);
ret['zyyglx'] = getKeyValueOut('专业员工类型', zyyglxPackageData);
let ztsjfbPackageData = keyValuePackage(excelData['总体数据分布'].dataList);
ret['ztsjfb'] = getKeyValueOut('总体数据分布', ztsjfbPackageData);
res.send(ret);
}
\ No newline at end of file
/**-----------------------------接口枚举------------------------------- */
/**
* 接口更新类型
*/
export enum INTERFACEREQUESTTYPEENUM {
即时更新 = 1,
定时更新
}
export enum TYPEENUM {
string = 1,
number,
object,
array,
boolean,
}
/**上传文件类型 */
export enum FILETYPE {
word = 1,
pdf,
图片,
视频,
多类型
}
export enum ERRORENUM {
未找到数据,
数据操作失败,
暂无对应数据,
文件不存在,
参数错误,
地址数据不完整,
请完善信息,
接口数据获取失败
}
export enum SYSTEMERRORENUM {
参数错误 = 1,
您的登录已失效,
您的账户没有访问权限,
请求参数错误,
文件解析失败,
文件写入失败,
获取企业微信access_token失败,
获取企业微信用户信息失败,
请先绑定用户,
TOKEN失效,
该微信用户已绑定过账号,
存在TOKEN并没有绑定角色,
初始化配置失败,
暂无对应数据
}
export enum INTERFACEERRORENUM {
"系统错误" = 10001,
"电站不存在" = 10002,
"电站ID为空" = 10003,
"时间格式不正确" = 10004,
"没有权限访问" = 10011,
"访问频率限制5分钟/次" = 10012,
"页数超过100" = 10013,
"页数不能大于250页" = 10014,
}
let bizErrorMsgMap = {};
for (let key in ERRORENUM) {
bizErrorMsgMap[ERRORENUM[key]] = key;
}
let systemErrorMsgMap = {};
for (let key in SYSTEMERRORENUM) {
systemErrorMsgMap[SYSTEMERRORENUM[key]] = key;
}
export function getBizMsg(param) {
return bizErrorMsgMap[param];
}
export function getSysMsg(param) {
return systemErrorMsgMap[param];
}
\ No newline at end of file
import { INTERFACEREQUESTTYPEENUM } from "./enum";
import { dataCenterInterfaceConfig } from "./serverConfig";
//配置
// "接口名称":{
// type:"1是即时更新 2是即时更新 使用 INTERFACErEQUESTTYPEENUM",
// time:"更新频率毫秒 例如1小时这里就是 3600000",
// url:"url地址",
// reqType:"get还是post get = get post = post",
// header:{},
// body:{}
// }
const token = "73n6124cv7rq614c572x80jma7mj3yhsCAHMZC001";
export const Config = {
"获取某电站数据概览":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:dataCenterInterfaceConfig.hqmdzsjgl, reqType:"get", header:{token}, body:{}},
};
const path = require('path');
import * as fs from "fs";
import { BizError, SysError } from "../util/bizError";
import { analysisXml } from "../util/myXML";
import { ServerConfig } from "./systemClass";
import { SYSTEMERRORENUM } from "./errorEnum";
export let systemConfig = new ServerConfig;
const ConfigName = "serverConfig.xml";
export let dataCenterInterfaceConfig = {
hqmdzsjgl:"", //获取某电站数据概览
// hqsyyhdz: "", //获取所有用户电站列表
hqmgyhddzlb: "", //获取某个用户的电站列表
hqmdzlsfdl: "", //获取某电站历史发电量
hqmdzmytgl: "", //获取某电站某一天功率数据
hqmdzjbxx: "", //获取某电站基本信息
}
export async function initConfig() {
try {
let buff = fs.readFileSync(path.join(__dirname.substring(0,__dirname.indexOf("out")), ConfigName));
let configStr = buff.toString();
let configInfo:any = await analysisXml(configStr);
if (!configInfo || !configInfo.config) console.log("xml中无配置加载");
else {
//必要配置
let integralConfig = ["port", "token", "userName", "plantId",
{"dataCenterInterface":["hqmdzsjgl", "hqsyyhdz", "hqmgyhddzlb", "hqmdzlsfdl", "hqmdzmytgl", "hqmdzjbxx"]}
];
checkConfig(integralConfig, configInfo.config);
let {port, imgPath, token, userName, plantId, dataCenterInterface} = configInfo.config;
systemConfig.port = parseInt(port[0]);
systemConfig.imgPath = imgPath[0];
systemConfig.token = token[0];
systemConfig.userName = userName[0];
systemConfig.plantId = parseInt(plantId[0]);
//API数据接口
dataCenterInterfaceConfig.hqmdzsjgl = dataCenterInterface[0].hqmdzsjgl[0];
// dataCenterInterfaceConfig.hqsyyhdz = dataCenterInterface[0].hqsyyhdz[0];
dataCenterInterfaceConfig.hqmgyhddzlb = dataCenterInterface[0].hqmgyhddzlb[0];
dataCenterInterfaceConfig.hqmdzlsfdl = dataCenterInterface[0].hqmdzlsfdl[0];
dataCenterInterfaceConfig.hqmdzmytgl = dataCenterInterface[0].hqmdzmytgl[0];
dataCenterInterfaceConfig.hqmdzjbxx = dataCenterInterface[0].hqmdzjbxx[0];
// console.log(dataCenterInterfaceConfig.hqmdzsjgl);
}
} catch(err) {
throw new BizError("服务器配置解析错误 请检查根目录下 serverConfig.xml 文件是否正确");
}
}
function checkConfig(config, configData) {
config.forEach(item => {
if (typeof item == "object") {
for (let key in item) {
if (!configData[key] || !configData[key][0]) {
throw new SysError(SYSTEMERRORENUM.初始化配置失败, `serverConfig.xml中 缺少 ${key}`);
}
item[key].forEach( subItem => {
if (!configData[key][0][subItem] || !configData[key][0][subItem][0]) {
throw new SysError(SYSTEMERRORENUM.初始化配置失败, `serverConfig.xml中 ${key}缺少 ${subItem}`);
}
});
}
} else {
if (!configData[item] || !configData[item][0]) {
throw new SysError(SYSTEMERRORENUM.初始化配置失败, `serverConfig.xml中 缺少 ${item}`);
}
}
});
}
/**
* 系统配置类
*/
export class ServerConfig {
port:number;
imgPath:string;
token:string;
userName:string;
plantId:number;
}
//接口任务 定期更新
import * as request from 'request';
import { INTERFACEREQUESTTYPEENUM } from "../../config/enum";
import { BizError } from "../../util/bizError";
import { Config } from './interfaceConfig';
const http = require('http');
//初始化接口数据
export async function initInterfaceData() {
const InitTaskSuccess = await taskUpdate();
// if (!InitTaskSuccess) throw new BizError("服务器启动失败: 初始化定时接口数据时出现问题 请检查目标服务器或本地请求配置");
const InitRealTimeSuccess = await initRealTime();
// if (!InitRealTimeSuccess) throw new BizError("服务器启动失败: 初始化实时接口数据时出现问题 请检查目标服务器或本地请求配置");
console.log("初始化接口数据成功");
setInterval(() => {
taskUpdate();
}, 10000);
}
//异常接口 不更新数据
let errorInterfaceInfo = {};
//定时接口 数据更新情况
let updateInfo = {
"接口名称":{lastTime:0, updateUseTime:0},//使用时间是毫秒
};
//定时接口 缓存数据
let dataQueue = {};
async function taskUpdate() {
let thisTaskInfo = [];//此次任务
let defaultUseTime = 60000;
let thisTime = new Date().valueOf();
let initSuccess = true;
for (let interfaceName in Config) {
const LastReqError = errorInterfaceInfo[interfaceName];
if (LastReqError) {
console.log(`${interfaceName} 请求时出现过 ${LastReqError} 异常 保险起见此次更新不再请求`);
continue;
}
const ThisConfig = Config[interfaceName];
if (ThisConfig.type == INTERFACEREQUESTTYPEENUM.即时更新) continue;
let lastTaskInfo = updateInfo[interfaceName];
if ( !lastTaskInfo ) thisTaskInfo.push({name:defaultUseTime, useTime:defaultUseTime});
else if ( lastTaskInfo && (thisTime - lastTaskInfo) > ThisConfig.time ) {
thisTaskInfo.push({name:defaultUseTime, useTime:lastTaskInfo.updateUseTime});
}
defaultUseTime += 1;
}
thisTaskInfo.sort((a, b) => {return a.useTime - b.useTime});//耗时短的优先
for (let i = 0; i < thisTaskInfo.length; i++) { //更新数据
let {name} = thisTaskInfo[i];
const ThisConfig = Config[name];
const StartTime = new Date().valueOf();
let reqRes;
switch(ThisConfig.reqType) {
case "get": reqRes = await get(ThisConfig.url, ThisConfig.body, ThisConfig.header); break;
case "post": reqRes = await post(ThisConfig.url, ThisConfig.body, ThisConfig.header); break;
case "postForm": reqRes = await postForm(ThisConfig.url, ThisConfig.body); break;
}
const UseTime = new Date().valueOf() - StartTime;
if (reqRes.success) {
if (!updateInfo[name]) updateInfo[name] = {lastTime:thisTime, updateUseTime:UseTime};
else {
updateInfo[name].lastTime = thisTime;
updateInfo[name].updateUseTime = UseTime;
}
if (dataQueue[name]) delete dataQueue[name];
dataQueue[name] = JSON.stringify(reqRes.body);//放入缓存
} else {
let errorMsg = reqRes.message;
if (reqRes.message && reqRes.message.code == "ESOCKETTIMEDOUT") errorMsg = "超时";
console.log(`接口 ${name} 请求失败 失败原因${errorMsg}`);
if (["404", "503"].indexOf(errorMsg) > -1) { //下次不再请求
errorInterfaceInfo[name] = errorMsg;
}
initSuccess = false;
}
}
return initSuccess;
}
//即时数据缓存 当请求失败时会用到这里的数据
let realTimeDataQueue = {};
//即时数据初始化
async function initRealTime() {
let initSuccess = true;
for (let interfaceName in Config) {
const ThisConfig = Config[interfaceName];
if (ThisConfig.type == INTERFACEREQUESTTYPEENUM.定时更新) continue;
let reqRes;
switch(ThisConfig.reqType) {
case "get": reqRes = await get(ThisConfig.url, ThisConfig.body, ThisConfig.header); break;
case "post": reqRes = await post(ThisConfig.url, ThisConfig.body, ThisConfig.header); break;
case "postForm": reqRes = await postForm(ThisConfig.url, ThisConfig.body); break;
}
if (!reqRes.success) {
console.log(`${interfaceName} 接口请求失败 请求地址为 ${ThisConfig.url} 失败原因 ${reqRes.message}`);
initSuccess = false;
}
realTimeDataQueue[interfaceName] = reqRes.data;
}
return initSuccess;
}
export async function getInterfaceByInterfaceName(name, body?, header?) {
const ThisConfig = Config[name];
let data:any;
if (ThisConfig.type == INTERFACEREQUESTTYPEENUM.即时更新) {
let reqRes;
let reqBody = Object.assign( ThisConfig.body|| {}, body || {});
let reqHeader = Object.assign( ThisConfig.header|| {}, header || {});
switch(ThisConfig.reqType) {
case "get": reqRes = await get(ThisConfig.url, reqBody, reqHeader); break;
case "post": reqRes = await post(ThisConfig.url, reqBody, reqHeader); break;
case "getParmiss": reqRes = await getParmiss(ThisConfig.url, reqBody, reqHeader); break;
case "postParmiss": reqRes = await postParmiss(ThisConfig.url, reqBody, reqHeader); break;
case "postForm": reqRes = await postForm(ThisConfig.url, reqBody ); break;
case "postPHP": reqRes = await postPHP(ThisConfig.url, reqBody, reqHeader); break;
}
if (reqRes.success) {
data = reqRes.data;
} else {
data = realTimeDataQueue[name];
}
} else data = dataQueue[name];
return data;
}
function get(url:string, query?, headers?, timeOut?) {
timeOut = timeOut || 5000;
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
return new Promise((resolve, reject)=>{
let paramater:any = { url, json:true, timeout:timeOut };
if (query) paramater.qs = query;
if (headers) paramater.headers = headers;
request.get(paramater, function (err, res, data) {
const success = !err && res && res.statusCode == 200;
let message = err || res.statusCode || "";
resolve({success, message, data});
})
})
}
function post(url, body, headers) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
let header = {"content-type": "application/json"};
return new Promise((resolve, reject)=>{
request({
url: url,
method: "POST",
json: true,
headers: Object.assign(header, headers),
body: body
}, function(error, response, data) {
if (!error && response.statusCode == 0) {
resolve(data);
}
else {
reject(error || `${url} => ${JSON.stringify(data)}`)
}
});
})
}
function postForm(url, body) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
return new Promise((resolve, reject)=>{
request({
url: url,
method: "POST",
json: true,
form:body
}, function(err, res, data) {
const success = !err && res && res.statusCode == 200;
let message = err || res.statusCode || "";
resolve({success, message, data});
});
})
}
function postParmiss(url, reqBody, headers) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
return new Promise((resolve, reject)=>{
request({
url: url,
method: "POST",
json: true,
form: reqBody
}, function(error, response, body) {
resolve(body);
});
})
}
function getParmiss(url, query?, headers?) {
return new Promise((resolve, reject)=>{
let paramater:any = { url, json:true };
if (query) paramater.qs = query;
if (headers) paramater.headers = headers;
request.get(paramater, function (err, r, body) {
if (err) return resolve(err);
if (r && r.statusCode != 200) return resolve( { error: 'httpError:'+r.statusCode })
resolve(body);
});
})
}
function postPHP(url, body, headers) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
let header = {"content-type": "application/json"};
return new Promise((resolve, reject)=>{
request({
url: url,
method: "POST",
json: true,
headers: Object.assign(header, headers),
body: body
}, function(error, response, body) {
resolve(body);
});
})
}
import moment = require("moment");
import { dataCenterInterfaceConfig, systemConfig } from "../../config/serverConfig";
import { get } from "../../util/request";
import { BizError } from "../../util/bizError";
import { guangfuTableData } from "../table/tableData";
/**
* 光伏
* @returns
*/
export async function getGuangFu() {
let result = {
jbqk:[], //基本情况
nhfx:{count:[], charData:[], dayData:[]}, //能耗分析
trsy:{count:[], charData:[]}, //投入使用
ztsj:[], //整体数据
xyfxfd:{count:[], chartData:[]}, //效益分析-发电
xyfx:{count:[], chartData:{}}, //效益分析
jnjp:{count:[], chartData:[]} //节能减排
};
// let userquery = {user_name:systemConfig.userName};
let header = {token:systemConfig.token};
let hqmdzsjgl:any = await get(dataCenterInterfaceConfig.hqmdzsjgl, {plant_id:systemConfig.plantId}, header);
if (!hqmdzsjgl.body) console.log("接口请求失败-获取某电站数据概览:hqmdzsjgl");
let nowTime = new Date().valueOf();
/**基本情况 */
let jbqkData = {
安全运行天数:0,
组件总功率:0,//todo
设备总数:0//todo
};
let hqmdzjbxx:any = await get(dataCenterInterfaceConfig.hqmdzjbxx, {plant_id:systemConfig.plantId}, header);
if (!hqmdzjbxx.body) console.log("接口请求失败-获取某电站基本信息:hqmdzjbxx");
let jzmqts = 0;
if (hqmdzjbxx.body) {
let createDate = new Date(hqmdzjbxx.body.create_date).valueOf();
console.log(moment(nowTime).format("YYYY-MM-DD"))
console.log(moment(createDate).format("YYYY-MM-DD"))
jzmqts = (nowTime - createDate) / (1000 * 60 * 60 * 24); //当前时间-建站日期=当前安全运行天数
jbqkData.安全运行天数 = Math.ceil(jzmqts) || 0;
for (let key in jbqkData) {
result.jbqk.push( {key, value:jbqkData[key]} );
}
}
/**能耗分析 */
let nhfxData = {
"年用电量":0,
"光伏发电量":0
}
if (hqmdzsjgl.body) nhfxData.光伏发电量 = hqmdzsjgl.body.total_energy || 0;
let nowYearAgo = moment(nowTime).format("YYYY-MM-DD");
let sixYearAgo = moment().subtract(6, 'years');
let startYear = moment(sixYearAgo).format("YYYY");
let nhfxquery = {
plant_id:systemConfig.plantId,
start_date:`${startYear}-01-01`,
end_date:nowYearAgo,
time_unit:"year",
}
let pjzData:any = await get(dataCenterInterfaceConfig.hqmdzlsfdl, nhfxquery, header);
if (!pjzData.body) console.log("接口请求失败-获取某电站历史发电量:hqmdzlsfdl");
let nowYear = moment(nowTime).format("YYYY");
//平均值
if (pjzData.body) {
pjzData.body.energys.forEach( info => {
let {date, energy} = info;
let value = Math.round((energy/365)*100)/100;
result.nhfx.charData.push({key:date, value});
if (date == nowYear) nhfxData.年用电量 = energy;
})
}
//当天功率
let query = {
plant_id:systemConfig.plantId,
date:nowYearAgo,
}
let hqmdzmytglData:any = await get(dataCenterInterfaceConfig.hqmdzmytgl, query, {token:systemConfig.token});
if (!hqmdzmytglData.body) console.log("接口请求失败-获取某电站某一天功率数据:hqmdzmytgl");
let dayData = {};
if (hqmdzmytglData.body) {
hqmdzmytglData.body.powers.forEach( info => {
let {time, power} = info;
let dayTime = moment(time).format("HH:00");
if (!dayData[dayTime]) dayData[dayTime] = 0;
if (power) dayData[dayTime] += power;
})
}
for(let key in dayData) {
result.nhfx.dayData.push({key, value:dayData[key]});
}
result.nhfx.dayData.sort((a, b) => {
return a.key - b.key
})
//汇总数据
for (let key in nhfxData) {
result.nhfx.count.push( {key, value:nhfxData[key]} );
}
/**投入使用 */
let excelData = guangfuTableData();
let trsyCount = {
发电量:0,
发电时长:0
}
if (hqmdzsjgl.body) trsyCount.发电量 = hqmdzsjgl.body.total_energy;
trsyCount.发电时长 = jzmqts * 24; //当前安全运行天数,天换算成小时
for (let key in trsyCount) {
excelData["投入使用"].dataList.push({key, value:trsyCount[key]});
}
result.trsy.count = excelData["投入使用"].dataList;
result.trsy.charData = excelData["投入使用趋势"].dataList;
/**整体数据 */
let ssData = {
装机容量:0,
总发电量:0,
实时功率:0
};
if (hqmdzsjgl.body) {
ssData.装机容量 = hqmdzsjgl.body.peak_power_actual;
ssData.总发电量 = hqmdzsjgl.body.total_energy;
ssData.实时功率 = hqmdzsjgl.body.current_power;
}
for (let key in ssData) {
result.ztsj.push({key, value:ssData[key]});
}
/**效益分析-发电 */
let xyfxfdData = {
今日发电:0,
日功率:0,
当前功率:0,
等效小时数:0
}
if (hqmdzmytglData.body) {
hqmdzmytglData.body.powers.forEach( info => {
xyfxfdData.日功率 += info.power;
})
}
if (hqmdzsjgl.body) {
xyfxfdData.今日发电 = hqmdzsjgl.body.today_energy;
xyfxfdData.当前功率 = hqmdzsjgl.body.current_power;
}
let xyfxdayAgo = moment().subtract(7, 'days');
let xyfxnowTime = moment(xyfxdayAgo).format("YYYY-MM-DD");
let xyfxendTime = moment(new Date()).format("YYYY-MM-DD");
let hqmdzlsfdlQuery = {
plant_id:systemConfig.plantId,
start_date:xyfxnowTime,
end_date:xyfxendTime,
time_unit: "day",
}
/** todo 接口调用频率限制---------------------------------------------------------------------------------------- */
// let hqmdzlsfdlData:any = await get(dataCenterInterfaceConfig.hqmdzlsfdl, hqmdzlsfdlQuery, {token:systemConfig.token});
// if (!hqmdzlsfdlData) throw new BizError('数据未返回');
// hqmdzlsfdlData.body.energys.forEach( info => {
// let {date, energy} = info;
// result.xyfxfd.chartData.push({key:date, value:energy});
// })
// for (let key in xyfxfdData) {
// result.xyfxfd.count.push( {key, value:xyfxfdData[key]} );
// }
/** todo 接口调用频率限制---------------------------------------------------------------------------------------- */
/**效益分析 */
let xyfxData = {
今日收益:0,
当月收益:0,
累计收益:0
};
let price = 0;
let ljsy = 0;
excelData["效益分析"].dataList.forEach( info => {
if (info.key == "电价") price = info.value; //今日电价
if (info.key == "累计收益") ljsy = info.value;
})
if (hqmdzsjgl.body) {
xyfxData.今日收益 = hqmdzsjgl.body.today_energy * price;
xyfxData.当月收益 = hqmdzsjgl.body.monthly_energy * price;
}
xyfxData.累计收益 = ljsy;
for (let key in xyfxData) {
result.xyfx.count.push({key, value:xyfxData[key]});
}
// 今年
let thisYear = [];
/** todo 接口调用频率限制---------------------------------------------------------------------------------------- */
// hqmdzlsfdlData.body.energys.forEach( info => {
// let {date, energy} = info;
// let thisPrice = energy * price;
// thisYear.push({key:date, value:thisPrice});
// });
/** todo 接口调用频率限制---------------------------------------------------------------------------------------- */
result.xyfx.chartData["今年"] = thisYear;
//去年
/** todo 接口调用频率限制---------------------------------------------------------------------------------------- */
// let yearAgo = moment().subtract(1, 'years');
// let dayAgo = moment().subtract(7, 'days');
// let startDate = `${yearAgo}-${moment(dayAgo).format("-MM-DD")}`;
// let endDate = `${yearAgo}-${moment(nowTime).format("MM-DD")}`;
// let xyfxquery = {
// plant_id:systemConfig.plantId,
// start_date:startDate,
// end_date:endDate,
// time_unit:"year",
// }
// let hqmdzlsfdl:any = await get(dataCenterInterfaceConfig.hqmdzlsfdl, xyfxquery, header);
// if (!hqmdzlsfdl) throw new BizError('数据未返回');
let lastyear = [];
// hqmdzlsfdl.body.energys.forEach( info => {
// let {date, energy} = info;
// let thisPrice = energy * price;
// lastyear.push({key:date, value:thisPrice});
// });
result.xyfx.chartData["去年"] = lastyear;
/** todo 接口调用频率限制---------------------------------------------------------------------------------------- */
/**节能减排 */
result.jnjp.count = excelData["节能减排"].dataList;
return result;
}
import { INTERFACEREQUESTTYPEENUM } from "../../config/enum";
import { dataCenterInterfaceConfig } from "../../config/serverConfig";
//配置
// "接口名称":{
// type:"1是即时更新 2是即时更新 使用 INTERFACErEQUESTTYPEENUM",
// time:"更新频率毫秒 例如1小时这里就是 3600000",
// url:"url地址",
// reqType:"get还是post get = get post = post",
// header:{},
// body:{}
// }
const token = "73n6124cv7rq614c572x80jma7mj3yhsCAHMZC001";
export const Config = {
"获取某电站数据概览":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:dataCenterInterfaceConfig.hqmdzsjgl, reqType:"get", header:{token}, body:{}},
};
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function cyszhglTableData() {
let blockDataList = onceSheetBecomeOfblockData('zjny.xlsx', '产业数字化管理');
let keyValueOrTitleList = ["智能灌溉","风险类型占比","示范基地概览","示范地投入品使用记录","风险预警","产业销量排行","数字产业"];//适配 饼图 键值以及需要多个key的
let barChartList = ["苗情检测","种子投入品使用趋势分析","种苗投入品使用趋势分析","肥料投入品使用趋势分析","农药投入品使用趋势分析","蔬菜效益分析","渔业效益分析"]; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =["预警详情工单","种植种类", "种植分布","产品溯源信息"];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
\ No newline at end of file
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function gbzscbgjdAqTableData() {
let blockDataList = onceSheetBecomeOfblockData('zjny.xlsx', '高标准蔬菜保供基地A区');
let keyValueOrTitleList = ["A区基地详情","基地分析","产品溯源","产品分销占比"];//适配 饼图 键值以及需要多个key的
let barChartList = ["种植作物产量情况"]; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = ["种植作物品种"];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
\ No newline at end of file
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function gbzscbgjdBqTableData() {
let blockDataList = onceSheetBecomeOfblockData('zjny.xlsx', '高标准蔬菜保供基地B区');
let keyValueOrTitleList = ["B区基地详情","基地分析","产品溯源","产品分销占比"];//适配 饼图 键值以及需要多个key的
let barChartList = ["种植作物产量情况"]; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =["种植作物品种"];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
\ No newline at end of file
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function gfnyTableData() {
// let blockDataList = onceSheetBecomeOfblockData('zjnt.xlsx', '光伏能源');
// let keyValueOrTitleList = ["基本情况","能耗分析","投入使用","光伏能源","效益分析","效益分析","节能减排"];//适配 饼图 键值以及需要多个key的
// let barChartList = ["发电功率平均值分析","发电功率最大值分析","投入使用趋势","发电量趋势","累计减排统计"]; //适配 柱状图 折线图
// let stringList = [];
// let decollatePlanarList =[];//适配 表格
// let titltListConfig = {};
// let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
// return result;
}
\ No newline at end of file
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function hjszzlTableData() {
let blockDataList = onceSheetBecomeOfblockData('zjny.xlsx', '环境数字治理');
let keyValueOrTitleList = ["天气检测","土壤检测","水质检测","环境基础分析","治理情况","灾害性应急管理", "病害虫治理", "虫害检测灯预警", "气象灾害列表"];//适配 饼图 键值以及需要多个key的
let barChartList = ["气温趋势","土壤微量元素监测","浊度趋势变化","温度趋势变化","PH值趋势变化","NH3-N趋势变化","溶解氧趋势变化","虫害治理成效"]; //适配 柱状图 折线图 //
let stringList = [];
let decollatePlanarList =["天气检测表"];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
\ No newline at end of file
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function jdaqglTableData() {
let blockDataList = onceSheetBecomeOfblockData('zjny.xlsx', '基地安全管理');
let keyValueOrTitleList = ["设备类型占比","设备数量","设备状态情况","消防设备","消防设备状态","基地安全管理数据分析","天气数据","设备运行监测","紧急程度","预警处置","预警处置率","重点区域监控"];//适配 饼图 键值以及需要多个key的
let barChartList = ["近七天设备在线情况","告警趋势"]; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =["正常状态列表","维护中状态列表","故障状态列表","预警处置表"];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
\ No newline at end of file
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function jkspTableData() {
let blockDataList = onceSheetBecomeOfblockData('zjny.xlsx', '监控视频');
let keyValueOrTitleList = ["监控视频"];//适配 饼图 键值以及需要多个key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =[];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
\ No newline at end of file
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function nyjqrTableData() {
let blockDataList = onceSheetBecomeOfblockData('zjny.xlsx', '农业机器人');
let keyValueOrTitleList = ["机器人类型占比","机器人资源","运行状态","农业机器人数据","智能巡检","巡检完成情况","智能机器人产量","机器人类型占比","机器人数据分析"];//适配 饼图 键值以及需要多个key的
let barChartList = ["运势趋势分析","区域分布","巡检设备类型","巡检趋势","近半年产量趋势"]; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =["运行记录","巡检记录"];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
\ No newline at end of file
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function sdt1hgfbTableData() {
let blockDataList = onceSheetBecomeOfblockData('zjny.xlsx', '水稻田1号光伏板');
let keyValueOrTitleList = ["光伏板","电机","光伏数据统计"];//适配 饼图 键值以及需要多个key的
let barChartList = ["光伏数据统计","预测与实际"]; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =["光伏实时信息"];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
\ No newline at end of file
/**
*
*/
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function guangfuTableData() {
let blockDataList = onceSheetBecomeOfblockData('光伏.xlsx', 'Sheet1');
let keyValueOrTitleList = ['投入使用', '投入使用趋势', '效益分析', '节能减排']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = []; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function jiQiRenTableData() {
let blockDataList = onceSheetBecomeOfblockData('机器人.xlsx', 'Sheet1');
let keyValueOrTitleList = ['机器人类型占比', '运行状态', '顶部指标']; //适配 饼图 键值以及需要多个Key的
let barChartList = ['巡检设备类型', '巡检趋势', '运行趋势分析', '区域布局', '智能机器人产量']; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = ['运行记录', '巡检记录']; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
import { planarArrDecollateForIndex, planarArrDeconstruct, planarArrForObjectList } from "../../dataPackage/planaryArrayAnalysis";
import { onceSheetBecomeOfblockData } from "../../util/analysisExcel";
function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList) {
let result = {};
for (let i = 0; i < blockDataList.length; i++) {
let {blockData, blockTitle} = blockDataList[i];
if (keyValueOrTitleList.indexOf(blockTitle) > -1) {
let titleList = titltListConfig[blockTitle] || [];
result[blockTitle] = planarArrForObjectList(blockData, 0, titleList);
}
else if (barChartList.indexOf(blockTitle) > -1) {
result[blockTitle] = planarArrDeconstruct(blockData);
}
else if (stringList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrForObjectList(blockData);
else if (decollatePlanarList.indexOf(blockTitle) > -1) result[blockTitle] = planarArrDecollateForIndex(blockData);
}
return result;
}
export function yzdqxdnyzlTableData() {
let blockDataList = onceSheetBecomeOfblockData('zjny.xlsx', '现代农业走廊');
let keyValueOrTitleList = ["水资源利用率","自然资源","企业情况","产业结构","产业主体结构","重点项目建设","专家服务","技术创新引进情况","引进技术基础数据","创新技术基础数据",
"经营管理情况","经营管理情况趋势图","专业员工类型","总体数据分布","项目分析"];//适配 饼图 键值以及需要多个key的
let barChartList = ["创新技术创新趋势","引进技术创新趋势"]; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =[];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
\ No newline at end of file
//打包完数据之后的处理
/**
* recombinationObject 重组对象 在打包完数据后使用 必须是keyvalue之后
* @param data [{key:key1, value:value1, unit:unit1 }, {key:key2, value:value2, unit:unit2}]
* @param check {"key2":[{key:"key1", name:""}] }
* @returns [{key:key1, value:value1, key2:key2, value2:value2}]
*/
export function recombinationObject(data, checkInfo) {
let dataMap = {};
data.forEach(info => {
let { key } = info;
dataMap[key] = info;
});
let removeKeyMap = {};
for (let checkKey in checkInfo) {
let checkList = checkInfo[checkKey];
checkList.forEach(item => {
let {key, name} = item;
removeKeyMap[key] = 1;
let onceCheck = dataMap[key];
dataMap[checkKey][name] = onceCheck.value;
dataMap[checkKey][`${name}Unit`] = onceCheck.unit;
});
}
let dataList = [];
data.forEach(info => {
let { key } = info;
if (removeKeyMap[key]) return;
dataList.push(dataMap[key]);
});
return dataList;
}
//out 前置逻辑
import { BizError } from "../util/bizError";
import { separateDataAndUint } from "./tool";
/**
* stringListPackage 打包验证并返回 getStringOut 需要的格式
* @param dataList [{key, value},{}]
* @param keyName
* @returns ["","",""]
*/
export function stringListPackage(dataList, keyName = "value") {
let result = [];
dataList.forEach(info => {
result.push(info[keyName]);
});
return result;
}
/**
* onceYBarChartPackage 打包验证并返回 getOnceYBarChartOut 需要的格式
* @param dataList [{name:"", data:[{key, value}...] }]
* @param inYUnit y轴单位
* @param inXUnit x轴单位
* @returns {xUnit:x轴单位, yUnit:y单位, dataInfo:{"图表名称":[{key:"数据key", value:"数据值", unit:"单位" }, {key:"数据key", value:"数据值", unit:"单位" } ] } }
*/
export function onceYBarChartPackage(inDataList, inYUnit, inXUnit="") {
let dataInfo = {};
const InYUnitIsNull = !inYUnit;
let checkingDataHaveUnitMap = {};
let yUnit = "";
inDataList.forEach(info => {
let name = info.name;
let data = info.data;
checkingError({name, data}, errorEnum.必要参数);
let onceDataList = [];
//判空 去重
let distinctMap = {};
//验证工作
data.forEach(subInfo => {
let key = subInfo.key;
let value = subInfo.value;
checkingError({name, key}, errorEnum.数据key是否为空);
checkingError({name, value}, errorEnum.数据value是否为数值);
checkingError({name, distinctMap, key}, errorEnum.barChartx轴的key重复出现);
distinctMap[key] = 1;
let {dataNum, dataUnit} = separateDataAndUint(value);
checkingDataHaveUnitMap[dataUnit] = 1;
onceDataList.push({key, value:dataNum, unit:dataUnit|| "" });
});
dataInfo[name] = onceDataList;
});
let dataUnitList = Object.keys(checkingDataHaveUnitMap);
let dataHaveUnitCount = dataUnitList.length;
if (!dataHaveUnitCount && InYUnitIsNull ) {
//todo 这里可以加逻辑 挖个坑 可以读取表格里面的所有单位取出现最多的
} else if(dataHaveUnitCount> 1) throw new BizError(`在 onceYBarChartPackage 中 单个y轴的柱状图中出现多个单位:${JSON.stringify(dataUnitList)}`);
else {
yUnit = dataUnitList[0] || inYUnit;
for (let key in dataInfo) {
dataInfo[key].forEach(info => {
info.unit = yUnit;
});
}
}
return {xUnit:inXUnit, yUnit, dataInfo };
}
/**
* doubleYBarCharPackage 打包验证并返回 getDoubleYBarChartOut 需要的格式
* @param inLeftYUnit
* @param inRightYUnit
* @param data [{name:"", data:[{key, value}...] }]
* @param rightNameList ["name", name] 右边y轴的名称
* @returns {xUnit:x轴单位, leftYUnit:左边y单位, rightYUnit:右边y单位 dataInfo:{"图表名称":{from:"left", subList:[{key:"数据key", value:"数据值", unit:"单位" }, {key:"数据key", value:"数据值", unit:"单位" } ]} } }
*/
export function doubleYBarCharPackage(data, rightNameList, inLeftYUnit, inRightYUnit, xUnit = "") {
let leftAndRightDistinctMap = {};//比对两种图表名称有没有冲突
let dataInfo = {};
let leftUnitDistinctMap = {};
let rightUnitDistinctMap = {};
function checkOnceData(subFunCheckingList, dataType) {
subFunCheckingList.forEach(info => {
let name = info.name;
let data = info.data;
checkingError({name, data}, errorEnum.必要参数);
if (leftAndRightDistinctMap[name]) throw new BizError(`在 doubleYBarCharPackage 中leftYData 和 rightYData 重复出现了 ${name}`);
leftAndRightDistinctMap[name] = 1;
let subList = [];
let distinctMap = {};
data.forEach(subInfo => {
let key = subInfo.key;
let value = subInfo.value;
checkingError({name, key}, errorEnum.数据key是否为空);
checkingError({name, value}, errorEnum.数据value是否为数值);
checkingError({name, distinctMap, key}, errorEnum.barChartx轴的key重复出现);
distinctMap[key] = 1;
let {dataNum, dataUnit} = separateDataAndUint(value);
if (dataUnit) dataType == "left" ? leftUnitDistinctMap[dataUnit] = 1 : rightUnitDistinctMap[dataUnit] = 1;
subList.push({key, value:dataNum, unit:dataUnit || ""});
});
dataInfo[name] = {from:dataType, subList};
});
}
let leftYData = [];
let rightYData = [];
data.forEach(info => {
let {name} = info;
if (rightNameList.indexOf(name) > -1 ) rightYData.push(info);
else leftYData.push(info);
});
checkOnceData(leftYData, "left");
checkOnceData(rightYData, "right");
let leftUnitList = Object.keys(leftUnitDistinctMap);
let leftUnitCount = leftUnitList.length;
let rightUnitList = Object.keys(rightUnitDistinctMap);
let rightUnitCount = rightUnitList.length;
if (leftUnitCount > 1) throw new BizError(`在 onceYBarChartPackage 中 双y轴的柱状图中 leftData数据中出现了多个单位:${JSON.stringify(leftUnitList)}`);
if (rightUnitCount > 1) throw new BizError(`在 onceYBarChartPackage 中 双y轴的柱状图中 rightData数据中出现多个单位:${JSON.stringify(rightUnitList)}`);
let leftYUnit = leftUnitList[0] || inLeftYUnit;
let rightYUnit = rightUnitList[0] || inRightYUnit;
for (let key in dataInfo) {
let {from } = dataInfo[key];
dataInfo[key].subList.forEach(info => {
if (from == "left") info.unit = leftYUnit;
else info.unit = rightYUnit;
});
}
return {xUnit, leftYUnit, rightYUnit, dataInfo };
}
/**
* tablePackage 获得 getTableOut 需要的数据
* @titleList ["","","",""]
* @param data [[a,b,c],[a,b,c],[a,b,c],[a,b,c]]
* @returns {titleList:[], dataList:[{a,b,c},{a,b,c},{a,b,c}] }
*/
export function tablePackage(titleList, data) {
var aForZkeyList = [];
for(var i = 65; i < 91; i++){
aForZkeyList.push(String.fromCharCode(i));
}
//验证长度
let dataMaxLenght = 0;
let dataList = [];
data.forEach(subDataList => {
let onceData = {};
subDataList.forEach((info, index) => {
let key = aForZkeyList[index];
onceData[key] = info || "";
});
dataMaxLenght = Math.max(dataMaxLenght, subDataList.length);
dataList.push(onceData);
});
if (titleList.length < dataMaxLenght) throw new BizError( `在 tablePackage 中 titleList长度比单个data最大长度小 titleList长度 ${titleList.length} 单个数据个数 ${dataMaxLenght}"`);
return {titleList, dataList};
}
/**
* keyValuePackage 将返回 getKeyValueOut 所需要的数据格式
* @param dataList [{key, value}]
* @returns [{key:"", value:"", unit:""}]
*/
export function keyValuePackage(dataList) {
let data = [];
dataList.forEach(info => {
let key = info.key;
let value = info.value;
checkingError({value, key}, errorEnum.数据key是否为空);
let {dataNum, dataUnit} = separateDataAndUint(value);
let analysisValue;
let analysisUnit;
if (isNaN(dataNum) || dataUnit == value){
analysisValue = value;
analysisUnit = "";
} else {
analysisValue = dataNum;
analysisUnit = dataUnit;
}
data.push({key, value:analysisValue, unit:analysisUnit });
});
return data;
}
/**
* objectListPackage 将返回 getObjectListOut 所需要的数据格式
* @param dataList [{key...}]
* @returns [{key...}]
*/
export function objectListPackage(dataList) {
let data = [];
dataList.forEach(info => {
let addInfo = {};
for (let key in info) {
checkingError({key, value:info[key]}, errorEnum.值为undefinednull);
addInfo[key] == info;
}
data.push(addInfo);
});
return data;
}
/**
* rankPackage 将返回 getRankOut 需要的数据
* @param orderIsDesc 默认 true desc(降序,从大到小)
* @param data [{key, value, details}]
* @param max 最大值
* @param unit 单位
* @returns {unit, max, dataInfo:[{key, value, details, unit}, {}, {}, {}] }
*/
export function rankPackage(data, orderIsDesc = true, unit?, max?) {
let dataInfo = [];
let valueIsString = false;
let dataUnitDistinctMap = {};
data.forEach( info => {
let key = info.key;
let value = info.value;
let details = info.details || "";
let onceUnit = "";
checkingError({key}, errorEnum.数据key是否为空);
if ((value == undefined || value == null) || `${value}`.search(/^(-)?\d+(\.\d+)?/) == -1 ) {
valueIsString = true;
} else {
let {dataNum, dataUnit} = separateDataAndUint(value);
if (dataUnit) {
dataUnitDistinctMap[dataUnit] = 1;
onceUnit = dataUnit;
}
value = dataNum;
}
dataInfo.push({key, value, details, unit:onceUnit});
});
let dataUnitList = Object.keys(dataUnitDistinctMap);
if (dataUnitList.length > 1) throw new BizError(`在 rankPackage 中 数据中的value解析出来不统一的单位:${JSON.stringify(dataUnitList)}`);
if (dataUnitList.length && unit && unit != dataUnitList.length) throw new BizError(`在 rankPackage 中 入参单位${unit} 与 数据中解析出来的单位 ${dataUnitList[0]} 不一致`);
let dataUnit = dataUnitList[0] || unit;
//统一单位
dataInfo.forEach(info => {info.unit = dataUnit});
if (!valueIsString) {
dataInfo.sort( (a, b) => {
return orderIsDesc ? b.value - a.value : a.value - b.value;
});
}
return {unit:dataUnit, max:max || 0, dataInfo};
}
/**
* radarChartPackage 将会返回 getRadarChartOut 需要的数据
* @param data [{key, value, max}]
* @returns [{key, value, max, unit}]
*/
export function radarChartPackage(data) {
let dataList = [];
data.forEach(info => {
let key = info.key;
let value = info.value;
let max = info.max;
checkingError({key}, errorEnum.数据key是否为空);
checkingError({name:key, value}, errorEnum.数据value是否为数值);
let {dataNum, dataUnit} = separateDataAndUint(value);
dataList.push({key, value:dataNum, unit:dataUnit, max});
});
return data;
}
/**
* mapPackage 返回 getMapOut 所需要的数据
* @param data [{key:数据名称, x:x坐标, y:坐标, longitude:经度, latitude:纬度, value:值, details:补充}]
* @returns [{name:数据名称, x:x坐标, y:坐标, coordinate:[经度, 纬度], unit:单位, value:值, details:"补充"}]
*/
export function mapPackage(data, isCoordinate=true, isXY=false) {
let dataList = [];
data.forEach((info, index) => {
checkingError({key:info.key}, errorEnum.数据key是否为空);
let longitude = info.longitude;
let latitude = info.latitude;
let x = info.x;
let y = info.y;
let addInfo:any = {key:info.key, details:info.details || ""};
checkingError({x, y, longitude, latitude, index}, errorEnum.地图坐标判空);
if (isCoordinate) {
longitude = isUndefinedOrNull(longitude) ? 0 : longitude;
latitude = isUndefinedOrNull(latitude) ? 0 : latitude;
let coordinate = [longitude, latitude];
addInfo.coordinate = coordinate;
}
if (isXY) {
x = isUndefinedOrNull(x) ? 0 : x;
y = isUndefinedOrNull(y) ? 0 : y;
addInfo.x = x;
addInfo.y = y;
}
let value;
let unit = "";
if (info.value && `${info.value}`.search(/^(-)?\d+(\.\d+)?/) > -1) {
let {dataNum, dataUnit} = separateDataAndUint(info.value);
value = dataNum;
unit = dataUnit;
} else if (info.value && `${info.value}`.search(/^(-)?\d+(\.\d+)?/) == -1) {
value = info.value;
} else value = "";
addInfo.value = value;
addInfo.unit = unit;
dataList.push(addInfo);
});
return dataList;
}
/**
* scatterFigurePackage 返回 getScatterFigureOutData 需要的格式
* @param data [{x, y, name}, {x, y, name}, {x, y, name}, {x, y, name}]
* @returns [{x, y, name}, {x, y, name}, {x, y, name}, {x, y, name}]
*/
export function scatterFigurePackage(data) {
let dataList = [];
data.forEach((info, index) => {
let x = info.x;
let y = info.y;
checkingError({x, y, index}, errorEnum.散点图判空);
dataList.push({x, y, name:info.name || ""});
});
return dataList;
}
enum errorEnum {
必要参数 = 1,
数据key是否为空,
数据value是否为数值,
类型为string,
barChartx轴的key重复出现,
值为undefinednull,
地图坐标判空,
散点图判空
};
function checkingError(param, errorEnumType) {
let str = ``;
let isError = false;
switch(errorEnumType) {
case errorEnum.类型为string:
if ( typeof param.str != "string") {
isError = true;
str += `下标为${param.index}的数据 不为string,当前为${param.str}`;
}
break;
case errorEnum.必要参数:
let paramNullErrorStr = '必要参数: ';
for (let key in param) {
if (!param[key]) {
isError = true;
paramNullErrorStr += `${key}为空 `;
}
}
str += paramNullErrorStr;
break;
case errorEnum.数据key是否为空 :
if (!param.key) {
isError = true;
str += `${param.name}中有key缺失数据`;
}
break;
case errorEnum.数据value是否为数值:
if (`${param.value}`.search(/^(-)?\d+(\.\d+)?/) == -1) {
isError = true;
str += `${param.name}中 key为${param.key} 的数据为字符串`;
}
break;
case errorEnum.barChartx轴的key重复出现:
if (param.distinctMap[param.key]) {
isError = true;
str += `${param.name}中 key为${param.key} 在数据中重复出现`;
}
break;
case errorEnum.值为undefinednull:
if ( isUndefinedOrNull(param.value) ) {
isError = true;
str += `${param.key}的值 为 undefined 或 null`;
}
break;
case errorEnum.地图坐标判空:
if (isUndefinedOrNull(param.x) && isUndefinedOrNull(param.y) && isUndefinedOrNull(param.longitude) && isUndefinedOrNull(param.latitude)) {
isError = true;
str += `第${param.index+1}个数据中坐标异常 所有表示坐标的属性都为空`;
}
if ( (isUndefinedOrNull(param.x) || isUndefinedOrNull(param.y)) && isUndefinedOrNull(param.longitude) || isUndefinedOrNull(param.latitude) ) {
isError = true;
str += `第${param.index+1}个数据中坐标异常 xy坐标缺失的同时经纬度也缺失`;
}
break;
case errorEnum.散点图判空:
if (isUndefinedOrNull(param.x) || isUndefinedOrNull(param.y)) {
isError = true;
str += `第${param.index+1}个数据中坐标异常 x为${param.x} y为${param.y}`;
}
break;
}
if (isError) {
throw new BizError(str);
}
}
function isUndefinedOrNull(paramater) {
return paramater == undefined || paramater == null;
}
\ No newline at end of file
/**
* changeObjectToList 将对象形式的数据转换为keyvalue的数组 对象中的键名称将作为key 传入mapping时 使用对应的change作为key的值
* @param data 数据{key1:value1, key2:value2, key3:value3...}
* @param reflect 对应关系 [{key:"key1",change:"名称1"},{key:"key2", change:"名称2"},{key:"key3", change:"名称3"}]
* @returns [{key:"名称1", value:value1}, {key:"名称2", value:value2}, {key:key3, value:value3}]
*/
export function changeObjectToList(data, reflect?) {
let keyList = [];
if (!reflect || !reflect.length) {
for (let key in data) {
keyList.push({key, change:key});
}
}
let dataList = [];
keyList.forEach(info => {
let {key, change} = info;
let value = data[key];
if (value) dataList.push({ key:change, value:`${value}`});
});
return dataList;
}
/**
* changeObjectKey 按mapping的对应关系修改 data中的key 如果对应关系中找不到,则会使用原来的key
* @param data {key1:value1, key2:value2, key3:value3...}
* @param reflect {"key1":"名称1", "key2":"名称2", "key3":"名称3"}
* @returns {"名称1":value1, "名称2":value2, "名称3":value3}
*/
export function changeObjectKey(data, reflect) {
let result = {};
for (let key in data) {
let changeKey = reflect[key] || key;
result[changeKey] = `${data[key]}`;
}
return result;
}
/**
* changeListObjectToListByReflect 将data中的object的key替换成 reflect对应的值
* @param data [{key1:value1, key2:value2...}, {key1:value1, key2:value2...}, {key1:value1, key2:value2...}]
* @param reflect 映射 不传就不会替换 {"key1":"名称1", "key2":"名称2", "key3":"名称3"}
* @returns [{"名称1":value1, "名称2":value2...}, {"名称1":value1, "名称2":value2...}, {"名称1":value1, "名称2":value2...}]
*/
export function changeListObjectToListByReflect(data, reflect?) {
let dataList = [];
if (!reflect) return dataList;
data.forEach(item => {
let changeInfo = {};
for (let key in item) {
let newKey = reflect[key] || key;
changeInfo[newKey] = `${item[key]}`;
}
dataList.push(changeInfo);
});
return dataList;
}
/**
* getDesignativByReflect 获取data中指定的的key
* @param data [{key1:value1, key2:value2, key3:value3...}, {key1:value1, key2:value2, key3:value3...}, {key1:value1, key2:value2, key3:value3...}] 或者 {key1:value1, key2:value2, key3:value3...}
* @param reflect List 映射 必须参数 ["key1", "key2"] 为key的名称
* @returns [{key1:value1, key2:value2, ...}, {key1:value1, key2:value2, ...}, {key1:value1, key2:value2, ...}]
*/
export function getDesignativByReflect(data, reflect) {
if (typeof data != "object") return data;
let type = Array.isArray(data) ? "array" : "object";
if ((type == "array" && !reflect.length) || (type == "object" && !Object.keys(reflect) ) ) return data;
let reflectMap = {};
reflect.forEach(keyName => {reflectMap[keyName] = 1});
if (type=="array") {
let dataList = [];
data.forEach(item => {
let once = {};
for (let key in item) {
if (!reflectMap[key]) continue;
once[key] = item[key];
}
dataList.push(once);
});
return dataList;
} else {
let dataInfo = {};
for(let key in reflectMap) {
if (data[key]) dataInfo[key] = data[key];
}
return dataInfo;
}
}
/**
* designativListKeyAddUnit为集合中指定的key添加单位
* @param data [{key1:value1, key2:value2, key3:value3...}, {key1:value1, key2:value2, key3:value3...}, {key1:value1, key2:value2, key3:value3...}]
* @param reflect {key1:"%", key2:"个"}
* @returns [{key1:"value1%", ke2:"value2个", keys:"value3"}]
*/
export function designativListKeyAddUnit(data, reflect) {
let dataList = [];
data.forEach(item => {
let onceData = {};
for (let key in item) {
let unit = reflect[key] || '';
onceData[key] = `${item[key]}${unit}`
}
dataList.push(onceData);
});
return dataList;
}
\ No newline at end of file
import { separateDataAndUint, unifiedMaxAndMinValueAndStep } from "./tool";
//数据出口封装 只做封装 少量的数据校验
/**
* getStringOut 获取文字列表返回结果
* @param title 数据标题
* @param data 数据体 格式:["txt...", "str..."]
* @returns {title, dataList:[string...]}
*/
export function getStringOut(title, data) {
let dataList = [];
data.forEach( (str) => {
dataList.push(str);
});
return { title, dataList};
}
/**
* getOnceYBarChartOut 获取单y轴柱状图
* @param title 数据标题
* @param data 数据体 格式: {xUnit:x轴单位, yUnit:y单位, dataInfo:{"图表名称":[{key:"数据key", value:"数据值", unit:"单位" }, {key:"数据key", value:"数据值", unit:"单位" } ] } }
* @returns {title:标题, xUnit:x轴单位, yUnit:y轴单位, yMinValue:最小值, yMaxValue:最大值, yStepValue:间隔,
* chartList:[{thisChartTitle:数据名称, total:总数, unit:单位, dataList:[{name:y轴名称, value:值, unit:单位}] } ]}
* 入参data里面的dataInfo中的unit可以为空 会读取yUnit 所以入参优先度 yUnit > unit 默认值都是空字符串
*/
export function getOnceYBarChartOut(title, data, stepCount?) {
let chartList = [];
let {xUnit, yUnit, dataInfo} = data;
let thisYUnit = yUnit ||"";
let min = new Date().valueOf();
let max = 0;
for (let dataName in dataInfo) {
let onceChartList = dataInfo[dataName];
let dataList = [];
let total = 0;
onceChartList.forEach(item => {
let {key, value, unit} = item;
min = Math.min(value, min);
max = Math.max(value, max);
total += value;
dataList.push({name:key, value, unit: unit || thisYUnit});
});
chartList.push({thisChartTitle:dataName, total, unit:thisYUnit, dataList});
}
let {maxNumber, minNumber, stepNumber} = unifiedMaxAndMinValueAndStep(max, min, stepCount);
return {title, xUnit, yUnit:thisYUnit, yMinValue:minNumber, yMaxValue:maxNumber, yStepValue:stepNumber, chartList};
}
/**
* getDoubleYBarChartOut 获取双y轴柱状图
* @param title 数据标题
* @param data 数据体 格式:{xUnit:x轴单位, leftYUnit:左边y单位, rightYUnit:右边y单位 dataInfo:{"图表名称":{from:"left", subList:[{key:"数据key", value:"数据值", unit:"单位" }, {key:"数据key", value:"数据值", unit:"单位" } ]} } }
* @returns {title:标题, xUnit:x轴单位, leftYUnit:左边单位, rightYUnit:右边单位, leftYMinValue:左边最小值, leftYMaxValue:左边最大值, leftYStepValue:左边间隔,
* rightYMinValue:右边最小值, rightYMaxValue:右边最大值, rightYStepValue:右边间隔,
* dataList:[{subTitle:数据名称, total:总数, unit:单位, subDataList:[{name:y轴名称, value:值, unit:单位}] }] }
* 入参data里面的dataInfo中的unit可以为空 会读取yUnit 所以入参优先度 yUnit > unit 默认值都是空字符串
*/
export function getDoubleYBarChartOut(title, data, stepCountInfo?) {
stepCountInfo = stepCountInfo || {left:5, right:5};
let dataList = [];
let {xUnit, leftYUnit, rightYUnit, dataInfo} = data;
let thisLeftYUnit = leftYUnit || "";
let thisRightYUnit = rightYUnit || "";
let leftMin = new Date().valueOf();
let leftMax = 0;
let rightMin = new Date().valueOf();
let rightMax = 0;
for (let dataName in dataInfo) {
let {subList, from} = dataInfo[dataName];
let subDataList = [];
let total = 0;
let thisDataUnit = from == "left" ? thisLeftYUnit : thisRightYUnit;
subList.forEach(item => {
let {key, value, unit} = item;
if (from == "left") {
leftMin = Math.min(value, leftMin);
leftMax = Math.max(value, leftMax);
} else {
rightMin = Math.min(value, rightMin);
rightMax = Math.max(value, rightMax);
}
total += value;
subDataList.push({name:key, value, unit:unit || thisDataUnit});
});
dataList.push({subTitle:dataName, total, unit:thisDataUnit, subDataList});
}
let leftInfo = unifiedMaxAndMinValueAndStep(leftMax, leftMin,stepCountInfo.left);
let rightInfo = unifiedMaxAndMinValueAndStep(rightMax, rightMin,stepCountInfo.right);
return {title, xUnit, leftYUnit:thisLeftYUnit, rightYUnit:thisRightYUnit, leftYMinValue:leftInfo.minNumber, leftYMaxValue:leftInfo.maxNumber, leftYStepValue:leftInfo.stepNumber,
rightYMinValue:rightInfo.minNumber, rightYMaxValue:rightInfo.maxNumber, rightYStepValue:rightInfo.stepNumber, dataList}
}
/**
* getTableOut 获取列表返回
* @param title 数据标题
* @param data 数据体 格式:{titleList:[], dataList:[{a,b,c},{a,b,c},{a,b,c}] }
* @returns {title:数据标题, total:数据总条数, titleList:[表头...], valueList:[[a,b,c,d...],[a,b,c,d...]] }
* 解出来的对象的key是需要有顺序的,所以进这里之前要把值a-z排好序,按显示要求排序,
*/
export function getTableOut(title, data) {
let {titleList, dataList} = data;
let valueList = [];
dataList.forEach(info => {
let subList = [];
for (let key in info) {
subList.push(info[key]);
}
valueList.push(subList);
});
return { title, total:dataList.length, titleList, valueList };
}
/**
* getKeyValueOut 获取键值的返回结果
* @param title 数据标题
* @param data 数据体 [{key:"", value:"", unit:""}]
* @returns {title:数据标题, dataList:[], total:数据值总数, count:数据总条数 }
*/
export function getKeyValueOut(title, data) {
let dataList = [];
let total = 0;
data.forEach(info => {
let {key, value, unit} = info;
let typeChangeValue;
if (!isNaN(value)) {
typeChangeValue = parseFloat(value);
total+= typeChangeValue;
} else typeChangeValue = value;
dataList.push({name:key, value:typeChangeValue, unit});
});
return {title, total, count:dataList.length, dataList};
}
/**
* getObjectListOut 获取对象数组结果
* @param title 数据标题
* @param data 数据体 [{value:"", value:"", unit:""}]
* @returns {title:数据标题, dataList:[{name:"", value:"", key1:"", key2:""}] }
*/
export function getObjectListOut(title, data) {
//todo 没有特殊逻辑
return {title, dataList:data};
}
/**
* getRankOut 获取排名结果
* @param title 数据标题
* @param data 数据体 {unit, max, dataInfo:[{key, value, details}, {}, {}, {}] }
* @returns {title:数据标题, max, unit dataList:[{name, value, unit, rankNumber}] }
*/
export function getRankOut(title, data) {
let {unit, max, dataInfo} = data;
let dataList = [];
dataInfo.forEach((info, index) => {
let {key, value} = info;
let rankNumber = index + 1;
dataList.push({name:key, value, details:info.details, rankNumber});
});
return { title, unit, max, dataList };
}
/**
* getRadarChartOut 获取雷达图
* @param title 数据标题
* @param data 数据体 [{key, value, max, unit}]
* @returns {title:数据标题, dataList:[{name:"指标名称", max:"最大值", value:"当前值", unit:"单位"}]}
*/
export function getRadarChartOut(title, data) {
let dataList = [];
data.forEach(info => {
dataList.push({
name:info.key,
value:info.value,
max:info.max,
unit:info.unit
});
});
return {title, dataList};
}
/**
* getMapOut 地图数据
* @param title 数据标题
* @param data 数据体 [{name:数据名称, x:x坐标, y:坐标, coordinate:[经度, 纬度], unit:单位, value:值, details:"补充"}]
* @returns {title:数据标题, dataList:[{name:数据名称, x:x坐标, y:坐标, coordinate:[经度, 纬度], unit:单位, value:值, details:"补充"} ] }
*/
export function getMapOut(title, data) {
//todo 无特殊逻辑
return {title, dataList:data};
}
/**
* getScatterFigureOutData 获取撒点图的返回结果
* @param title 标题
* @param data 数据 格式 [{x, y, name}, {x, y, name}, {x, y, name}, {x, y, name}]
* @returns { title:标题, xMax:x轴最大值, xMin:x最小值, yMax:y最大值, yMin:y最小值, dataList:[{name:点的名称, value:[x坐标, y坐标]} ] };
*/
export function getScatterFigureOutData(title, data) {
let dataList = [];
let xMaxNumber = 0;
let xMinNumber = new Date().valueOf();
let yMaxNumber = 0;
let yMinNumber = new Date().valueOf();
data.forEach(item => {
let { x, y, name } = item;
let xCoordinateInfo = separateDataAndUint(x);
let yCoordinateInfo = separateDataAndUint(y);
const XNumber = xCoordinateInfo.dataNum;
const YNumber = yCoordinateInfo.dataNum;
yMaxNumber = Math.max(YNumber, yMaxNumber);
yMinNumber = Math.min(YNumber, yMinNumber);
xMaxNumber = Math.max(XNumber, xMaxNumber);
xMinNumber = Math.min(XNumber, xMinNumber);
let value = [XNumber, YNumber];
dataList.push({ value, name:name || "" });
});
let xMaxMinInfo = unifiedMaxAndMinValueAndStep(xMaxNumber, xMinNumber);
let yMaxMinInfo = unifiedMaxAndMinValueAndStep(yMaxNumber, yMinNumber);
return { title, xMax:xMaxMinInfo.maxNumber, xMin:xMaxMinInfo.minNumber, yMax:yMaxMinInfo.maxNumber, yMin:yMaxMinInfo.minNumber, dataList };
}
import { BizError } from "../util/bizError";
import pyfl from 'pyfl';
//disintegrate 分解二维数据源数据
/**
* planarArrForObjectList 解析二维数组
* @param planarArr 二维数组 例子:[[title1, title2, title3, title4],[value1, value2, value3, value4],[value5, value6, value7, value8]]
* @param titleIndex 标题集合所在第一层数组的下标
* @param titleList 自定义标题列表 不传则会取每个title的中文首字母作为key
* @returns {"dataList":[{title1:value1, title2:value2, title3:value3, title4:value4}, {title1:value5, title2:value6, title3:value7, title4:value8}], titleList:[]}
*/
export function planarArrForObjectList(planarArr, titleIndex = 0, titleList = []) {
let dataTitleList = [];
let dataMaxLength = 0;
for (let i = titleIndex; i< planarArr.length; i++) {
let subList = planarArr[i];
if (i == titleIndex) {
dataTitleList = subList;
continue;
}
dataMaxLength = Math.max(subList.length, dataMaxLength);
}
let useTitleList = !titleList.length ? changeChineseTitleIntoEnglish(dataTitleList) : titleList;
if (dataMaxLength == 2 && !titleList.length) useTitleList = ["key", "value"];
if (dataTitleList.length < dataMaxLength ) throw new BizError(`解析时数据异常 数据长度:${dataMaxLength} 大于 标题长度${dataTitleList}`);
if (titleList.length && titleList.length < dataMaxLength) throw new BizError(`解析时数据异常 传入标题长度${titleList.length} 数据最大长度${dataMaxLength}`);
let dataList = [];
for (let i = (titleIndex + 1); i< planarArr.length; i++) {
let subList = planarArr[i];
let addInfo:any = {};
subList.forEach((item, index) => {
let key = useTitleList[index];
let value = item;
addInfo[key] = value;
});
dataList.push(addInfo);
}
return {dataList, titleList:useTitleList };
}
function changeChineseTitleIntoEnglish(titles) {
let result = [];
titles.forEach(chineseStr => {
result.push(pyfl(chineseStr).toLowerCase());
});
return result;
}
/**
* planarArrDeconstruct 解构二维数组
* 第一列是名称
* @param planarArr 二维数组 例:[[name, 1月, 2月, 3月],[数据1, 1月数据, 2月数据,3月数据 ],[数据2, 1月数据, 2月数据,3月数据]]
* @param titleIndex 标题集合所在第一层数组的下标
* @returns [{"name":"", data:[{key:"1月", value:"1月数据"}, {key:"2月", value:"2月数据"} ]}];
*/
export function planarArrDeconstruct(planarArr, titleIndex = 0) {
let dataInfo = []
let titleList = [];
for (let i = titleIndex; i < planarArr.length; i++) {
let subList = planarArr[i];
if (titleIndex == i){
titleList = subList;
} else {
let thisDataName = "";
let thisDataList = [];
subList.forEach((item, index) => {
if (!index) {
thisDataName = item;
return;
}
let key = titleList[index];
thisDataList.push({key, value:item});
});
dataInfo.push({name:thisDataName, data:thisDataList});
}
}
return dataInfo;
}
/**
* planarArrDecollateForIndex 拆解二维数组
* @param planarArr 二维数组
* @param decollateIndex 拆解开始的下标
* @returns {headerList:decollateIndex下标之前的集合(包括decollateIndex), bodyList:decollateIndex下标之后的集合(不包括decollateIndex)}
*/
export function planarArrDecollateForIndex(planarArr, decollateIndex = 0) {
let headerList = planarArr.slice(decollateIndex, decollateIndex + 1);
let bodyList = planarArr.slice(decollateIndex + 1, planarArr.length);
return {headerList, bodyList};
}
//excel 和 接口都可以使用的格式化数据的方法
/**
* objBecomeOfList 对象变成数组 value不限制类型
* @param obj 对象 {"key1":"value1", "key2":"value2"}
* @param keyName 指定key的名称 默认 name
* @param valueName 指定value的名称 默认 data
* @returns [{name:"key1", "data":"value1"}, ...]
*/
export function objBecomeOfList(obj, keyName="name", valueName="data") {
let result = [];
for (let key in obj) {
let once:any = {};
once[keyName] = key;
once[valueName] = obj[key];
result.push(once);
}
return result;
}
/**
* objChangeKey obj改变key
* @param obj {"key1":"value1", "key2":"value2"}
* @param checkKeyInfo {"key1":"eKey1", "key2":"eKey2"}
* @returns
*/
export function objChangeKey(obj, checkKeyInfo) {
let result = {};
for (let key in obj) {
let newKey = checkKeyInfo[key] || key;
result[newKey] = obj[key];
}
return result;
}
/**
* objListChangeKey objList 改变key
* @param objList
* @param checkKeyInfo
* @returns
*/
export function objListChangeKey(objList, checkKeyInfo) {
return
}
\ No newline at end of file
/**
* separateDataAndUint 截取字符串中的单位
* @param str 待处理字符串
* @returns {dataNumber:数据, dataUnit:单位}
*/
export function separateDataAndUint(str) {
str = `${str}`;
if (!str) return {dataNum:0, dataUnit:""};
let dataNum = parseFloat(str.replace(/[\u4E00-\u9FA5a-zA-Z]+/,""));
let dataUnit = str.replace(/^(-)?\d+(\.\d+)?/, "");
return {dataNum, dataUnit};
}
/**
* unifiedMaxAndMinValueAndStep 求最大最小值以及间隙
* @param max 最大
* @param min 最小
* @param count 分多少份 默认5
* @returns {maxNumber:向上留值最大, minNumber:向下留值最小, stepNumber:间隔};
*/
export function unifiedMaxAndMinValueAndStep(max, min, count=5) {
let maxNumber = Math.ceil(max);
let minNumber = Math.floor(min);
function getNumberInLength(length) {
let lengthCount = 1;
for (let i = 1; i < length; i++) {
lengthCount = lengthCount * 10;
}
return lengthCount;
}
let maxNumberLength = getNumberInLength(`${maxNumber}`.length);
let minNumberLength = getNumberInLength(`${minNumber}`.length);
if (maxNumber <= 10 && maxNumber > 0) maxNumber = 10;
else maxNumber = Math.ceil(maxNumber / maxNumberLength) * maxNumberLength;
minNumber = Math.floor(minNumber / minNumberLength) * minNumberLength;
let stepNumber = Math.ceil((maxNumber - minNumber) / count);
return {maxNumber, minNumber, stepNumber};
}
import { initInterfaceData } from "./data/interface/cronJob";
import { httpServer } from "./net/http_server";
import { initConfig, systemConfig } from "./config/serverConfig";
async function lanuch() {
test();
await initConfig();
// initInterfaceData();
httpServer.createServer( systemConfig.port );
console.log('This indicates that the server is started successfully.');
}
function test() {
}
lanuch();
export async function checkToken(req, res, next) {
next();
}
\ No newline at end of file
export async function encryptionReturn(req, res, next) {
res.on('end', function(){
console.log(res.body);
});
let resSend = res.send;
res.send = (obj)=>{
changeNumber(obj);
//递归修改number型
resSend.call(res, obj);
};
next();
}
function changeNumber(obj) {
if (Array.isArray(obj)) {
for (let i = 0; i < obj.length; i++) {
let arrItem = obj[i];
if (typeof arrItem == "number") {
obj[i] = getSameLenNumber(arrItem);
}
else if (typeof arrItem == "object") {
changeNumber(arrItem);
}
}
}
else {
for (let key in obj) {
let objItem = obj[key];
if (typeof objItem == "number") {
if (key == "x" || key == "y") continue;
obj[key] = getSameLenNumber(objItem);
}
else if (typeof objItem == "object") {
changeNumber(objItem);
}
}
}
}
function getSameLenNumber(num) {
let numStr = String(num);
//疑似年份的不做加密
if (numStr.length == 4 && (numStr.indexOf("19") == 0 || numStr.indexOf("20") == 0)) return num;
let str = "";
for (let i = 0; i < numStr.length; i++) {
if (numStr[i] == '.') str += numStr[i];
else str += "6";
}
return Number(str);
}
\ No newline at end of file
var formidable = require("formidable");
export async function parseFormParam(req, res, next) {
    var form = new formidable.IncomingForm();
    form.parse(req, (err, fields, files)=>{
        if (err) {
           next(err)
        }
        else {
            req.fields = fields;
            req.files = files;
            next();
        }
    })
}
\ No newline at end of file
import { BizError } from "../util/bizError";
const LRU = require("lru-cache")
, cacheOptions = { max: 500000
, maxAge: 1000 * 60 * 10 }
, cache = LRU(cacheOptions);
export async function checkSign(req, res, next) {
let signKey = "12345678asd!@#%DFFGa";
let userId = req.headers.userid;
let playerId = req.headers.playerid;
let token = req.headers.token;
let timeStamp = req.headers.timestamp;
let platform = req.headers.platform;
if (req.path != '/api/system/servertime' && req.path.indexOf('admin') < 0 && req.headers.sign != 'xxakdfwosaddf!@3sadfhDAse') {
let now = Date.now();
if (Math.abs(now - timeStamp) > 120000) {
console.log(req.path, new Date(now), "timeStamp", timeStamp);
return next(new BizError('timeStamp error time difference error'))
}
let sign = getSign([signKey, userId, playerId, token, timeStamp, platform, req.path, signKey]);
let cacheSign = cache.get(sign);
if (cacheSign) {
if (cacheSign > 5) return next(new BizError("sign error repetitive sign"));
else {
cacheSign++;
cache.set(sign,cacheSign);
}
}
else {
cache.set(sign,1);
}
if (sign != req.headers.sign) {
console.log(req.path, JSON.stringify(req.headers));
next(new BizError("sign error"))
}
}
next();
}
function getSign(...params) {
let s = "";
for (let i = 0; i < params.length; i++) {
if (!params[i]) continue;
s += params[i];
}
return new m().hex_md5(s);
}
export class m {
public constructor() {
}
private hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
private b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
/*
* These are the privates you'll usually want to call
* They take string arguments and return either hex or base-64 encoded strings
*/
public hex_md5(s) { return this.rstr2hex(this.rstr_md5(this.str2rstr_utf8(s))); }//这个函数就行了,
public b64_md5(s) { return this.rstr2b64(this.rstr_md5(this.str2rstr_utf8(s))); }
public any_md5(s,e) { return this.rstr2any(this.rstr_md5(this.str2rstr_utf8(s)),e); }
public hex_hmac_md5(k,d)
{ return this.rstr2hex(this.rstr_hmac_md5(this.str2rstr_utf8(k),this.str2rstr_utf8(d))); }
private b64_hmac_md5(k,d)
{ return this.rstr2b64(this.rstr_hmac_md5(this.str2rstr_utf8(k),this.str2rstr_utf8(d))); }
private any_hmac_md5(k,d,e)
{ return this.rstr2any(this.rstr_hmac_md5(this.str2rstr_utf8(k),this.str2rstr_utf8(d)),e); }
/*
* Perform a simple self-test to see if the VM is working
*/
public md5_vm_test() {
return this.hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72";
}
/*
* Calculate the MD5 of a raw string
*/
public rstr_md5(s) {
return this.binl2rstr(this.binl_md5(this.rstr2binl(s),s.length * 8));
}
/*
* Calculate the HMAC-MD5, of a key and some data (raw strings)
*/
public rstr_hmac_md5(key,data) {
var bkey = this.rstr2binl(key);
if(bkey.length > 16) bkey = this.binl_md5(bkey,key.length * 8);
var ipad = Array(16),opad = Array(16);
for(var i = 0;i < 16;i++) {
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5C5C5C5C;
}
var hash = this.binl_md5(ipad.concat(this.rstr2binl(data)),512 + data.length * 8);
return this.binl2rstr(this.binl_md5(opad.concat(hash),512 + 128));
}
/*
* Convert a raw string to a hex string
*/
public rstr2hex(input) {
try { this.hexcase } catch(e) { this.hexcase = 0; }
var hex_tab = this.hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var output = "";
var x;
for(var i = 0;i < input.length;i++) {
x = input.charCodeAt(i);
output += hex_tab.charAt((x >>> 4) & 0x0F)
+ hex_tab.charAt(x & 0x0F);
}
return output;
}
/*
* Convert a raw string to a base-64 string
*/
public rstr2b64(input) {
try { this.b64pad } catch(e) { this.b64pad = ''; }
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var output = "";
var len = input.length;
for(var i = 0;i < len;i += 3) {
var triplet = (input.charCodeAt(i) << 16)
| (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0)
| (i + 2 < len ? input.charCodeAt(i + 2) : 0);
for(var j = 0;j < 4;j++) {
if(i * 8 + j * 6 > input.length * 8) output += this.b64pad;
else output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
}
}
return output;
}
/*
* Convert a raw string to an arbitrary string encoding
*/
public rstr2any(input,encoding) {
var divisor = encoding.length;
var i,j,q,x,quotient;
/* Convert to an array of 16-bit big-endian values, forming the dividend */
var dividend = Array(Math.ceil(input.length / 2));
for(i = 0;i < dividend.length;i++) {
dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
}
/*
* Repeatedly perform a long division. The binary array forms the dividend,
* the length of the encoding is the divisor. Once computed, the quotient
* forms the dividend for the next step. All remainders are stored for later
* use.
*/
var full_length = Math.ceil(input.length * 8 /
(Math.log(encoding.length) / Math.log(2)));
var remainders = Array(full_length);
for(j = 0;j < full_length;j++) {
quotient = Array();
x = 0;
for(i = 0;i < dividend.length;i++) {
x = (x << 16) + dividend[i];
q = Math.floor(x / divisor);
x -= q * divisor;
if(quotient.length > 0 || q > 0)
quotient[quotient.length] = q;
}
remainders[j] = x;
dividend = quotient;
}
/* Convert the remainders to the output string */
var output = "";
for(i = remainders.length - 1;i >= 0;i--)
output += encoding.charAt(remainders[i]);
return output;
}
/*
* Encode a string as utf-8.
* For efficiency, this assumes the input is valid utf-16.
*/
public str2rstr_utf8(input) {
var output = "";
var i = -1;
var x,y;
while(++i < input.length) {
/* Decode utf-16 surrogate pairs */
x = input.charCodeAt(i);
y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
i++;
}
/* Encode output as utf-8 */
if(x <= 0x7F)
output += String.fromCharCode(x);
else if(x <= 0x7FF)
output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
0x80 | (x & 0x3F));
else if(x <= 0xFFFF)
output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
0x80 | ((x >>> 6) & 0x3F),
0x80 | (x & 0x3F));
else if(x <= 0x1FFFFF)
output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
0x80 | ((x >>> 12) & 0x3F),
0x80 | ((x >>> 6) & 0x3F),
0x80 | (x & 0x3F));
}
return output;
}
/*
* Encode a string as utf-16
*/
public str2rstr_utf16le(input) {
var output = "";
for(var i = 0;i < input.length;i++)
output += String.fromCharCode(input.charCodeAt(i) & 0xFF,
(input.charCodeAt(i) >>> 8) & 0xFF);
return output;
}
public str2rstr_utf16be(input) {
var output = "";
for(var i = 0;i < input.length;i++)
output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
input.charCodeAt(i) & 0xFF);
return output;
}
/*
* Convert a raw string to an array of little-endian words
* Characters >255 have their high-byte silently ignored.
*/
public rstr2binl(input) {
var output = Array(input.length >> 2);
for(var i = 0;i < output.length;i++)
output[i] = 0;
for(var i = 0;i < input.length * 8;i += 8)
output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
return output;
}
/*
* Convert an array of little-endian words to a string
*/
public binl2rstr(input) {
var output = "";
for(var i = 0;i < input.length * 32;i += 8)
output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
return output;
}
/*
* Calculate the MD5 of an array of little-endian words, and a bit length.
*/
public binl_md5(x,len) {
/* append padding */
x[len >> 5] |= 0x80 << ((len) % 32);
x[(((len + 64) >>> 9) << 4) + 14] = len;
var a = 1732584193;
var b = -271733879;
var c = -1732584194;
var d = 271733878;
for(var i = 0;i < x.length;i += 16) {
var olda = a;
var oldb = b;
var oldc = c;
var oldd = d;
a = this.md5_ff(a,b,c,d,x[i + 0],7,-680876936);
d = this.md5_ff(d,a,b,c,x[i + 1],12,-389564586);
c = this.md5_ff(c,d,a,b,x[i + 2],17,606105819);
b = this.md5_ff(b,c,d,a,x[i + 3],22,-1044525330);
a = this.md5_ff(a,b,c,d,x[i + 4],7,-176418897);
d = this.md5_ff(d,a,b,c,x[i + 5],12,1200080426);
c = this.md5_ff(c,d,a,b,x[i + 6],17,-1473231341);
b = this.md5_ff(b,c,d,a,x[i + 7],22,-45705983);
a = this.md5_ff(a,b,c,d,x[i + 8],7,1770035416);
d = this.md5_ff(d,a,b,c,x[i + 9],12,-1958414417);
c = this.md5_ff(c,d,a,b,x[i + 10],17,-42063);
b = this.md5_ff(b,c,d,a,x[i + 11],22,-1990404162);
a = this.md5_ff(a,b,c,d,x[i + 12],7,1804603682);
d = this.md5_ff(d,a,b,c,x[i + 13],12,-40341101);
c = this.md5_ff(c,d,a,b,x[i + 14],17,-1502002290);
b = this.md5_ff(b,c,d,a,x[i + 15],22,1236535329);
a = this.md5_gg(a,b,c,d,x[i + 1],5,-165796510);
d = this.md5_gg(d,a,b,c,x[i + 6],9,-1069501632);
c = this.md5_gg(c,d,a,b,x[i + 11],14,643717713);
b = this.md5_gg(b,c,d,a,x[i + 0],20,-373897302);
a = this.md5_gg(a,b,c,d,x[i + 5],5,-701558691);
d = this.md5_gg(d,a,b,c,x[i + 10],9,38016083);
c = this.md5_gg(c,d,a,b,x[i + 15],14,-660478335);
b = this.md5_gg(b,c,d,a,x[i + 4],20,-405537848);
a = this.md5_gg(a,b,c,d,x[i + 9],5,568446438);
d = this.md5_gg(d,a,b,c,x[i + 14],9,-1019803690);
c = this.md5_gg(c,d,a,b,x[i + 3],14,-187363961);
b = this.md5_gg(b,c,d,a,x[i + 8],20,1163531501);
a = this.md5_gg(a,b,c,d,x[i + 13],5,-1444681467);
d = this.md5_gg(d,a,b,c,x[i + 2],9,-51403784);
c = this.md5_gg(c,d,a,b,x[i + 7],14,1735328473);
b = this.md5_gg(b,c,d,a,x[i + 12],20,-1926607734);
a = this.md5_hh(a,b,c,d,x[i + 5],4,-378558);
d = this.md5_hh(d,a,b,c,x[i + 8],11,-2022574463);
c = this.md5_hh(c,d,a,b,x[i + 11],16,1839030562);
b = this.md5_hh(b,c,d,a,x[i + 14],23,-35309556);
a = this.md5_hh(a,b,c,d,x[i + 1],4,-1530992060);
d = this.md5_hh(d,a,b,c,x[i + 4],11,1272893353);
c = this.md5_hh(c,d,a,b,x[i + 7],16,-155497632);
b = this.md5_hh(b,c,d,a,x[i + 10],23,-1094730640);
a = this.md5_hh(a,b,c,d,x[i + 13],4,681279174);
d = this.md5_hh(d,a,b,c,x[i + 0],11,-358537222);
c = this.md5_hh(c,d,a,b,x[i + 3],16,-722521979);
b = this.md5_hh(b,c,d,a,x[i + 6],23,76029189);
a = this.md5_hh(a,b,c,d,x[i + 9],4,-640364487);
d = this.md5_hh(d,a,b,c,x[i + 12],11,-421815835);
c = this.md5_hh(c,d,a,b,x[i + 15],16,530742520);
b = this.md5_hh(b,c,d,a,x[i + 2],23,-995338651);
a = this.md5_ii(a,b,c,d,x[i + 0],6,-198630844);
d = this.md5_ii(d,a,b,c,x[i + 7],10,1126891415);
c = this.md5_ii(c,d,a,b,x[i + 14],15,-1416354905);
b = this.md5_ii(b,c,d,a,x[i + 5],21,-57434055);
a = this.md5_ii(a,b,c,d,x[i + 12],6,1700485571);
d = this.md5_ii(d,a,b,c,x[i + 3],10,-1894986606);
c = this.md5_ii(c,d,a,b,x[i + 10],15,-1051523);
b = this.md5_ii(b,c,d,a,x[i + 1],21,-2054922799);
a = this.md5_ii(a,b,c,d,x[i + 8],6,1873313359);
d = this.md5_ii(d,a,b,c,x[i + 15],10,-30611744);
c = this.md5_ii(c,d,a,b,x[i + 6],15,-1560198380);
b = this.md5_ii(b,c,d,a,x[i + 13],21,1309151649);
a = this.md5_ii(a,b,c,d,x[i + 4],6,-145523070);
d = this.md5_ii(d,a,b,c,x[i + 11],10,-1120210379);
c = this.md5_ii(c,d,a,b,x[i + 2],15,718787259);
b = this.md5_ii(b,c,d,a,x[i + 9],21,-343485551);
a = this.safe_add(a,olda);
b = this.safe_add(b,oldb);
c = this.safe_add(c,oldc);
d = this.safe_add(d,oldd);
}
return [a,b,c,d];
}
/*
* These privates implement the four basic operations the algorithm uses.
*/
public md5_cmn(q,a,b,x,s,t) {
return this.safe_add(this.bit_rol(this.safe_add(this.safe_add(a,q),this.safe_add(x,t)),s),b);
}
public md5_ff(a,b,c,d,x,s,t) {
return this.md5_cmn((b & c) | ((~b) & d),a,b,x,s,t);
}
public md5_gg(a,b,c,d,x,s,t) {
return this.md5_cmn((b & d) | (c & (~d)),a,b,x,s,t);
}
public md5_hh(a,b,c,d,x,s,t) {
return this.md5_cmn(b ^ c ^ d,a,b,x,s,t);
}
public md5_ii(a,b,c,d,x,s,t) {
return this.md5_cmn(c ^ (b | (~d)),a,b,x,s,t);
}
/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
public safe_add(x,y) {
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
/*
* Bitwise rotate a 32-bit number to the left.
*/
public bit_rol(num,cnt) {
return (num << cnt) | (num >>> (32 - cnt));
}
}
import express = require('express');
import bodyParser = require('body-parser');
import sign = require('../middleware/sign');
import routers = require('../routers/router');
import compression = require('compression');
import * as fallback from 'express-history-api-fallback';
import * as path from "path";
export class httpServer {
static createServer(port:number) {
var httpServer = express();
httpServer.all('*',function (req, res, next) {
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header('Access-Control-Allow-Credentials', true);
res.header("X-Powered-By", ' 3.2.1');
if(req.method === 'OPTIONS'){
res.statusCode = 200;
res.end();
}else{
next();
}
});
httpServer.use(express.static('public') );
httpServer.use(express.static('img') );
httpServer.use(bodyParser.json({limit:"10kb"}));
httpServer.use(compression())
routers.setRouter(httpServer);
const root = path.join(__dirname, "../../public/")
httpServer.use(express.static(root))
httpServer.use(fallback('index.html', { root }))
console.log('web listen on port:'+port);
httpServer.listen(port);
console.log('server listen on port:'+port);
return httpServer;
}
}
import * as asyncHandler from 'express-async-handler'
import * as leftBiz from '../biz/getData';
import * as jiQiRenBiz from '../biz/jiQiRen';
import * as cyszhglBiz from '../biz/cyszhgl';
import * as gfnyBiz from '../biz/gfny';
import * as sdt1hgfbBiz from '../biz/sdt1hgfb';
import * as yzdqxdnyzlBiz from '../biz/yzdqxdnyzl';
import * as hjszzlBiz from '../biz/hjszzl';
import * as nyjqrBiz from '../biz/nyjqr';
import * as jdaqglBiz from '../biz/jdaqgl';
import * as gbzscbgjdAqBiz from '../biz/gbzscbgjdAq';
import * as gbzscbgjdBqBiz from '../biz/gbzscbgjdBq';
export function setRouter(httpServer){
/**竖屏 */
httpServer.get('/left', asyncHandler(leftBiz.getLeft));
httpServer.get('/data', asyncHandler(leftBiz.getData));
httpServer.get('/right', asyncHandler(leftBiz.getRight));
//机器人
httpServer.get('/jiqiren/left', asyncHandler(jiQiRenBiz.getLeft));
httpServer.get('/jiqiren/top', asyncHandler(jiQiRenBiz.getTop));
httpServer.get('/jiqiren/right', asyncHandler(jiQiRenBiz.getRight));
//======post
httpServer.post('/cyszhgl', asyncHandler(cyszhglBiz.getData));
httpServer.post('/gfny', asyncHandler(gfnyBiz.getData));
httpServer.post('/sdt1hgfb', asyncHandler(sdt1hgfbBiz.getData));
httpServer.post('/yzdqxdnyzl', asyncHandler(yzdqxdnyzlBiz.getData));
httpServer.post('/hjszzl', asyncHandler(hjszzlBiz.getData));
httpServer.post('/nyjqr', asyncHandler(nyjqrBiz.getData));
httpServer.post('/jdaqgl', asyncHandler(jdaqglBiz.getData));
httpServer.post('/gbzscbgjdAq', asyncHandler(gbzscbgjdAqBiz.getData));
httpServer.post('/gbzscbgjdBq', asyncHandler(gbzscbgjdBqBiz.getData));
//======get
httpServer.get('/cyszhgl', asyncHandler(cyszhglBiz.getData));
httpServer.get('/gfny', asyncHandler(gfnyBiz.getData));
httpServer.get('/sdt1hgfb', asyncHandler(sdt1hgfbBiz.getData));
httpServer.get('/yzdqxdnyzl', asyncHandler(yzdqxdnyzlBiz.getData));
httpServer.get('/hjszzl', asyncHandler(hjszzlBiz.getData));
httpServer.get('/nyjqr', asyncHandler(nyjqrBiz.getData));
httpServer.get('/jdaqgl', asyncHandler(jdaqglBiz.getData));
httpServer.get('/gbzscbgjdAq', asyncHandler(gbzscbgjdAqBiz.getData));
httpServer.get('/gbzscbgjdBq', asyncHandler(gbzscbgjdBqBiz.getData));
}
\ No newline at end of file
const xlsx = require('node-xlsx');
const path = require('path');
/**
* onceSheetBecomeOfblockData 将excel文件的指定sheet解析成数据块数据
* @param fileName 文件名称
* @param sheetName 表名称
* @returns [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
export function onceSheetBecomeOfblockData(fileName, sheetName) {
let {sheetMap} = getExcel( path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", fileName ));
let thisBlockData = getBlockData(sheetMap[sheetName]);
return thisBlockData;
}
/**
* excelBecomeOfBlockData 将excel所有的sheet解析成数据块
* @param fileName 文件名称
* @returns {"sheetName1":[ {blockData:数据块(二维数组), blockTitle:"数据标题"}], ...}
*/
export function excelBecomeOfBlockData(fileName) {
let {sheetMap} = getExcel( path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", fileName ));
let result = {};
for (let sheetName in sheetMap) {
result[sheetName] = getBlockData(sheetMap[sheetName]);
}
return result;
}
/**
* planaryArrayBecomeOfBlockData 将符合excel规则的sheet二维数组转为 数据块
* @param dataList excel解出来的数据
* @returns thisBlockData 返回数据块集合 格式:blockList = [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
export function planaryArrayBecomeOfBlockData(planaryArray) {
return getBlockData(planaryArray);;
}
//===
/**
* getBlockData 数据分块
* @param dataList 解析出来的excel二维数组
* @returns 返回数据块集合 格式:blockList = [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
function getBlockData(dataList) {
let blockList = [];
for (let i = 0; i < 999; i++) {
let {blockData, blockTitle, notItem, delDataList} = checkBlock(dataList);
if (notItem) break;
dataList = delDataList;
if (blockTitle) blockList.push({blockData, blockTitle});
}
return blockList;
}
function getListFristNotNullItemIndex(list) { //获取起始坐标
if (!list.length) return null;
for (let i = 0; i < list.length; i++) {
if (list[i]) return i;
}
}
function getListFirstNullItemIndex(startX, list) { //获取第一个为空的坐标
if (!list.length) return null;
let checkItem = false;
let firstItemIndex = 0;
for (let i = startX; i <= list.length; i++) {
let item = list[i];
if (!checkItem && item) checkItem = true;
if (checkItem && !item) {
firstItemIndex = i;
break;
}
}
return firstItemIndex;
}
function listRegionIsNull(list, startX, endX) { //指定区间内数据是否未空
let isNull = true;
if ( !list.length ) return isNull;
for (let i = startX; i < endX; i++) {
let item = list[i];
if (item) {
isNull = false;
break;
}
}
return isNull;
}
function thisListNotItem(list) {
for (let i = 0; i < list.length; i++) {
if (list[i]) return false;
}
return true
}
function checkBlock(dataList) {
//纵向有效起始点
let startY = 0;
let startX = 0;
let isNotBlockTitle = false; //没有块标题
let isLook = false;
let endX = 0;//x轴最长结束下标 【包括下标】
let blockTitle = ''; //标题块名称
let notItem = true;
for (let i = 0; i < dataList.length; i++) {
let childList = dataList[i] || [];
if (!thisListNotItem(childList)) {
if ( !isLook ) {
let thisRoowStartX = getListFristNotNullItemIndex(childList);
let thisRoowLastItem = childList[thisRoowStartX + 1];
let LastList = dataList[i+1] || [];
// let lastRoowStartX = getListFristNotNullItemIndex(LastList);
let lastRoowHaveItem = LastList[thisRoowStartX];
if ( thisRoowLastItem || (LastList.length && lastRoowHaveItem) ) {
if (lastRoowHaveItem && thisRoowLastItem ) {
isNotBlockTitle = true; //不存在标题块
blockTitle = `${thisRoowStartX}_${i}`;
startY = i;
startX = thisRoowStartX;
}
else {
blockTitle = dataList[i][thisRoowStartX];
dataList[i][thisRoowStartX] = null;
if ( thisRoowLastItem ) { // 同行存在元素 标题在y轴上
startY = i;
startX = thisRoowStartX + 1;
} else { // 同行存在元素 标题在x轴上
startY = i + 1;
startX = thisRoowStartX;
}
}
isLook = true;
} else { //只有标题 无内容
console.log(dataList[i][thisRoowStartX]);
dataList[i][thisRoowStartX] = null;
}
} else {
//测量最大连续长度
let firstNullX = getListFirstNullItemIndex(startX, childList);
if (firstNullX) endX = Math.max(endX, firstNullX-1);
break;
}
notItem = false;
}
}
let endY = 0;//y轴连续下标 【包括下标】
let yInfoStart = false;
let yInfoEnd = false;
for (let y = startY; y < dataList.length; y++) {
//纵向找连续性
let thisRoow = dataList[y];
let regionIsNull = listRegionIsNull(thisRoow, startX, endX);
if (!regionIsNull) {
endY = y;
if (!yInfoStart) yInfoStart = true;
}
if (yInfoStart && regionIsNull) yInfoEnd = true;
if (yInfoEnd) break;
}
let blockData = [];
for (let y = startY; y <= endY; y++) {
let onceList = [];
for (let x = startX; x <= endX; x++) {
onceList.push(dataList[y][x]);
dataList[y][x] = null;
}
blockData.push(onceList);
}
return {blockData, blockTitle, delDataList:dataList,notItem};
}
//获取单个excel文件的数据
function getExcel(filePath) {
const workSheetsFromFile = xlsx.parse(filePath);
let sheetMap = {};
let sheetList = [];
for (let i = 0; i < workSheetsFromFile.length; i++) {
let sheetInfo = workSheetsFromFile[i];
sheetMap[sheetInfo.name] = sheetInfo.data;
sheetList.push(sheetInfo);
}
return {sheetMap, sheetList}
}
\ No newline at end of file
import { getBizMsg, getSysMsg } from "../config/errorEnum";
import { logError } from "./log";
export class BizError extends Error {
constructor(...msgs) {
let reqErrorMsg = '';
let logErrorMsg = '';
for (let i = 0; i <msgs.length; i++) {
if (!i) {
let msg = getBizMsg(msgs[i]);
reqErrorMsg = msg;
logErrorMsg = msg;
} else {
logErrorMsg += ` | ${msgs[i]} `;
}
}
logError(logErrorMsg);
super(reqErrorMsg);
}
}
export class SysError extends Error {
constructor(...msgs) {
let reqErrorMsg = '';
let logErrorMsg = '';
for (let i = 0; i <msgs.length; i++) {
if (!i) {
let msg= getSysMsg(msgs[i]);
reqErrorMsg = msg;
logErrorMsg = msg;
} else {
if (typeof msgs[i] == 'object') logErrorMsg += ` | ${JSON.stringify(msgs[i])} `;
else logErrorMsg += ` | ${msgs[i]} `;
}
}
logError(logErrorMsg);
super(reqErrorMsg);
}
}
\ No newline at end of file
let log4js = require('log4js');
let path = require('path');
//log路径
export const systemLogPath = {
errorLogFile:"error",
errorLogDir:"error",
handleLogFile:"handle",
handleLogDir:"handle"
}
//日志根目录
let baseLogPath = path.resolve(__dirname.substring(0, __dirname.indexOf("out")), 'logs');
// let baseLogPath = path.resolve('./', 'logs');
let errFile = path.resolve(baseLogPath, systemLogPath.errorLogDir, systemLogPath.errorLogFile);
let handFile =path.resolve(baseLogPath, systemLogPath.handleLogDir, systemLogPath.handleLogFile);
let config = {
appenders:
{
"rule-console": {"type": "console"},
"errorLogger": {
"type": "dateFile", // 日志类型
"filename": errFile, // 输出文件名
"pattern": "-yyyy-MM-dd.log", // 后缀
"alwaysIncludePattern": true, // 上面两个参数是否合并
"encoding": "utf-8", // 编码格式
"maxLogSize": 1000, // 最大存储内容
"numBackups": 3, // 当文件内容超过文件存储空间时,备份文件的数量
"path": `/${systemLogPath.errorLogDir}`
},
"handleLogger": {
"type": "dateFile",
"filename": handFile,
"pattern": "-yyyy-MM-dd.log",
"alwaysIncludePattern": true,
"encoding": "utf-8",
"maxLogSize": 1000,
"numBackups": 3,
"path": `/${systemLogPath.handleLogDir}`
}
},
categories: {
"default": {"appenders": ["rule-console"], "level": "all"}, //这个配置一定要有
"errorLogger": {"appenders": ["errorLogger"], "level": "error"},
"handleLogger": {"appenders": ["handleLogger"], "level": "all"}
},
"baseLogPath": path.resolve(baseLogPath, systemLogPath.handleLogDir, systemLogPath.handleLogFile)
};
log4js.configure(config); //加载配置文件
//调用预先定义的日志名称
let errorLogger = log4js.getLogger("errorLogger");
let handleLogger = log4js.getLogger("handleLogger");
let consoleLogger = log4js.getLogger("rule-console");
//错误日志
export function logError(...errStrs) {
let str = "";
errStrs.forEach(item => {
str += item + " | ";
});
errorLogger.error(`errorInfo => ${str}`);
}
//普通日志
export function logHandle(msgStr:string) {
handleLogger.info(`logInfo => ${msgStr}`);
}
//输出日志
export function logConsole(logStr:string) {
consoleLogger.info(`logInfo => ${logStr}`);
}
var xml2js = require("xml2js");
/**
*
* @param str 需要解析的xml文本
* @returns 解析好的对象
*/
export function analysisXml(str) {
return new Promise( (resolve, reject) => {
xml2js.parseString(str, (err, result) => {
if (err) return reject(err);
return resolve(result);
});
});
}
\ No newline at end of file
import * as request from 'request';
import { BizError } from './bizError';
export function get(url:string, query?, headers?, timeOut?) {
timeOut = timeOut || 5000;
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
return new Promise((resolve, reject)=>{
let paramater:any = { url, json:true, timeout:timeOut };
if (query) paramater.qs = query;
if (headers) paramater.headers = headers;
request.get(paramater, function (err, res, body) {
const success = !err && res && res == 200;
let message = err || res.statusCode || "";
resolve({success, message, body});
})
})
}
export function post(url, body, headers) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
let header = {"content-type": "application/json"};
return new Promise((resolve, reject)=>{
request({
url: url,
method: "POST",
json: true,
headers: Object.assign(header, headers),
body: body
}, function(err, res, body) {
const success = !err && res && res == 200;
let message = err || res.statusCode || "";
resolve({success, message, body});
});
})
}
export function postForm(url, body) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
return new Promise((resolve, reject)=>{
request({
url: url,
method: "POST",
json: true,
form:body
}, function(err, res, body) {
const success = !err && res && res == 200;
let message = err || res.statusCode || "";
resolve({success, message, body});
});
})
}
//对象判空
export function objectKeyIsNull(obj, ...keyNames) {
let isNull = false;
for (let i = 0; i < keyNames.length; i++) {
let keyStr = keyNames[i];
let moreKeyList = keyStr.split(".");
let lastObj;
for (let j = 0; j < moreKeyList.length; j++) {
lastObj = obj[moreKeyList[j]];
if (!lastObj) {
isNull = true;
break;
}
}
if (isNull) break;
}
return isNull;
}
{
"compilerOptions": {
"module": "commonjs",
"target": "es2017",
"sourceMap": true,
"rootDir":"./src",
"outDir":"./out"
},
"exclude": [
"node_modules"
]
}
\ 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