Commit 3f252a17 by chenjinjing

no message

parents
.idea
/out
/node_modules
/test
/public
/logs
/video
/files
/img
*test*
*.logs
*.zip
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "启动程序",
"program": "${workspaceFolder}/src/main.ts",
"outFiles": [
"${workspaceFolder}/**/*.js"
]
}
]
}
\ No newline at end of file
{
}
\ No newline at end of file
{
"name": "screen",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "screen",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"@alicloud/sms-sdk": "^1.1.6",
"@types/node": "^10.12.18",
"compression": "^1.7.4",
"crypto-js": "^4.2.0",
"express": "^4.17.1",
"express-async-handler": "^1.1.4",
"express-history-api-fallback": "^2.2.1",
"formidable": "^1.2.1",
"log4js": "^6.6.1",
"lru-cache": "^4.1.5",
"md5": "^2.2.1",
"moment": "^2.24.0",
"node-xlsx": "^0.16.1",
"nodemailer": "^6.1.1",
"pyfl": "^1.1.4",
"qs": "^6.11.0",
"request": "^2.88.0",
"svg-captcha": "^1.3.12",
"tencentcloud-sdk-nodejs": "^4.0.562",
"ws": "^5.2.2",
"xml2js": "^0.4.23"
},
"bin": {
"screen": "out/main.js"
},
"devDependencies": {}
},
"node_modules/@alicloud/dybaseapi": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/@alicloud/dybaseapi/-/dybaseapi-1.0.0.tgz",
"integrity": "sha512-4KEDgqES7IL60T/TWGSkLQkN6BYeHEw8smnPgac2J2MTES5v1ieCWvbLSuUUWi5SAXi7cydKoD4HUOmX7xwM+A==",
"dependencies": {
"@alicloud/pop-core": "^1.3.3"
}
},
"node_modules/@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==",
"dependencies": {
"@alicloud/pop-core": "^1.5.1"
}
},
"node_modules/@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==",
"dependencies": {
"debug": "^2.6.3",
"httpx": "^2.1.1",
"kitx": "^1.2.0",
"xml2js": "^0.4.17"
}
},
"node_modules/@alicloud/mns/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/@alicloud/mns/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/@alicloud/pop-core": {
"version": "1.7.13",
"resolved": "https://registry.npmmirror.com/@alicloud/pop-core/-/pop-core-1.7.13.tgz",
"integrity": "sha512-agzr4DU+aAGW7/2mp2hP1JcNJkn/zBS0jUGQt5etIASN0MVq1tMdudVqvWbExUG0mUouo/n2VgdnjOHjswvrlA==",
"dependencies": {
"debug": "^3.1.0",
"httpx": "^2.1.2",
"json-bigint": "^1.0.0",
"kitx": "^1.2.1",
"xml2js": "^0.5.0"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/@alicloud/pop-core/node_modules/xml2js": {
"version": "0.5.0",
"resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.5.0.tgz",
"integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
"dependencies": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/@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==",
"dependencies": {
"@alicloud/dybaseapi": "^1.0.0",
"@alicloud/dysmsapi-2017-05-25": "^1.0.1",
"@alicloud/mns": "^1.0.0-beta6",
"babel-runtime": "^6.26.0"
}
},
"node_modules/@babel/runtime": {
"version": "7.22.10",
"resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.22.10.tgz",
"integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/runtime/node_modules/regenerator-runtime": {
"version": "0.14.0",
"resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
"integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
},
"node_modules/@types/node": {
"version": "10.17.60",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-10.17.60.tgz",
"integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
},
"node_modules/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==",
"dependencies": {
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/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==",
"dependencies": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
},
"bin": {
"adler32": "bin/adler32.njs"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dependencies": {
"debug": "4"
},
"engines": {
"node": ">= 6.0.0"
}
},
"node_modules/agent-base/node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/agent-base/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
"node_modules/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==",
"dependencies": {
"safer-buffer": "~2.1.0"
}
},
"node_modules/assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/async-limiter": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz",
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/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==",
"engines": {
"node": "*"
}
},
"node_modules/aws4": {
"version": "1.12.0",
"resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.12.0.tgz",
"integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
},
"node_modules/babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
"dependencies": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
"dependencies": {
"tweetnacl": "^0.14.3"
}
},
"node_modules/bignumber.js": {
"version": "9.1.1",
"resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.1.tgz",
"integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==",
"engines": {
"node": "*"
}
},
"node_modules/body-parser": {
"version": "1.20.1",
"resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz",
"integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"raw-body": "2.5.1",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/body-parser/node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/body-parser/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/body-parser/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/body-parser/node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"dependencies": {
"side-channel": "^1.0.4"
},
"engines": {
"node": ">=0.6"
}
},
"node_modules/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=="
},
"node_modules/bytes": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz",
"integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dependencies": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
}
},
"node_modules/caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
},
"node_modules/cfb": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
"integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
"dependencies": {
"adler-32": "~1.3.0",
"crc-32": "~1.2.0"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/cfb/node_modules/adler-32": {
"version": "1.3.1",
"resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
"integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/charenc": {
"version": "0.0.2",
"resolved": "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz",
"integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
"engines": {
"node": "*"
}
},
"node_modules/codepage": {
"version": "1.15.0",
"resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
"integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz",
"integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
"dependencies": {
"mime-db": ">= 1.43.0 < 2"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/compression": {
"version": "1.7.4",
"resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz",
"integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
"dependencies": {
"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"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/compression/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/compression/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"dependencies": {
"safe-buffer": "5.2.1"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/content-disposition/node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
},
"node_modules/content-type": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz",
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie": {
"version": "0.5.0",
"resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz",
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
"node_modules/core-js": {
"version": "2.6.12",
"resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
"deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
"hasInstallScript": true
},
"node_modules/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=="
},
"node_modules/crc-32": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
"integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
"bin": {
"crc32": "bin/crc32.njs"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/crypt": {
"version": "0.0.2",
"resolved": "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
"engines": {
"node": "*"
}
},
"node_modules/crypto-js": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
"integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
},
"node_modules/dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
"dependencies": {
"assert-plus": "^1.0.0"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/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==",
"engines": {
"node": ">=4.0"
}
},
"node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/destroy": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
"dependencies": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"node_modules/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=="
},
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/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=="
},
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/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==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/express": {
"version": "4.18.2",
"resolved": "https://registry.npmmirror.com/express/-/express-4.18.2.tgz",
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.1",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.5.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.7",
"qs": "6.11.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"engines": {
"node": ">= 0.10.0"
}
},
"node_modules/express-async-handler": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/express-async-handler/-/express-async-handler-1.2.0.tgz",
"integrity": "sha512-rCSVtPXRmQSW8rmik/AIb2P0op6l7r1fMW538yyvTMltCO4xQEWMmobfrIxN2V1/mVrgxB8Az3reYF6yUZw37w=="
},
"node_modules/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=="
},
"node_modules/express/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/express/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/express/node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"dependencies": {
"side-channel": "^1.0.4"
},
"engines": {
"node": ">=0.6"
}
},
"node_modules/express/node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
},
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"node_modules/extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
"engines": [
"node >=0.6.0"
]
},
"node_modules/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=="
},
"node_modules/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=="
},
"node_modules/finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"statuses": "2.0.1",
"unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/finalhandler/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/finalhandler/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/flatted": {
"version": "3.2.7",
"resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz",
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ=="
},
"node_modules/forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
"engines": {
"node": "*"
}
},
"node_modules/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==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 0.12"
}
},
"node_modules/formidable": {
"version": "1.2.6",
"resolved": "https://registry.npmmirror.com/formidable/-/formidable-1.2.6.tgz",
"integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==",
"deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau"
},
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/frac": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/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==",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
},
"engines": {
"node": ">=6 <7 || >=8"
}
},
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"node_modules/get-intrinsic": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
"integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
"dependencies": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3"
}
},
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"engines": {
"node": ">=10"
}
},
"node_modules/getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
"dependencies": {
"assert-plus": "^1.0.0"
}
},
"node_modules/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=="
},
"node_modules/har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
"engines": {
"node": ">=4"
}
},
"node_modules/har-validator": {
"version": "5.1.5",
"resolved": "https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz",
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
"deprecated": "this library is no longer supported",
"dependencies": {
"ajv": "^6.12.3",
"har-schema": "^2.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dependencies": {
"function-bind": "^1.1.1"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/has-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz",
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"dependencies": {
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
"dependencies": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
},
"engines": {
"node": ">=0.8",
"npm": ">=1.3.7"
}
},
"node_modules/https-proxy-agent": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dependencies": {
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/https-proxy-agent/node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/https-proxy-agent/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/httpx": {
"version": "2.2.7",
"resolved": "https://registry.npmmirror.com/httpx/-/httpx-2.2.7.tgz",
"integrity": "sha512-Wjh2JOAah0pdczfqL8NC5378G7jMt0Zcpn8U+yyxAiejjlagzSTQgJHuVvka2VNPQlKfoGehYRc79WKq9E4gDw==",
"dependencies": {
"@types/node": "^14",
"debug": "^4.1.1"
}
},
"node_modules/httpx/node_modules/@types/node": {
"version": "14.18.54",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-14.18.54.tgz",
"integrity": "sha512-uq7O52wvo2Lggsx1x21tKZgqkJpvwCseBBPtX/nKQfpVlEsLOb11zZ1CRsWUKvJF0+lzuA9jwvA7Pr2Wt7i3xw=="
},
"node_modules/httpx/node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/httpx/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/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==",
"engines": {
"node": ">= 0.10"
}
},
"node_modules/is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
},
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"engines": {
"node": ">=8"
}
},
"node_modules/is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
},
"node_modules/isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
},
"node_modules/jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
},
"node_modules/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==",
"dependencies": {
"bignumber.js": "^9.0.0"
}
},
"node_modules/json-schema": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz",
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
},
"node_modules/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=="
},
"node_modules/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=="
},
"node_modules/jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/jsprim": {
"version": "1.4.2",
"resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-1.4.2.tgz",
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
"dependencies": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.4.0",
"verror": "1.10.0"
},
"engines": {
"node": ">=0.6.0"
}
},
"node_modules/kitx": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/kitx/-/kitx-1.3.0.tgz",
"integrity": "sha512-fhBqFlXd0GkKTB+8ayLfpzPUw+LHxZlPAukPNBD1Om7JMeInT+/PxCAf1yLagvD+VKoyWhXtJR68xQkX/a0wOQ=="
},
"node_modules/log4js": {
"version": "6.9.1",
"resolved": "https://registry.npmmirror.com/log4js/-/log4js-6.9.1.tgz",
"integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==",
"dependencies": {
"date-format": "^4.0.14",
"debug": "^4.3.4",
"flatted": "^3.2.7",
"rfdc": "^1.3.0",
"streamroller": "^3.1.5"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/log4js/node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/log4js/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/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==",
"dependencies": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"node_modules/md5": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
"integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
"dependencies": {
"charenc": "0.0.2",
"crypt": "0.0.2",
"is-buffer": "~1.1.6"
}
},
"node_modules/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==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
},
"node_modules/methods": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz",
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/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==",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/moment": {
"version": "2.29.4",
"resolved": "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
"engines": {
"node": "*"
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/node-fetch": {
"version": "2.6.12",
"resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.12.tgz",
"integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
"dependencies": {
"whatwg-url": "^5.0.0"
},
"engines": {
"node": "4.x || >=6.0.0"
},
"peerDependencies": {
"encoding": "^0.1.0"
},
"peerDependenciesMeta": {
"encoding": {
"optional": true
}
}
},
"node_modules/node-xlsx": {
"version": "0.16.2",
"resolved": "https://registry.npmmirror.com/node-xlsx/-/node-xlsx-0.16.2.tgz",
"integrity": "sha512-ZT3Y4Zg2BFC2UWdp9B/6x3GqrFL0Bf0cXKy9IyhcwlKbcDAf5GuPAPSqrWFQK68NIpfTNA1Kr/NNjpwYxUgHTA==",
"dependencies": {
"@babel/runtime": "^7.14.6",
"buffer-from": "^1.1.1",
"xlsx": "^0.17.0"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/nodemailer": {
"version": "6.9.4",
"resolved": "https://registry.npmmirror.com/nodemailer/-/nodemailer-6.9.4.tgz",
"integrity": "sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"engines": {
"node": "*"
}
},
"node_modules/object-inspect": {
"version": "1.12.3",
"resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz",
"integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
},
"node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"dependencies": {
"ee-first": "1.1.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/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==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/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==",
"dependencies": {
"tiny-inflate": "^1.0.2"
},
"bin": {
"ot": "bin/ot"
}
},
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/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=="
},
"node_modules/performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
},
"node_modules/printj": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/printj/-/printj-1.1.2.tgz",
"integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==",
"bin": {
"printj": "bin/printj.njs"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/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==",
"dependencies": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
},
"node_modules/psl": {
"version": "1.9.0",
"resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz",
"integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
},
"node_modules/punycode": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz",
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
"engines": {
"node": ">=6"
}
},
"node_modules/pyfl": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/pyfl/-/pyfl-1.1.4.tgz",
"integrity": "sha512-tEwj+SYfOk7zMStPrcDvadkUYomRIX6URQA/dl+YDqaEZlP9gEXM501FUsorz5HozCkfIeFOoT7U2jTElQ+zYg=="
},
"node_modules/qs": {
"version": "6.11.2",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.2.tgz",
"integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
"dependencies": {
"side-channel": "^1.0.4"
},
"engines": {
"node": ">=0.6"
}
},
"node_modules/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==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/raw-body": {
"version": "2.5.1",
"resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz",
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/raw-body/node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"node_modules/request": {
"version": "2.88.2",
"resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
"dependencies": {
"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"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/request/node_modules/qs": {
"version": "6.5.3",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz",
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
"engines": {
"node": ">=0.6"
}
},
"node_modules/rfdc": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz",
"integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
},
"node_modules/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=="
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/sax": {
"version": "1.2.4",
"resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"node_modules/send": {
"version": "0.18.0",
"resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"mime": "1.6.0",
"ms": "2.1.3",
"on-finished": "2.4.1",
"range-parser": "~1.2.1",
"statuses": "2.0.1"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/send/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/send/node_modules/debug/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"dependencies": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
"node_modules/side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dependencies": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
}
},
"node_modules/ssf": {
"version": "0.11.2",
"resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
"integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
"dependencies": {
"frac": "~1.1.2"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/sshpk": {
"version": "1.17.0",
"resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.17.0.tgz",
"integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
"dependencies": {
"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"
},
"bin": {
"sshpk-conv": "bin/sshpk-conv",
"sshpk-sign": "bin/sshpk-sign",
"sshpk-verify": "bin/sshpk-verify"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/streamroller": {
"version": "3.1.5",
"resolved": "https://registry.npmmirror.com/streamroller/-/streamroller-3.1.5.tgz",
"integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==",
"dependencies": {
"date-format": "^4.0.14",
"debug": "^4.3.4",
"fs-extra": "^8.1.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/streamroller/node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/streamroller/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/svg-captcha": {
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/svg-captcha/-/svg-captcha-1.4.0.tgz",
"integrity": "sha512-/fkkhavXPE57zRRCjNqAP3txRCSncpMx3NnNZL7iEoyAtYwUjPhJxW6FQTQPG5UPEmCrbFoXS10C3YdJlW7PDg==",
"dependencies": {
"opentype.js": "^0.7.3"
},
"engines": {
"node": ">=4.x"
}
},
"node_modules/tencentcloud-sdk-nodejs": {
"version": "4.0.667",
"resolved": "https://registry.npmmirror.com/tencentcloud-sdk-nodejs/-/tencentcloud-sdk-nodejs-4.0.667.tgz",
"integrity": "sha512-JBLHSlZuz/FRIVtOszvbEE90zG8UmslBLwGrKYq0mKvKiNLiidaSpFcRZjvnJ5Y0YcOuQ7WceLb9FPxvEF11ww==",
"dependencies": {
"form-data": "^3.0.0",
"get-stream": "^6.0.0",
"https-proxy-agent": "^5.0.0",
"is-stream": "^2.0.0",
"node-fetch": "^2.2.0",
"tslib": "1.13.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/tencentcloud-sdk-nodejs/node_modules/form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz",
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/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=="
},
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"engines": {
"node": ">=0.6"
}
},
"node_modules/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==",
"dependencies": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"node_modules/tslib": {
"version": "1.13.0",
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.13.0.tgz",
"integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
},
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"dependencies": {
"safe-buffer": "^5.0.1"
},
"engines": {
"node": "*"
}
},
"node_modules/tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
},
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dependencies": {
"punycode": "^2.1.0"
}
},
"node_modules/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==",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
"bin": {
"uuid": "bin/uuid"
}
},
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/verror": {
"version": "1.10.0",
"resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz",
"integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
"engines": [
"node >=0.6.0"
],
"dependencies": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
"node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"dependencies": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
}
},
"node_modules/wmf": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
"integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/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==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/ws": {
"version": "5.2.3",
"resolved": "https://registry.npmmirror.com/ws/-/ws-5.2.3.tgz",
"integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==",
"dependencies": {
"async-limiter": "~1.0.0"
}
},
"node_modules/xlsx": {
"version": "0.17.5",
"resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.17.5.tgz",
"integrity": "sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==",
"dependencies": {
"adler-32": "~1.2.0",
"cfb": "^1.1.4",
"codepage": "~1.15.0",
"crc-32": "~1.2.0",
"ssf": "~0.11.2",
"wmf": "~1.0.1",
"word": "~0.3.0"
},
"bin": {
"xlsx": "bin/xlsx.njs"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/xml2js": {
"version": "0.4.23",
"resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.4.23.tgz",
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
"dependencies": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/xmlbuilder": {
"version": "11.0.1",
"resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
"engines": {
"node": ">=4.0"
}
},
"node_modules/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": "screen",
"version": "1.0.0",
"description": "",
"main": "main.ts",
"dependencies": {
"@alicloud/sms-sdk": "^1.1.6",
"@types/node": "^10.12.18",
"compression": "^1.7.4",
"crypto-js": "^4.2.0",
"express": "^4.17.1",
"express-async-handler": "^1.1.4",
"express-history-api-fallback": "^2.2.1",
"formidable": "^1.2.1",
"log4js": "^6.6.1",
"lru-cache": "^4.1.5",
"md5": "^2.2.1",
"moment": "^2.24.0",
"node-xlsx": "^0.16.1",
"nodemailer": "^6.1.1",
"pyfl": "^1.1.4",
"qs": "^6.11.0",
"request": "^2.88.0",
"svg-captcha": "^1.3.12",
"tencentcloud-sdk-nodejs": "^4.0.562",
"ws": "^5.2.2",
"xml2js": "^0.4.23"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "cjj",
"license": "ISC",
"bin": "./out/main.js",
"pkg": {
"scripts": "out/**/*.js",
"assets": [
"public/**/*",
"res/**/*",
"images/**/*",
"video/**/*"
],
"outputPath": "dist"
}
}
File added
File added
<config>
<port>30001</port>
<ipUrl>http://192.168.0.71:30001/</ipUrl>
<url>http://api-gateway.sasu.shanghaitech.edu.cn</url>
<sign>xxx90909082fsdahfjosadjfpoiwausjorip2hjklrhn1ioud0u124rx0qwejfokasjfolksaujfoas</sign>
<appKey>1384855435661541376</appKey>
<appSecret>lRPbWFMckxc5tth6ZQnJtsBwCYIH0CXjcf0rvFgSOD8=</appSecret>
</config>
/**
* 教师个人发展(对内)
*/
import { jsgrfzNENUM, jshxNENUM, jshxWENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import { getKeyValue, readFileList } from "../outData";
import { jsgrfzTableData } from "../../data/table/duinei";
import { keyValuePackage, tablePackage } from "../../dataPackage/inFrontOut";
import { systemConfig } from "../../config/serverConfig";
import moment = require("moment");
const ImgUrl = "img/对内/教师个人发展/";
export async function getData(req, res) {
let teacherId = req.body.teacherId || "03e763eabb3011edbbac020315b3ff1e";
let ret:any = {};
let excelData = jsgrfzTableData();
const NowTime = new Date();
let jbxxData = await getReqApiData(jsgrfzNENUM.教师基本信息, {teacherId});
let jsrjbjData = await getReqApiData(jsgrfzNENUM.教师任教班级, {teacherId});
let jbxx = {
img:"",
state:"已认证",
name: jbxxData[0].name,
sex: jbxxData[0].sexName,
subject: jsrjbjData[0].subjectNames,
academic: jbxxData[0].title,
period: jsrjbjData[0].className,
};
ret["jbxx"] = {title:"基本信息", dataList:jbxx};
// let jsjl = [
// {
// name:"上海科技大学附属学校",
// time:"2023第一学期",
// rkbj:"九年级(1)班、九年级(4)班",
// gzlx:"教学工作",
// rjxk:"语文"
// },
// {
// name:"上海******学校",
// time:"2022第二学期",
// rkbj:"九年级(1)班、九年级(4)班",
// gzlx:"教学工作",
// rjxk:"语文"
// },
// ];
let jsjl = [];
let jshjData = await getReqApiData(jsgrfzNENUM.教师经历, {type:1, sso_user_id:teacherId}, null, "data", "jsfz");
let name = "上海科技大学附属学校";
if (jshjData) {
jshjData.list.data.forEach( info => {
jsjl.push({name, time:info.semester, rkbj:info.class, gzlx:info.type, rjxk:info.subject});
})
}
ret["jsjl"] = {title:"教师经历", dataList:jsjl};
let xspjfk = {
学生评价: excelData["学生评价"].dataList,
学生平均评价: excelData["学生平均评价"].dataList,
};
ret["xspjfk"] = {title:"学生评价反馈", dataList:xspjfk};
let thpj = {
同行评价: excelData["同行评价"].dataList,
同行平均评价: excelData["同行平均评价"].dataList,
};
ret["thpj"] = {title:"同行评价", dataList:thpj};
let tpkdf = {
教师听评课打分:[
{
key:"备课",
value:12
},
{
key:"上课",
value:31
},
{
key:"作业",
value:19
},
{
key:"**",
value:1
},
{
key:"**",
value:0
},
{
key:"***",
value:3
},
{
key:"**",
value:12
},
],
教师听评课平均打分:[
{
key:"备课",
value:12
},
{
key:"上课",
value:31
},
{
key:"作业",
value:19
},
{
key:"**",
value:1
},
{
key:"**",
value:0
},
{
key:"***",
value:3
},
{
key:"**",
value:12
},
],
};
ret["tpkdf"] = {title:"听评课打分", dataList:tpkdf};
let jdxsslData = await getReqApiData(jshxNENUM.全员导师制, {type:1, sso_user_id:teacherId}, null, "data", "jsfz");
let jdxssl = [];
if (jdxsslData || jdxsslData.length != 0) {
if(jdxsslData.list.data != 0) {
jdxsslData.list.data.forEach( info => {
let {semester, startTime, endTime, teacherName, studentNames} = info;
jdxssl.push({semester, startTime, endTime, studentNames})
})
}
}
ret["qyds"] = {title:"全员导师", dataList:jdxssl};
// let qyds = {
// titleList:["学生姓名", "班级", "年级"],
// dataList:[
// ["-", "-", "-"],
// ["-", "-", "-"],
// ["-", "-", "-"],
// ["-", "-", "-"],
// ]
// };
// ret["qyds"] = {title:"全员导师", dataList:qyds};
let jshjrc = [
{
key:"学业优秀学生数",
value:0
},
{
key:"竞赛获奖学生数",
value:0
},
];
ret["jshjrc"] = {title:"竞赛获奖人次", dataList:jshjrc};
let xyyxxss = {
titleList: ["优秀学生姓名", "学生班级", "获奖作品内容"],
dataList: [
["-", "-", "-"],
["-", "-", "-"],
["-", "-", "-"],
]
};
ret["xyyxxss"] = {title:"学业优秀学生数", dataList:xyyxxss};
let jshjxss = {
titleList: ["优秀学生姓名", "学生班级", "获奖作品内容"],
dataList: [
["-", "-", "-"],
["-", "-", "-"],
["-", "-", "-"],
]
};
ret["jshjxss"] = {title:"竞赛获奖学生数", dataList:jshjxss};
// let grcg = [
// {
// key:"课题研究数",
// value:131,
// detailed:[
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ]
// },
// {
// key:"发表出版数",
// value:97,
// detailed:[
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ]
// },
// {
// key:"获得奖项",
// value:155,
// detailed:[
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ["-", "-"],
// ]
// },
// ];
let grcgData = {课题研究数:0, 发表出版数:0, 获得奖项:0};
let zyfzcgData = await getReqApiData(jshxWENUM.专业发展成果, {type:1}, null, "data", "jsfz");
if (zyfzcgData) {
grcgData = {
课题研究数:zyfzcgData.subjectNum,
发表出版数:zyfzcgData.treatiseNum,
获得奖项:zyfzcgData.studentNum + zyfzcgData.teachNum + zyfzcgData.thesisNum
};
}
let grcg = [];
for (let key in grcgData) {
grcg.push({key, value:grcgData[key], detailed:[]});
}
ret["grcg"] = {title:"个人成果", dataList:grcg};
let jxtjData = await getReqApiData(jshxWENUM.获奖情况, {type:1, sso_user_id:teacherId}, null, "data", "jsfz");
let cyjszs = [
{
key:"参与教师总数",
value:jxtjData.list.total || 0
}
];
// let jxtjCount = {gjj:0, sj:0, qj:0, xj:0};
ret["cyjszs"] = {title:"参与教师总数", dataList:cyjszs};
let zyry = [
["区骨干", "2016.06.30-2025.06.30", "****"],
["学科带头人", "2016.06.30-2025.06.30", "****"],
["区骨干", "2016.06.30-2025.06.30", "****"],
["区骨干", "2016.06.30-2025.06.30", "****"],
["市中心组成员", "2016.06.30-2025.06.30", "****"],
];
ret["zyry"] = {title:"专业荣誉", dataList:zyry};
let jssy = [
{
key:"教师学分获取",
value:"***"
},
{
key:"参与社会服务",
value:"***"
},
];
ret["jssy"] = {title:"教师素养", dataList:jssy};
let ryjx = readFileList(`${ImgUrl}荣誉奖项/`, [], "png");
ret["ryjx"] = {title:"荣誉奖项", dataList:ryjx};
let jskhdyxq = {
师德考核:[
{
key:"优秀",
value:0
},
{
key:"合格数量",
value:0
},
{
key:"合格教师名单",
value:"-"
},
],
年度考核:[
{
key:"优秀",
value:0
},
{
key:"合格数量",
value:0
},
{
key:"不合格",
value:0
},
{
key:"基本合格",
value:0
},
],
};
ret["jskhdyxq"] = {title:"第一学期(师德考核/年度考核)", dataList:jskhdyxq};
let jxmyddyxq = [
{
key:"12.19",
value:0
},
{
key:"12.20",
value:0
},
{
key:"12.21",
value:0
},
{
key:"12.22",
value:0
},
{
key:"12.23",
value:0
},
{
key:"12.24",
value:0
},
{
key:"12.25",
value:0
}
];
ret["jxmyddyxq"] = {title:"第一学期(教学满意度)", dataList:jxmyddyxq};
let jskhdexq = {
师德考核:[
{
key:"优秀",
value:0
},
{
key:"合格数量",
value:0
},
{
key:"合格教师名单",
value:"-"
},
],
年度考核:[
{
key:"优秀",
value:0
},
{
key:"合格数量",
value:0
},
{
key:"不合格",
value:0
},
{
key:"基本合格",
value:0
},
],
};
ret["jskhdexq"] = {title:"第二学期(师德考核/年度考核)", dataList:jskhdexq};
let jxmyddexq = [
{
key:"12.19",
value:0
},
{
key:"12.20",
value:0
},
{
key:"12.21",
value:0
},
{
key:"12.22",
value:0
},
{
key:"12.23",
value:0
},
{
key:"12.24",
value:0
},
{
key:"12.25",
value:0
}
];
ret["jxmyddexq"] = {title:"第二学期(教学满意度)", dataList:jxmyddexq};
let ztcql = [
{
key:"整体出勤率",
value:98
}
];
ret["ztcql"] = {title:"整体出勤率", dataList:ztcql};
let cqkhqk = [
{
key:"12.19",
value:0
},
{
key:"12.20",
value:0
},
{
key:"12.21",
value:0
},
{
key:"12.22",
value:0
},
{
key:"12.23",
value:0
},
{
key:"12.24",
value:0
},
{
key:"12.25",
value:0
}
];
ret["cqkhqk"] = {title:"出勤考核情况", dataList:cqkhqk};
let qjqk = [
{
key:"请假",
value:0
},
{
key:"调休",
value:0
},
];
ret["qjqk"] = {title:"请假情况", dataList:qjqk};
let tdkqk = [
{
key:"调代课情况",
value:98
},
{
key:"代课次数",
value:98
},
];
ret["tdkqk"] = {title:"调代课情况", dataList:tdkqk};
let qjqkxx = [
{
key:"调休",
value:0
},
{
key:"丧假",
value:0
},
];
// let startOfWeek = moment().subtract(1, 'days').format("YYYY-MM-DD");
// let endOfWeek = moment(NowTime).format("YYYY-MM-DD");
// let jsbjrs = await getReqApiData(jshxWENUM.教师病假人数趋势, {beginDate:startOfWeek, endDate:endOfWeek});
// let qjqkxx = [];
ret["qjqkxx"] = {title:"请假情况", dataList:qjqkxx};
let hycqqk = [
{
key:"升旗仪式",
value:0
},
{
key:"代课次数",
value:0
},
];
ret["hycqqk"] = {title:"会议出勤情况", dataList:hycqqk};
let jsgzlfx = {};
let jsgzlfxData = excelData["填报学期"].dataList;
jsgzlfxData.forEach( info => {
jsgzlfx[info.value] = excelData[info.key].dataList;
})
jsgzlfx["历年满勤统计"] = excelData["历年满勤统计"].dataList;
ret["jsgzlfx"] = {title:"教师工作量分析", dataList:jsgzlfx};
let tmtkqkData = await getReqApiData(jshxNENUM.听评课情况, {type:1, sso_user_id:teacherId}, null, "data", "jsfz");
let tmtkqk = [
{
key: "校内(人次)",
value: tmtkqkData.list.dailyCourseNum
}
];
ret["tmtkqk"] = { title: "推门听课情况", dataList: tmtkqk };
let rwtpkqkData = await getReqApiData(jshxNENUM.任务听评课情况, {type:1, sso_user_id:teacherId}, null, "data", "jsfz");
// const regex = /应聘老师/;
let rwtpkqk = [];
if (rwtpkqkData) {
let xwCount = rwtpkqkData.list.data.filter(post => post.ratee.includes("应聘老师")).length;
let xwRate = ((xwCount / tmtkqkData.list.courseNum)*100).toFixed(2);
let xnCount = tmtkqkData.list.courseNum - xwCount;
let xnRate = ((xnCount / tmtkqkData.list.courseNum)*100).toFixed(2);
rwtpkqk = [
{
key: "校内(人次)",
value: xnCount,
rate: `${xnRate}%`
},
{
key: "校外(人次)",
value: xwCount,
rate: `${xwRate}%`
},
];
}
ret["rwtpkqk"] = { title: "任务听评课情况", dataList: rwtpkqk };
/**科研 */
let kyCount = { "市级课题":0, "区级课题":0, "校本课题":0, "论文论著":0 };
let kyTable = {
titleList:["教师姓名", "课题级别", "课题名称", "课题开始时间"],
dataList:[]
};
// let jyzktslData = await getReqApiData(jshxWENUM.市区校级课题, {type:1, sso_user_id:teacherId}, null, "data", "jsfz");
let kyData = await getReqApiData(jshxWENUM.市区校级课题, {type:1, sso_user_id:teacherId}, null, "data", "jsfz");
if (kyData.list) {
kyData.list.data.forEach( info => {
if (info.level == "国家级及以上") kyCount["论文论著"] += 1;
if (info.level == "省/市级") kyCount["市级课题"] += 1;
if (info.level == "区/县级") kyCount["区级课题"] += 1;
if (info.level == "校级") kyCount["校本课题"] += 1;
let kyTableData = [];
for (let key in info) {
kyTableData.push(info[key]);
}
kyTable.dataList.push(kyTableData);
})
}
let ky = [];
for (let key in kyCount) {
ky.push({key, value:kyCount[key]});
}
ret["ky"] = {title:"科研(本学期)", dataList:ky};
ret["kyxx"] = {title:"科研(本学期)表格", dataList:kyTable};
/**教研 */
let jyCount = { "市级课题":0, "区级课题":0, "校本课题":0, "论文论著":0 };
let jyTable = {
titleList:["课题名称", "课题开始时间", "教师姓名", "课题级别"],
dataList:[]
};
let jyData = await getReqApiData(jshxWENUM.市区校级课题, {type:1, sso_user_id:teacherId}, null, "data", "jsfz");
// let jyData = await getReqApiData(jshxWENUM.教研活动, {type:1}, null, "data", "jsfz");
if (jyData.list) {
jyData.list.data.forEach( info => {
if (info.level == "国家级及以上") jyCount["论文论著"] += 1;
if (info.level == "省/市级") jyCount["市级课题"] += 1;
if (info.level == "区/县级") jyCount["区级课题"] += 1;
if (info.level == "校级") jyCount["校本课题"] += 1;
let jyTableData = [];
for (let key in info) {
jyTableData.push(info[key]);
}
jyTable.dataList.push(jyTableData);
})
}
let jy = [];
for (let key in jyCount) {
jy.push({key, value:jyCount[key]});
}
ret["jy"] = {title:"科研(本学期)", dataList:ky};
ret["jyxx"] = {title:"科研(本学期)表格", dataList:jyTable};
let cycjtskc = excelData["参与创建特色课程"].dataList;
ret["cycjtskc"] = {title:"参与&创建特色课程", dataList:cycjtskc};
let cycjtskcxx = {
titleList: excelData['参与创建特色课程详细'].headerList[0],
dataList: excelData['参与创建特色课程详细'].bodyList
};
ret["cycjtskcxx"] = {title:"参与&创建特色课程表格", dataList:cycjtskcxx};
let jsyxxfhq = excelData["教师研修学分获取"].dataList;
ret["jsyxxfhq"] = {title:"教师研修学分获取", dataList:jsyxxfhq};
let jsyxxfhqxx = {
titleList: excelData['教师研修学分获取详细'].headerList[0],
dataList: excelData['教师研修学分获取详细'].bodyList
};
ret["jsyxxfhqxx"] = {title:"教师研修学分获取表格", dataList:jsyxxfhqxx};
let xfzb = excelData["学分"].dataList;
ret["xfzb"] = {title:"学分占比", dataList:xfzb};
let kczb = excelData["课程"].dataList;
ret["kczb"] = {title:"课程占比", dataList:kczb};
res.send(ret);
}
\ No newline at end of file
/**
* 教师画像(对内)
*/
import { jshxNENUM, jshxWENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import { getImagesInDir, getKeyValue, readFileList } from "../outData";
import { jyzjshxTableData, tysjyTableData } from "../../data/table/duiwai";
import { keyValuePackage, tablePackage } from "../../dataPackage/inFrontOut";
import { systemConfig } from "../../config/serverConfig";
import { jshxTableData } from "../../data/table/duinei";
import * as duiwai from "../../data/table/duiwai";
import moment = require("moment");
const ImgUrl = "img/对外/教师画像/";
export async function getData(req, res) {
let ret: any = {};
// let excelData = jshxTableData();
let excelData = jshxTableData()
let 统一excelData = tysjyTableData();
let excelDuiWaiData = duiwai.jshxTableData();
const NowTime = new Date();
// let jszyData = await getReqApiData(jshxNENUM.教师资源, {}); //todo
let jszy = [];
统一excelData["教师人员"].dataList.forEach(info => {
if (info.key == "教师人数") jszy.push(info);
});
jszy.push({
key: "教师资源达标率",
value: "-",
unit: ""
});
ret["jszy"] = { title: "教师资源", dataList: jszy };
// let nanshenData = await getReqApiData(jshxNENUM.教师男女比例, {sex:1});
// let nvshenData = await getReqApiData(jshxNENUM.教师男女比例, {sex:0});
let nanshenData = 0;
let nvshenData = 0;
excelData['男女人数'].dataList.forEach(info => {
if (info.key == "男") nanshenData = info.value;
if (info.key == "女") nvshenData = info.value;
})
let jsrs = nanshenData + nvshenData;
let nanshen = {
key: "男生人数",
value: nanshenData,
rate: ""
};
let nvshen = {
key: "女生人数",
value: nvshenData,
rate: ""
};
nanshen.rate = Math.round(nanshen.value / jsrs * 100) + "%";
nvshen.rate = Math.round(nvshen.value / jsrs * 100) + "%";
let nannvshen = [nanshen, nvshen];
ret["jszyfb"] = { title: "男生人数女生人数", dataList: nannvshen };
// let xlfbData = await getReqApiData(jshxNENUM.学历分布, {type:"education"});
// let xlfbConf = {"大学专科毕业":"大专", "大学本科毕业":"本科", "硕士研究生毕业":"硕士", "博士研究生毕业":"博士"};
// let xlfbList = {};
// xlfbData.forEach( info => {
// let count = parseInt(info.count) || 0;
// let type = info.type || "";
// for(let key in xlfbConf) {
// switch (type) {
// case key:
// xlfbList[xlfbConf[key]] = count;
// break;
// default:
// if (!xlfbList["其他"]) xlfbList["其他"] = count;
// else xlfbList["其他"] += count;
// break;
// }
// }
// });
// let xlfb = [];
// for (let key in xlfbList) {
// xlfb.push({key, value:xlfbList[key]});
// };
let xlfb = excelData["学历分布"].dataList;
ret["xlfb"] = { title: "学历分布", dataList: xlfb };
// let jlfbData = await getReqApiData(jshxNENUM.教龄分布, {type:"teachAge"});
// let jlfb = [];
// jlfbData.forEach( info => {
// let type = info.type || "";
// if(!type) type = "其他";
// jlfb.push({key:type, value:info.count});
// });
let jlfb = excelData["教龄分布"].dataList;
ret["jlfb"] = { title: "教龄分布", dataList: jlfb };
// let nlfbData = await getReqApiData(jshxNENUM.年龄分布, {type:"age"});
// let nlfb = getKeyValue(nlfbData);
let nlfb = excelData["年龄分布"].dataList;
ret["nlfb"] = { title: "年龄分布", dataList: nlfb };
// let zzmmData = await getReqApiData(jshxNENUM.教师政治面貌, {type:"political"});
// let zzmm = getKeyValue(zzmmData);
let zzmm = excelData["教师政治面貌"].dataList;
ret["zzmm"] = { title: "政治面貌", dataList: zzmm };
// let zcfbData = await getReqApiData(jshxNENUM.职称分布, {type:"title"});
// let zcfb = [];
// zcfbData.forEach( info => {
// let {type, count} = info;
// zcfb.push({key:type, value:count});
// })
// if (!zcfb.length) {
// zcfb = [
// {key:"高级", value:3},
// {key:"一级", value:7},
// {key:"二级", value:22},
// {key:"未评级", value:5},
// ]
// }
let zcfb = excelData["职称分布"].dataList;
ret["zcfb"] = { title: "职称分布", dataList: zcfb };
// let jyzdjData = await getReqApiData(jshxWENUM.教研组搭建, {}); //todo
let jyzjsConf = ["语文", "数学", "英语", "综理", "综文", "体育", "艺术"];
let jyzdj = [];
for (let i = 0; i < jyzjsConf.length; i++) {
let jyzExcelData = jyzjshxTableData(`${jyzjsConf[i]}组`);
let jszyTableData = jyzExcelData["教师资源"].dataList;
jyzdj.push({ key: jyzjsConf[i], value: jszyTableData.length })
}
ret["jyzdj"] = { title: "教研组搭建", dataList: jyzdj };
let szjg = excelData['师资结构'].dataList;
ret["szjg"] = { title: "师资结构", dataList: szjg };
let xbkc = {
titleList: excelData['校本课程'].headerList[0],
dataList: excelData['校本课程'].bodyList
};
ret["xbkc"] = { title: "校本课程", dataList: xbkc };
let tzkc = {
titleList: excelData['拓展课程'].headerList[0],
dataList: excelData['拓展课程'].bodyList
};
ret["tzkc"] = { title: "拓展课程", dataList: tzkc };
let xxkc = {
titleList: excelData['选修课程'].headerList[0],
dataList: excelData['选修课程'].bodyList
};
ret["xxkc"] = { title: "选修课程", dataList: xxkc };
// let jshjData = await getReqApiData(jshxNENUM.教师获奖, {pageNo:1, pageSize:100});
let jshjData = await getReqApiData(jshxNENUM.获奖情况, { type: 1 }, null, "data", "jsfz");
let jxtjDataList = { gjj: [], sj: [], qj: [], xj: [] };
if (jshjData) {
jshjData.list.data.forEach(info => {
//todo 对应标准发给我之后修改
if (info.level == "国家级及以上") jxtjDataList.gjj.push(info);
if (info.level == "省/市级") jxtjDataList.sj.push(info);
if (info.level == "区/县级") jxtjDataList.qj.push(info);
if (info.level == "校级") jxtjDataList.xj.push(info);
})
}
let jshj = [
{
key: "国家级奖项",
value: jxtjDataList.gjj.length || 0
},
{
key: "市级奖项",
value: jxtjDataList.sj.length || 0
},
{
key: "区级奖项",
value: jxtjDataList.qj.length || 0
},
{
key: "校级奖项",
value: jxtjDataList.xj.length || 0
},
]
ret["jshj"] = { title: "教师获奖", dataList: jshj };
let tptdImg = getImagesInDir(`img/对内/教师画像/特聘团队/`);
ret["tptd"] = { title: "特聘团队", dataList: tptdImg };
// let zjtdImg = getImagesInDir(`img/对内/教师画像/专家团队/`);
// ret["zjtd"] = {title:"专家团队", dataList:zjtdImg};
let xkdstd = keyValuePackage(excelData['学科导师团队'].dataList);
ret["xkdstd"] = { title: "学科导师团队", dataList: xkdstd };
let tdxx = keyValuePackage(excelDuiWaiData['学科导师占比'].dataList);
ret["tdxx"] = { title: "学科导师团队详细", dataList: tdxx };
let jsxfhq = keyValuePackage(excelData['教师学分获取汇总数据'].dataList);
ret["jsxfhq"] = { title: "教师学分获取", dataList: jsxfhq };
let jsxfhqxx = keyValuePackage(excelData['教师学分获取'].dataList);
ret["jsxfhqxx"] = { title: "教师学分获取详细", dataList: jsxfhqxx };
let cycjjss = keyValuePackage(excelDuiWaiData["参与创建教师数"].dataList);
ret["cycjjss"] = { title: "参与创建教师数", dataList: cycjjss };
let dxyfxhpgy = keyValuePackage(excelDuiWaiData["大学与附校互聘共育"].dataList);
ret["dxyfxhpgy"] = { title: "大学与附校互聘共育", dataList: dxyfxhpgy };
let jxkczs = [
{
key: "进修课程总数",
value: excelData['进修课程数据'].bodyList.length
}
];
ret["jxkczs"] = { title: "选修课程总数", dataList: jxkczs };
let jxkcbg = {
titleList: excelData['进修课程数据'].headerList[0],
dataList: excelData['进修课程数据'].bodyList
};
ret["jxkcbg"] = { title: "进修课程表格", dataList: jxkcbg };
let jskhdyxq = {
师德考核: [
{
key: "优秀",
value: 0
},
{
key: "合格数量",
value: 0
},
{
key: "合格教师名单",
value: "-"
},
],
年度考核: [
{
key: "优秀",
value: 0
},
{
key: "合格数量",
value: 0
},
{
key: "不合格",
value: 0
},
{
key: "基本合格",
value: 0
},
],
};
ret["jskhdyxq"] = { title: "第一学期(师德考核/年度考核)", dataList: jskhdyxq };
let jskhdexq = {
师德考核: [
{
key: "优秀",
value: 0
},
{
key: "合格数量",
value: 0
},
{
key: "合格教师名单",
value: "-"
},
],
年度考核: [
{
key: "优秀",
value: 0
},
{
key: "合格数量",
value: 0
},
{
key: "不合格",
value: 0
},
{
key: "基本合格",
value: 0
},
],
};
ret["jskhdexq"] = { title: "第二学期(师德考核/年度考核)", dataList: jskhdexq };
let ztcql = [
{
key: "整体出勤率",
value: 98,
unit: "%"
}
];
ret["ztcql"] = { title: "整体出勤率", dataList: ztcql };
let cqkhqk = [
{
key: "5.17",
value: 46
},
{
key: "5.18",
value: 17
},
{
key: "5.19",
value: 11
},
{
key: "5.20",
value: 49
},
{
key: "5.21",
value: 20
},
{
key: "5.22",
value: 31
},
{
key: "5.23",
value: 66
}
];
let startOfWeek = moment().subtract(7, 'days').format("YYYY-MM-DD HH:mm:ss");
let endOfWeek = moment(NowTime).format("YYYY-MM-DD HH:mm:ss");
let jqtcqData = await getReqApiData(jshxNENUM.获取近七天出勤人员, { startDate: startOfWeek, endDate: endOfWeek, pageNo: 1, pageSize: 100 }, "GET", "data");
//todo 接口字段没有说明
// /getTeacherReport
if (jqtcqData) {
jqtcqData.list.forEach(info => {
})
}
ret["cqkhqk"] = { title: "出勤考核情况", dataList: cqkhqk };
let qjqk = [
{
key: "请假",
value: 0,
rate: "50%"
},
{
key: "调休",
value: 0,
rate: "50%"
},
];
ret["qjqk"] = { title: "请假情况", dataList: qjqk };
// let startOfWeek = moment().subtract(7, 'days').format("YYYY-MM-DD HH:mm:ss");
// let endOfWeek = moment(NowTime).format("YYYY-MM-DD HH:mm:ss");
//todo 接口返回数据不对
let tdkqkData = await getReqApiData(jshxNENUM.教师调代课记录, { startDate: startOfWeek, endDate: endOfWeek }, "GET", "data");
let tdkqk = [
{
key: "调代课次数",
value: tdkqkData.count || 0
}
];
ret["tdkqk"] = { title: "调代课情况", dataList: tdkqk };
let qjqkxx = [
{
key: "事假",
value: 0
},
{
key: "病假",
value: 0
},
{
key: "婚假",
value: 0
},
{
key: "丧假、产假",
value: 0
},
];
ret["qjqkxx"] = { title: "请假情况", dataList: qjqkxx };
let hycqqk = [
{
key: "升旗仪式",
value: 0
},
{
key: "代课次数",
value: 0
},
];
ret["hycqqk"] = { title: "会议出勤情况", dataList: hycqqk };
let jxmyd = [
{
key: "5.17",
value: 0
},
{
key: "5.18",
value: 0
},
{
key: "5.19",
value: 0
},
{
key: "5.20",
value: 0
},
{
key: "5.21",
value: 0
},
{
key: "5.22",
value: 0
},
{
key: "5.23",
value: 0
},
];
ret["jxmyd"] = { title: "教学满意度", dataList: jxmyd };
// let njzksl1 = [
// {
// key:"5.17",
// mgzlrs:0,
// bmgzlrs:0,
// cgzlrs:0
// },
// {
// key:"5.18",
// mgzlrs:0,
// bmgzlrs:0,
// cgzlrs:0
// },
// {
// key:"5.19",
// mgzlrs:0,
// bmgzlrs:0,
// cgzlrs:0
// },
// {
// key:"5.20",
// mgzlrs:0,
// bmgzlrs:0,
// cgzlrs:0
// },
// {
// key:"5.21",
// mgzlrs:0,
// bmgzlrs:0,
// cgzlrs:0
// },
// {
// key:"5.22",
// mgzlrs:0,
// bmgzlrs:0,
// cgzlrs:0
// },
// {
// key:"5.23",
// mgzlrs:0,
// bmgzlrs:0,
// cgzlrs:0
// },
// ];
let njzksl1 = excelData["1-4年级总课时量"].dataList;
ret["njzksl1"] = { title: "1-4年级总课时量", dataList: njzksl1 };
let njzksl2 = excelData["5-9年级总课时量"].dataList;
ret["njzksl2"] = { title: "5-9年级总课时量", dataList: njzksl2 };
let njzksl3 = excelData["高中部总课时量"].dataList;
ret["njzksl3"] = { title: "高中部总课时量", dataList: njzksl3 };
let tmtkqkData = await getReqApiData(jshxNENUM.听评课情况, {type:1}, null, "data", "jsfz");
let tmtkqk = [
{
key: "校内(人次)",
value: tmtkqkData.list.dailyCourseNum
}
];
ret["tmtkqk"] = { title: "推门听课情况", dataList: tmtkqk };
let rwtpkqkData = await getReqApiData(jshxNENUM.任务听评课情况, {type:1}, null, "data", "jsfz");
// const regex = /应聘老师/;
let rwtpkqk = [];
if (rwtpkqkData) {
let xwCount = rwtpkqkData.list.data.filter(post => post.ratee.includes("应聘老师")).length;
let xwRate = ((xwCount / tmtkqkData.list.courseNum)*100).toFixed(2);
let xnCount = tmtkqkData.list.courseNum - xwCount;
let xnRate = ((xnCount / tmtkqkData.list.courseNum)*100).toFixed(2);
rwtpkqk = [
{
key: "校内(人次)",
value: xnCount,
rate: `${xnRate}%`
},
{
key: "校外(人次)",
value: xwCount,
rate: `${xwRate}%`
},
];
}
ret["rwtpkqk"] = { title: "任务听评课情况", dataList: rwtpkqk };
// let zyfzcgData = await getReqApiData(jshxWENUM.专业发展成果, {}); //todo
let zyfzcgData = await getReqApiData(jshxWENUM.专业发展成果, {type:1}, null, "data", "jsfz");
let lwfb = [
{
key:"论文论著发表",
value:zyfzcgData.list.treatiseNum || 0
}
];
ret["zyfzcg"] = { title: "论文发表", dataList: lwfb };
let lwfbImg = readFileList(`${ImgUrl}论文发表图片/`, [], "png");
ret["lwfbImg"] = {title:"论文发表图片", dataList:lwfbImg};
// let jyhj = keyValuePackage(excelData["教师获奖"].dataList);
let jyhj = [
{
key:"指导学生获奖",
value:zyfzcgData.list.studentNum || 0
},
{
key:"教学评优",
value:zyfzcgData.list.teachNum || 0
},
{
key:"课题获奖",
value:zyfzcgData.list.subjectNum || 0
},
{
key:"论文获奖",
value:zyfzcgData.list.thesisNum || 0
},
]
ret["jyhj"] = {title:"教研获奖", dataList:jyhj};
// let cyzcgjpxData = await getReqApiData(jshxWENUM.参与主持人各级培训, {}); //todo
let pxcs = [
{
key: "培训次数",
value: 0
}
];
ret["pxcs"] = { title: "培训次数", dataList: pxcs };
let cyzcgjpx = {
titleList: ["活动名称", "类型", "时间", "主持人", "参与人数"],
dataList: [
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
]
};
ret["cyzcgjpx"] = { title: "参与&主持各级培训", dataList: cyzcgjpx };
// let hdlxcyqxfxData = await getReqApiData(jshxNENUM.活动类型参与趋势分析, {}); //todo
let hdlxcyqxfx = [
{
key: "类型1",
cy: 0,
wcy: 0
},
{
key: "类型2",
cy: 0,
wcy: 0
},
{
key: "类型3",
cy: 0,
wcy: 0
},
{
key: "类型4",
cy: 0,
wcy: 0
},
{
key: "类型5",
cy: 0,
wcy: 0
},
];
ret["hdlxcyqxfx"] = { title: "活动类型参与趋势分析", dataList: hdlxcyqxfx };
res.send(ret);
}
/**
* 教学教研
* @param req year:年份
* @param res
*/
export async function getKyqk(req, res) {
let year = req.body.year;
let ret:any = {};
// let kyqkData = await getReqApiData(jshxWENUM.科研情况, {year}); //todo 参数 年份:2023
let kyqk = []
let kyqkData = await getReqApiData(jshxWENUM.参与科研情况, {type:year}, null, "data", "jsfz");
if (kyqkData) {
for (let key in kyqkData.list) {
let count = 0;
for (let info in kyqkData.list[key]) {
let {num, name} = kyqkData.list[key][info];
count += num;
};
let dataList = []
for (let info in kyqkData.list[key]) {
let {num, name} = kyqkData.list[key][info];
let rate = 0;
if (num != 0) rate = Math.round(num/count*100);
dataList.push({name, rate:`${rate}%`, value:num});
};
if (key == "openClass") {
kyqk.push({
key:"公开课",
dataList
})
} else if (key == "achievement") {
kyqk.push({
key:"成果发表",
dataList
})
} else if (key == "lecture") {
kyqk.push({
key:"讲座及报告(专家级)",
dataList
})
};
}
}
ret["kyqk"] = {title:"教学教研", dataList:kyqk};
res.send(ret);
}
/**教师画像筛选个人 */
export async function getTeacher(req, res) {
let grade = req.body.grade || ""; //【一年级:1、二年级:2、三年级:3、四年级:4】
// let className = req.body.className || "";
let sex = req.body.sex || "";
let name = req.body.name || "";
let ret: any = {};
let body = {};
if (grade) body["gradeId"] = grade;
// if(className) body["classNum"] = className;
if (sex) body["sex"] = sex;
if (name) body["studentName"] = name;
let xsgrData = await getReqApiData(jshxNENUM.获取教师信息, body); //todo
let xsgrConf = [
{
"studentId": "6abc38b8425b11ee98a202031519086a",
"studentName": "吕**",
"idNumber": null,
"studentNum": null,
"studentGnum": null,
"ethnicCode": null,
"birthday": null,
"sex": "0",
"schoolId": null,
"gradeId": "1",
"className": "一年级2班",
"classId": "63c5ee96422411eeb5e0020315204705",
"studentSort": null,
"remark": null
}
];
let xsgr = [];
if (xsgrData) xsgr = xsgrData.list;
else xsgr = xsgrConf;
ret["xsgr"] = { title: "教师筛选个人", dataList: xsgr };
res.send(ret);
}
/**教师信息筛选 */
import { jssxNENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
/**
* 各年级学科
*/
export async function getGrade(req, res) {
let grade = req.body.grade; //【一年级:1、二年级:2、三年级:3、四年级:4】
let ret:any = {};
let gradeData = await getReqApiData(jssxNENUM.各年级学科, {grade});
let gradeDefault = {
"1_98a773c4baa111edb10f020315edea6c": "唱游",
"1_469be358bbdc11ed9c69020315e0492c": "班会",
"10_jcsub21": "信息技术",
"10_jcsub22": "通用技术",
"1_9379fb60ed4b11eda5e902031571829e": "自习-数",
"10_2ec954f1fabe49389cf3cacf824b5fdd": "心理健康",
"10_jcsub03": "英语",
"10_jcsub01": "语文",
"10_jcsub02": "数学",
"10_469be358bbdc11ed9c69020315e0492c": "班会",
"1_d95c9ea8baa111eda74c020315fa13ab": "乐高",
"10_jcsub09": "思想政治",
"1_SUB53": "道德与法治",
"10_9379fb60ed4b11eda5e902031571829e": "自习-数",
"1_ce192f1eb67a11eda071020315f9fa0d": "语拓",
"1_ad9b8ac50b3e45e5b0173fba5bbe7031": "自然",
"10_SUB27": "体育",
"1_jcsub01": "语文",
"1_jcsub02": "数学",
"1_jcsub03": "英语",
"1_d37117bcbaa111eda56f020315fa13ab": "英拓",
"1_bd8c4276b67a11ed868b020315d30c23": "数拓",
"10_jcsub11": "历史",
"10_fd77ad2243fa11ee928a02031503ed64": "心理",
"10_jcsub14": "化学",
"1_dcff692c43d211eeb56102031503ed64": "口语",
"10_jcsub15": "生物",
"10_jcsub12": "地理",
"10_jcsub13": "物理",
"1_8c795ffeed4b11edb8da020315720cb2": "自习-语",
"1_85c89e72ed4b11ed8e1102031525f525": "自习-英",
"1_d490956843d211ee81d502031503ed64": "橄榄球",
"10_jcsub17": "艺术",
"1_SUB27": "体育",
"1_jcsub18": "美术",
"10_8c795ffeed4b11edb8da020315720cb2": "自习-语",
"1_f1e78c9843d211eebb81020315c9287e": "棒球",
"10_9b5fafca43e811ee9e40020315c9287e": "自习-物",
"10_85c89e72ed4b11ed8e1102031525f525": "自习-英"
};
let gradeScreen = {};
if (gradeData) gradeScreen = gradeData.list;
else gradeScreen = gradeDefault;
ret["gradeScreen"] = {title:"各年级学科", dataList:gradeScreen};
res.send(ret);
}
/**教师筛选个人 */
export async function getGradeSubjectTea(req, res) {
let grade = req.body.grade; //【一年级:1、二年级:2、三年级:3、四年级:4】
let className = req.body.className; //【学科名称:通过各年级学科接口获取对应参数值】
let name = req.body.name;
let sex = req.body.sex; //【性别:0:女、1:男】
let ret:any = {};
let body = {};
if(grade) body["gradeId"] = grade;
if(className) body["subjectName"] = className;
if(name) body["teacherNames"] = name;
if(sex) body["sex"] = sex;
let subjectTeaData = await getReqApiData(jssxNENUM.各年级学科老师, body); //todo
let gradeConf = {"1":"一年级", "2":"二年级", "3":"三年级", "4":"四年级", "5":"五年级", "6":"六年级", "7":"初一", "8":"初二", "9":"初三", "10":"高一", "11":"高二", "12":"高三"}
let subjectTea = [];
if (subjectTeaData) {
subjectTeaData.forEach( info => {
let subInfo = {
teacherUserId: info.teacherUserId,
grade: gradeConf[grade],
subjectNames: info.subjectNames,
genderName: info.genderName,
teacherName: info.teacherName,
};
subjectTea.push(subInfo);
})
}
ret["subjectTea"] = {title:"各年级学科老师", dataList:subjectTea};
res.send(ret);
}
/**
* 教研组教师画像(对内)
*/
import { jyzjshxNENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import { getKeyValue, readFileList } from "../outData";
import { jyzjshxTableData } from "../../data/table/duiwai";
import { keyValuePackage, tablePackage } from "../../dataPackage/inFrontOut";
import { systemConfig } from "../../config/serverConfig";
const ImgUrl = "img/对内/教研组教师画像/";
export async function getData(req, res) {
let subject = req.body.subject || "语文组";
let ret:any = {};
let excelData = jyzjshxTableData(subject);
let jszyTableData = excelData["教师资源"].dataList;
// let jszyData = await getReqApiData(jyzjshxNENUM.教师资源, {}); //todo
let jszy = [
{
key:"教师数",
value:jszyTableData.length,
unit:""
},
{
key:"教师资源达标率",
value:"-",
unit:""
}
];
ret["jszy"] = {title:"教师资源", dataList:jszy};
//性别
let nanshenNum = 0;
let nvshenNum = 0;
//学历
let xlData = {};
//年龄
let nlData = {"0~35岁":0, "36~40岁":0, "41~45岁":0, "46~50岁":0, "51~55岁":0, "55岁以上":0};
//政治面貌
let zzmmData = {"共青团员":0, "中共团员":0, "群众":0, "民主党派":0};
//职称分布
let zcfbData = {"高级教师":0, "中教一级":0, "中教二级":0, "未评级":0};
//教龄分布
let jlData = {"10年以上教龄":0, "6-10年教龄":0, "3-5年教龄":0, "3年以下教龄":0}
jszyTableData.forEach( info => {
let {xb, zzmm, nl, zc, xl, jl} = info;
if(xb == "女") nvshenNum += 1;
else nanshenNum += 1;
if(xl) {
if (!xlData[xl]) xlData[xl] = 1;
else xlData[xl] += 1;
}
if(nl>=0 || nl<35) nlData["0~35岁"] += 1;
else if(nl>=36 || nl<40) nlData["36~40岁"] += 1;
else if(nl>=41 || nl<45) nlData["41~45岁"] += 1;
else if(nl>=46 || nl<50) nlData["46~50岁"] += 1;
else if(nl>=51 || nl<55) nlData["51~55岁"] += 1;
else if(nl>=55) nlData["55岁以上"] += 1;
for(let key in zzmmData) {
if (key == zzmm) zzmmData[key] += 1;
}
for(let key in zcfbData) {
if (key == zc) zcfbData[key] += 1;
}
if(jl>=10) jlData["10年以上教龄"] += 1;
else if(jl>=6 || jl<10) jlData["6-10年教龄"] += 1;
else if(jl>=3 || jl<5) jlData["3-5年教龄"] += 1;
else if(jl<3) jlData["3年以下教龄"] += 1;
})
let nanshen = {
key:"男生人数",
value:nanshenNum,
rate:""
};
let nvshen = {
key:"女生人数",
value:nvshenNum,
rate:""
};
nanshen.rate = Math.round(nanshen.value/jszyTableData.length*100 ) + "%";
nvshen.rate = Math.round(nvshen.value/jszyTableData.length*100 ) + "%";
let nannvshen = [nanshen, nvshen];
ret["jszyfb"] = {title:"男生人数女生人数", dataList:nannvshen};
let xlfbData = [];
for (let key in xlData) {
xlfbData.push({type:key, count:xlData[key]});
}
let xlfbConf = {"大学专科":"大专", "大学本科":"本科", "硕士":"硕士", "硕士研究生":"研究生"};
let xlfbList = {};
xlfbData.forEach( info => {
let count = parseInt(info.count) || 0;
let type = info.type || "";
for(let key in xlfbConf) {
switch (type) {
case key:
xlfbList[xlfbConf[key]] = count;
break;
default:
if (!xlfbList["其他"]) xlfbList["其他"] = count;
else xlfbList["其他"] += count;
break;
}
}
});
let xlfb = [];
for (let key in xlfbList) {
xlfb.push({key, value:xlfbList[key]});
};
ret["xlfb"] = {title:"学历分布", dataList:xlfb};
// let jlfbData = await getReqApiData(jyzjshxNENUM.教龄分布, {type:"teachAge"});
// let jlfb = [];
// if(jlfbData) {
// jlfbData.forEach( info => {
// let type = info.type || "";
// if(!type) type = "其他";
// jlfb.push({key:type, value:info.count});
// });
// }
let jlfb = [];
for (let key in jlData) {
jlfb.push({key, value:jlData[key]});
};
ret["jlfb"] = {title:"教龄分布", dataList:jlfb};
ret["jlfb"] = {title:"教龄分布", dataList:jlfb};
let nlfbData = [];
for(let key in nlData) {
nlfbData.push({type:key, count:nlData[key]});
}
let nlfb = getKeyValue(nlfbData);
ret["nlfb"] = {title:"年龄分布", dataList:nlfb};
// let zzmmData = await getReqApiData(jyzjshxNENUM.教师政治面貌, {type:"political"});
let zzmmList = [];
for(let key in zzmmData) {
zzmmList.push({key, value:zzmmData[key]});
}
// let zzmm = getKeyValue(zzmmList);
ret["zzmm"] = {title:"政治面貌", dataList:zzmmList};
// let zcfbData = await getReqApiData(jyzjshxNENUM.职称分布, {type:title});
let zcfb = [];
for(let key in zcfbData) {
zcfb.push({key, value:zcfbData[key]});
}
if (!zcfb.length) {
zcfb = [
{key:"高级", value:3},
{key:"一级", value:7},
{key:"二级", value:22},
{key:"未评级", value:5},
]
}
ret["zcfb"] = {title:"职称分布", dataList:zcfb};
// let nanshenData = await getReqApiData(jyzjshxNENUM.教师男女比例, {sex:1});
// let nvshenData = await getReqApiData(jyzjshxNENUM.教师男女比例, {sex:0});
// let jsrs = nanshenData.length+nvshenData.length;
// let nanshen = {
// key:"男生人数",
// value:nanshenData.length,
// rate:""
// };
// let nvshen = {
// key:"女生人数",
// value:nvshenData.length,
// rate:""
// };
// nanshen.rate = Math.round(nanshen.value/jszyTableData.length*100 ) + "%";
// nvshen.rate = Math.round(nvshen.value/jszyTableData.length*100 ) + "%";
// let nannvshen = [nanshen, nvshen];
// ret["jszyfb"] = {title:"男生人数女生人数", dataList:nannvshen};
// let xlfbData = await getReqApiData(jyzjshxNENUM.学历分布, {type:"education"});
// let xlfbConf = {"大学专科毕业":"大专", "大学本科毕业":"本科", "硕士研究生毕业":"硕士", "博士研究生毕业":"博士"};
// let xlfbList = {};
// xlfbData.forEach( info => {
// let count = parseInt(info.count) || 0;
// let type = info.type || "";
// for(let key in xlfbConf) {
// switch (type) {
// case key:
// xlfbList[xlfbConf[key]] = count;
// break;
// default:
// if (!xlfbList["其他"]) xlfbList["其他"] = count;
// else xlfbList["其他"] += count;
// break;
// }
// }
// });
// let xlfb = [];
// for (let key in xlfbList) {
// xlfb.push({key, value:xlfbList[key]});
// };
// ret["xlfb"] = {title:"学历分布", dataList:xlfb};
// let jlfbData = await getReqApiData(jyzjshxNENUM.教龄分布, {type:"teachAge"});
// let jlfb = [];
// jlfbData.forEach( info => {
// let type = info.type || "";
// if(!type) type = "其他";
// jlfb.push({key:type, value:info.count});
// });
// ret["jlfb"] = {title:"教龄分布", dataList:jlfb};
// let nlfbData = await getReqApiData(jyzjshxNENUM.年龄分布, {type:"age"});
// let nlfb = getKeyValue(nlfbData);
// ret["nlfb"] = {title:"年龄分布", dataList:nlfb};
// let zzmmData = await getReqApiData(jyzjshxNENUM.教师政治面貌, {type:"political"});
// let zzmm = getKeyValue(zzmmData);
// ret["zzmm"] = {title:"政治面貌", dataList:zzmm};
// let zcfbData = await getReqApiData(jyzjshxNENUM.职称分布, {type:title});
// let zcfb = [];
// zcfbData.forEach( info => {
// let {name, value} = info;
// zcfb.push({key:name, value});
// })
// if (!zcfb.length) {
// zcfb = [
// {key:"高级", value:3},
// {key:"一级", value:7},
// {key:"二级", value:22},
// {key:"未评级", value:5},
// ]
// }
// ret["zcfb"] = {title:"职称分布", dataList:zcfb};
let ryhds = excelData["荣誉获得数"].dataList;
ret["ryhds"] = {title:"荣誉获得数", dataList:ryhds};
let zyry = {
titleList:excelData['专业荣誉详细'].headerList[0],
dataList:excelData['专业荣誉详细'].bodyList
};
ret["zyry"] = {title:"专业荣誉", dataList:zyry};
let jyztp = readFileList(`${ImgUrl}照片墙/${subject}/`, [], "png");
ret["jyztp"] = {title:"教研组教师画像", dataList:jyztp};
let jshjData = await getReqApiData(jyzjshxNENUM.获奖统计, {pageNo:1, pageSize:100});
let jshjCount = {gjj:0, sj:0, qj:0, xj:0};
if (jshjData) {
switch (jshjData.awardLevel) {
case "国家级":
jshjCount.gjj++;
break;
case "市级":
jshjCount.sj++;
break;
case "区级":
jshjCount.qj++;
break;
case "校级":
jshjCount.xj++;
break;
}
}
let jshj = [
{
key:"国家级奖项",
value:jshjCount.gjj || 6
},
{
key:"市级奖项",
value:jshjCount.sj || 35
},
{
key:"区级奖项",
value:jshjCount.qj || 114
},
{
key:"校级奖项",
value:jshjCount.xj || 0
},
]
ret["jshj"] = {title:"获奖统计", dataList:jshj};
let jsgzlfx = {
"满工作量的人数": excelData["满工作量的人数"].dataList,
"不满工作量的人数": excelData["不满工作量的人数"].dataList,
"超工作量的人数": excelData["超工作量的人数"].dataList
};
ret["jsgzlfx"] = {title:"教师工作量分析", dataList:jsgzlfx};
let tkqkData = {};
excelData["听评课情况"].dataList.forEach(info => {
tkqkData[info.key] = info.value;
})
let tkqk = [
{
key:"推门听课情况",
value:tkqkData["推门听课情况"]
},
{
key:"任务听评课情况",
xn:tkqkData["校内"],
xw:tkqkData["校外"]
}
];
ret["tkqk"] = {title:"听课情况", dataList:tkqk};
let cqkh = {
ri:{
rate:"100%",
dataList:[
{
key:"01",
value:"0"
},
{
key:"02",
value:"0"
},
{
key:"03",
value:"0"
},
{
key:"04",
value:"0"
},
{
key:"05",
value:"0"
},
{
key:"06",
value:"0"
},
{
key:"07",
value:"0"
},
],
meeting:[
{
key:"升旗仪式",
value:0
},
{
key:"教工大会",
value:0
}
]
},
zhou:{
rate:"100%",
dataList:[
{
key:"01",
value:"0"
},
{
key:"02",
value:"0"
},
{
key:"03",
value:"0"
},
{
key:"04",
value:"0"
},
{
key:"05",
value:"0"
},
{
key:"06",
value:"0"
},
{
key:"07",
value:"0"
},
],
meeting:[
{
key:"升旗仪式",
value:0
},
{
key:"教工大会",
value:0
}
]
},
yue:{
rate:"100%",
dataList:[
{
key:"01",
value:"0"
},
{
key:"02",
value:"0"
},
{
key:"03",
value:"0"
},
{
key:"04",
value:"0"
},
{
key:"05",
value:"0"
},
{
key:"06",
value:"0"
},
{
key:"07",
value:"0"
},
],
meeting:[
{
key:"升旗仪式",
value:0
},
{
key:"教工大会",
value:0
}
]
},
};
ret["cqkh"] = {title:"出勤考核", dataList:cqkh};
let qjqk = {
ri:{
baseData:[
{
key:"请假",
value:0
},
{
key:"调休",
value:0
},
],
chartData:[
{
key:"事假",
value:0
},
{
key:"病假",
value:0
},
{
key:"婚假",
value:0
},
{
key:"其他",
value:0
},
]
},
zhou:{
baseData:[
{
key:"请假",
value:0
},
{
key:"调休",
value:0
},
],
chartData:[
{
key:"事假",
value:0
},
{
key:"病假",
value:0
},
{
key:"婚假",
value:0
},
{
key:"其他",
value:0
},
]
},
yue:{
baseData:[
{
key:"请假",
value:0
},
{
key:"调休",
value:0
},
],
chartData:[
{
key:"事假",
value:0
},
{
key:"病假",
value:0
},
{
key:"婚假",
value:0
},
{
key:"其他",
value:0
},
]
},
};
ret["qjqk"] = {title:"请假情况", dataList:qjqk};
let jyhdjcsj = excelData["教研活动"].dataList;
ret["jyhdjcsj"] = {title:"教研活动", dataList:jyhdjcsj};
let jyhd = excelData["教研活动详细"].dataList;
ret["jyhd"] = {title:"教研活动详细", dataList:jyhd};
let kybxq = excelData["科研"].dataList;
ret["kybxq"] = {title:"科研(本学期)", dataList:kybxq};
let kybxqxx = {
titleList:excelData['科研详细'].headerList[0],
dataList:excelData['科研详细'].bodyList
};
ret["kybxqxx"] = {title:"科研(本学期)表格", dataList:kybxqxx};
let jybxq = excelData["教研"].dataList;
ret["jybxq"] = {title:"教研(本学期)", dataList:jybxq};
let jybxqxx = {
titleList:excelData['教研详细'].headerList[0],
dataList:excelData['教研详细'].bodyList
};
ret["jybxqxx"] = {title:"教研(本学期)表格", dataList:jybxqxx};
let cycjtskc = excelData["参与创建特色课程"].dataList;
ret["cycjtskc"] = {title:"参与&创建特色课程", dataList:cycjtskc};
let cycjtskcxx = {
titleList:excelData['参与创建特色课程详细'].headerList[0],
dataList:excelData['参与创建特色课程详细'].bodyList
};
ret["cycjtskcxx"] = {title:"参与&创建特色课程表格", dataList:cycjtskcxx};
let jsyxxfhq = excelData["学分"].dataList;
ret["jsyxxfhq"] = {title:"教师研修学分获取", dataList:jsyxxfhq};
let kcxf = excelData["教师研修学分获取"].dataList;
ret["kcxf"] = {title:"课程学分", dataList:kcxf};
let jxmydfk = excelData["教学满意度反馈"].dataList;
ret["jxmydfk"] = {title:"教学满意度反馈", dataList:jxmydfk};
let jyzjf = excelData["教研组均分"].dataList;
ret["jyzjf"] = {title:"教研组均分", dataList:jyzjf};
let gzfhdcyqk = excelData["工作坊活动参与情况"].dataList;
ret["gzfhdcyqk"] = {title:"工作坊活动参与情况", dataList:gzfhdcyqk};
res.send(ret);
}
/**
* 年级组教师画像(对内)
*/
import { njzjshxNENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import { getKeyValue, readFileList } from "../outData";
import { njzjshxTableData } from "../../data/table/duinei";
import { keyValuePackage, tablePackage } from "../../dataPackage/inFrontOut";
import { systemConfig } from "../../config/serverConfig";
const ImgUrl = "img/对内/年级组教师画像/";
const Grade = {
1:"一年级组",
2:"二年级组",
3:"三年级组",
4:"四年级组",
5:"五年级组",
6:"六年级组",
7:"七年级组",
8:"八年级组",
9:"九年级组",
10:"高中组",
}
export async function getData(req, res) {
let grade = req.body.grade;
let ret:any = {};
let excelData = njzjshxTableData(Grade[grade]);
let jszyData = excelData["教师资源"].dataList;
let jszy = [
{
key:"教师数",
value:jszyData.length,
unit:""
},
{
key:"教师资源达标率",
value:"-",
unit:""
}
];
ret["jszy"] = {title:"教师资源", dataList:jszy};
//性别
let nanshenNum = 0;
let nvshenNum = 0;
//学历
let xlData = {};
//年龄
let nlData = {"0~35岁":0, "36~40岁":0, "41~45岁":0, "46~50岁":0, "51~55岁":0, "55岁以上":0};
//政治面貌
let zzmmData = {"共青团员":0, "中共团员":0, "群众":0, "民主党派":0};
//职称分布
let zcfbData = {"高级教师":0, "中教一级":0, "中教二级":0, "未评级":0};
//教龄分布
let jlData = {"10年以上教龄":0, "6-10年教龄":0, "3-5年教龄":0, "3年以下教龄":0}
jszyData.forEach( info => {
let {njzcy, nl, xb, xl, zc, zzmm, jl} = info;
if(xb == "女") nvshenNum += 1;
else nanshenNum += 1;
if(xl) {
if (!xlData[xl]) xlData[xl] = 1;
else xlData[xl] += 1;
}
if(nl>=0 || nl<35) nlData["0~35岁"] += 1;
else if(nl>=36 || nl<40) nlData["36~40岁"] += 1;
else if(nl>=41 || nl<45) nlData["41~45岁"] += 1;
else if(nl>=46 || nl<50) nlData["46~50岁"] += 1;
else if(nl>=51 || nl<55) nlData["51~55岁"] += 1;
else if(nl>=55) nlData["55岁以上"] += 1;
for(let key in zzmmData) {
if (key == zzmm) zzmmData[key] += 1;
}
for(let key in zcfbData) {
if (key == zc) zcfbData[key] += 1;
}
if(jl>=10) jlData["10年以上教龄"] += 1;
else if(jl>=6 || jl<10) jlData["6-10年教龄"] += 1;
else if(jl>=3 || jl<5) jlData["3-5年教龄"] += 1;
else if(jl<3) jlData["3年以下教龄"] += 1;
})
let nanshen = {
key:"男生人数",
value:nanshenNum,
rate:""
};
let nvshen = {
key:"女生人数",
value:nvshenNum,
rate:""
};
if(nanshen.value) nanshen.rate = Math.round(nanshen.value/jszyData.length*100 ) + "%";
if(nvshen.value) nvshen.rate = Math.round(nvshen.value/jszyData.length*100 ) + "%";
let nannvshen = [nanshen, nvshen];
ret["jszyfb"] = {title:"男生人数女生人数", dataList:nannvshen};
// let xlfbData = await getReqApiData(njzjshxNENUM.学历分布, {type:"education"});
let xlfbData = [];
for (let key in xlData) {
xlfbData.push({type:key, count:xlData[key]});
}
let xlfbConf = {"大学专科毕业":"大专", "大学本科毕业":"本科", "硕士研究生毕业":"硕士", "博士研究生毕业":"博士"};
let xlfbList = {};
if (xlfbData) {
xlfbData.forEach( info => {
let count = parseInt(info.count) || 0;
let type = info.type || "";
for(let key in xlfbConf) {
switch (type) {
case key:
xlfbList[xlfbConf[key]] = count;
break;
default:
if (!xlfbList["其他"]) xlfbList["其他"] = count;
else xlfbList["其他"] += count;
break;
}
}
});
}
let xlfb = [];
for (let key in xlfbList) {
xlfb.push({key, value:xlfbList[key]});
};
ret["xlfb"] = {title:"学历分布", dataList:xlfb};
// let jlfbData = await getReqApiData(njzjshxNENUM.教龄分布, {type:"teachAge"});
// let jlfb = [];
// if(jlfbData) {
// jlfbData.forEach( info => {
// let type = info.type || "";
// if(!type) type = "其他";
// jlfb.push({key:type, value:info.count});
// });
// };
let jlfb = [];
for (let key in jlData) {
jlfb.push({key, value:jlData[key]});
};
ret["jlfb"] = {title:"教龄分布", dataList:jlfb};
let nlfbData = [];
for(let key in nlData) {
nlfbData.push({type:key, count:nlData[key]});
}
let nlfb = getKeyValue(nlfbData);
ret["nlfb"] = {title:"年龄分布", dataList:nlfb};
let zzmmList = [];
for(let key in zzmmData) {
zzmmList.push({key, value:zzmmData[key]});
}
ret["zzmm"] = {title:"政治面貌", dataList:zzmmList};
// let zcfbData = await getReqApiData(njzjshxNENUM.职称分布, {type:title});
let zcfb = [];
for(let key in zcfbData) {
zcfb.push({key, value:zcfbData[key]});
}
ret["zcfb"] = {title:"职称分布", dataList:zcfb};
let njznds = [
{
key:"导师数量",
value:0
}
];
ret["dssl"] = {title:"年级组内导师", dataList:njznds};
let yxbzrds = {
titleList:excelData['优秀班主任导师'].headerList[0],
dataList:excelData['优秀班主任导师'].bodyList
};
ret["yxbzrds"] = {title:"优秀班主任导师", dataList:yxbzrds};
let xkdszb = excelData["学科导师占比"].dataList;
ret["xkdszb"] = {title:"学科导师占比", dataList:xkdszb};
let xkjcsj = excelData["学科导师占比"].dataList;
ret["xkjcsj"] = {title:"学科基础数据", dataList:xkjcsj};
let njjsImg = readFileList(`${ImgUrl}${grade}/`, [], "png");
ret["njjsImg"] = {title:"年级组教师画像", dataList:njjsImg};
let jxtjData = await getReqApiData(njzjshxNENUM.获奖统计, {type:1}, null, "data", "jsfz");
// let jxtjCount = {gjj:0, sj:0, qj:0, xj:0};
let jxtjDataList = {gjj:[], sj:[], qj:[], xj:[]};
if (jxtjData) {
jxtjData.list.data.forEach( info => {
//todo 对应标准发给我之后修改
if (info.level == "国家级及以上") jxtjDataList.gjj.push(info);
if (info.level == "省/市级") jxtjDataList.sj.push(info);
if (info.level == "区/县级") jxtjDataList.qj.push(info);
if (info.level == "校级") jxtjDataList.xj.push(info);
})
}
let jxtj = [
{
key:"国家级奖项",
value:jxtjDataList.gjj.length || 0
},
{
key:"市级奖项",
value:jxtjDataList.sj.length || 0
},
{
key:"区级奖项",
value:jxtjDataList.qj.length || 0
},
{
key:"校级奖项",
value:jxtjDataList.xj.length || 0
},
]
ret["jshj"] = {title:"获奖统计", dataList:jxtj};
let jsgzlfx = {
满工作量的人数:excelData['满工作量的人数'].dataList,
不满工作量的人数:excelData['不满工作量的人数'].dataList,
超工作量的人数:excelData['超工作量的人数'].dataList,
};
ret["jsgzlfx"] = {title:"教师工作量分析", dataList:jsgzlfx};
let tkqkData = {};
excelData["听评课情况"].dataList.forEach(info => {
tkqkData[info.key] = info.value;
})
let tkqk = [
{
key:"推门听课情况",
value:tkqkData["推门听课情况"]
},
{
key:"任务听评课情况",
xn:tkqkData["校内"],
xw:tkqkData["校外"]
}
];
ret["tkqk"] = {title:"听课情况", dataList:tkqk};
let cqkh = {
ri:{
rate: excelData["整体出勤率-日"].dataList[0].value,
dataList: excelData["出勤考核-日"].dataList,
meeting: excelData["会议出勤情况-日"].dataList
},
zhou:{
rate: excelData["整体出勤率-周"].dataList[0].value,
dataList: excelData["出勤考核-周"].dataList,
meeting:excelData["会议出勤情况-周"].dataList
},
yue:{
rate: excelData["整体出勤率-月"].dataList[0].value,
dataList: excelData["出勤考核-月"].dataList,
meeting: excelData["会议出勤情况-月"].dataList
},
};
ret["cqkh"] = {title:"出勤考核", dataList:cqkh};
let qjqk = {
ri:{
baseData: excelData["请假情况-日"].dataList,
chartData: excelData["请假原因占比分析-日"].dataList
},
zhou:{
baseData: excelData["请假情况-周"].dataList,
chartData: excelData["请假原因占比分析-周"].dataList
},
yue:{
baseData: excelData["请假情况-月"].dataList,
chartData: excelData["请假原因占比分析-月"].dataList
},
};
ret["qjqk"] = {title:"请假情况", dataList:qjqk};
let jyhdjcsj = excelData["教研活动"].dataList;
ret["jyhdjcsj"] = {title:"教研活动", dataList:jyhdjcsj};
let jyhd = excelData["教研活动详细"].dataList;
ret["jyhd"] = {title:"教研活动详细", dataList:jyhd};
let ktcycs = excelData['课题参与次数'].dataList;
ret["ktcycs"] = {title:"课题参与次数", dataList:ktcycs};
let ktcy = {
titleList:excelData['课题参与'].headerList[0],
dataList:excelData['课题参与'].bodyList
};
ret["ktcy"] = {title:"课题参与", dataList:ktcy};
let gkkcycs = excelData['公开课参与次数'].dataList;
ret["gkkcycs"] = {title:"公开课参与次数", dataList:gkkcycs};
let gkkcy = {
titleList:excelData['公开课参与'].headerList[0],
dataList:excelData['公开课参与'].bodyList
};
ret["gkkcy"] = {title:"公开课参与", dataList:gkkcy};
let jsjxpxqk = excelData['教师进修培训情况'].dataList;
ret["jsjxpxqk"] = {title:"教师进修培训情况", dataList:jsjxpxqk};
let glscycs = {
大学听课: excelData['大学听课'].dataList,
名师工作室: excelData['名师工作室'].dataList,
基地学习: excelData['基地学习'].dataList,
校本研修: excelData['校本研修'].dataList
};
ret["glscycs"] = {title:"各老师参与次数", dataList:glscycs};
let jxsl = excelData['奖项数量'].dataList;
ret["jxsl"] = {title:"奖项数量", dataList:jxsl};
let jxbscyqk = excelData['教学比赛参与情况'].dataList;
ret["jxbscyqk"] = {title:"教学比赛参与情况", dataList:jxbscyqk};
let bsxxlb = excelData['教学比赛参与情况详细'].bodyList;
ret["bsxxlb"] = {title:"教学比赛参与情况详情", dataList:bsxxlb};
let jxmydfk = {
一至四: excelData['教学满意度反馈一至四'].dataList,
五至九: excelData['教学满意度反馈五至九'].dataList,
高中: excelData['教学满意度反馈高中'].dataList,
};
ret["jxmydfk"] = {title:"教学满意度反馈", dataList:jxmydfk};
let hdcyqk = excelData['工作坊活动参与情况'].dataList;
ret["hdcyqk"] = {title:"工作坊活动参与情况", dataList:hdcyqk};
res.send(ret);
}
\ No newline at end of file
/**
* 教师画像(对内)-身心健康
*/
import { xshxNENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import { getKeyValue, readFileList } from "../outData";
import { jshxTableData } from "../../data/table/duiwai";
import { keyValuePackage, tablePackage } from "../../dataPackage/inFrontOut";
import { systemConfig } from "../../config/serverConfig";
const ImgUrl = "img/对内/学生画像/身心健康/";
/**体质监测 */
export async function getTzjc(req, res) {
let grade = req.body.grade || 1; //【一年级:1、二年级:2、三年级:3、四年级:4】
let className = req.body.className || "一班";
let ret:any = {};
let tzjc = [
{
key:"优良率",
value:0
},
{
key:"合格率",
value:0
}
];
ret["tzjc"] = {title:"体质监测", dataList:tzjc};
let BMIqs = {
正常:[
{
key:"2023",
value:80
},
{
key:"2024",
value:30
},
],
偏低:[
{
key:"2023",
value:86
},
{
key:"2024",
value:12
},
],
偏高:[
{
key:"2023",
value:30
},
{
key:"2024",
value:11
},
],
};
ret["BMIqs"] = {title:"BMI趋势", dataList:BMIqs};
let jcsj = [
{
key:"视力异常人数",
value:0
},
{
key:"体型异常(超重,肥胖)",
value:0
},
{
key:"龋齿人数",
value:0
},
{
key:"视力异常人数",
value:0
},
];
ret["jcsj"] = {title:"基础数据", dataList:jcsj};
let tytz = [
{
key:"总人数",
value:0
}
];
ret["tytz"] = {title:"特异体质", dataList:tytz};
let tytzxx = {
titleList:["姓名", "学号", "异常项"],
dataList:[
["-", "-", "-"],
["-", "-", "-"],
["-", "-", "-"],
["-", "-", "-"],
["-", "-", "-"],
]
};
ret["tytzxx"] = {title:"特异体质表格", dataList:tytzxx};
let gmda = [
{
key:"鸡蛋",
value:0
},
{
key:"牛奶",
value:0
},
{
key:"山药",
value:0
},
{
key:"咖喱",
value:0
},
{
key:"虾",
value:0
},
];
ret["gmda"] = {title:"过敏档案", dataList:gmda};
res.send(ret);
}
/**学生出勤情况 */
export async function getXscqqk(req, res) {
let grade = req.body.grade || 1; //【一年级:1、二年级:2、三年级:3、四年级:4】
let className = req.body.className || "一班";
let ret:any = {};
let jcsj = [
{
key:"学生总数",
value:21
},
{
key:"请假人数",
value:2
}
];
ret["jcsj"] = {title:"基础数据", dataList:jcsj};
let qjlb = {
titleList:["姓名", "体温", "请假原因", "请假时长"],
dataList:[
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
]
};
ret["qjlb"] = {title:"请假列表", dataList:qjlb};
let qjyyfx = [
{
key:"病假",
value:20
},
{
key:"事假",
value:10
},
{
key:"其他",
value:60
},
];
ret["qjyyfl"] = {title:"请假原因分析", dataList:qjyyfx};
let bjxszztjqk = {
2023:[
{
key:"感冒",
value:81
},
{
key:"发热",
value:83
},
{
key:"腹泻",
value:71
},
{
key:"呕吐",
value:76
},
{
key:"咳嗽",
value:60
},
{
key:"头疼",
value:81
},
{
key:"黄疸",
value:80
}
],
2024:[
{
key:"感冒",
value:71
},
{
key:"发热",
value:60
},
{
key:"腹泻",
value:77
},
{
key:"呕吐",
value:73
},
{
key:"咳嗽",
value:86
},
{
key:"头疼",
value:82
},
{
key:"黄疸",
value:81
}
]
};
ret["bjxszztjqk"] = {title:"病假学生症状统计情况", dataList:bjxszztjqk};
let lntsqdbqsfx = {
2023:[
{
key:"感冒",
value:81
},
{
key:"发热",
value:83
},
{
key:"腹泻",
value:71
},
{
key:"呕吐",
value:76
},
{
key:"咳嗽",
value:60
},
{
key:"头疼",
value:81
},
{
key:"黄疸",
value:80
}
],
2024:[
{
key:"感冒",
value:71
},
{
key:"发热",
value:60
},
{
key:"腹泻",
value:77
},
{
key:"呕吐",
value:73
},
{
key:"咳嗽",
value:86
},
{
key:"头疼",
value:82
},
{
key:"黄疸",
value:81
}
]
};
ret["lntsqdbqsfx"] = {title:"历年同时期对比趋势分析", dataList:lntsqdbqsfx};
res.send(ret);
}
/**体质测试情况 */
export async function getTzcsqk(req, res) {
let grade = req.body.grade || 1; //【一年级:1、二年级:2、三年级:3、四年级:4】
let className = req.body.className || "一班";
let ret:any = {};
let jcsj = [
{
key:"优良率",
value:0
},
{
key:"合格率",
value:0
},
];
ret["jcsj"] = {title:"基础数据", dataList:jcsj};
let tzcsqk = [
{
key:"肺活量",
yll:0,
hgl:55
},
{
key:"50米跑",
yll:35,
hgl:55
},
{
key:"坐位体前屈",
yll:50,
hgl:50
},
{
key:"立定跳远",
yll:0,
hgl:0
},
{
key:"一分钟跳绳",
yll:45,
hgl:55
},
{
key:"一分钟仰卧起坐",
yll:55,
hgl:45
},
];
ret["tzcsqk"] = {title:"体质测试情况", dataList:tzcsqk};
let tytc = [
{
key:"篮球",
value:0,
data:[
{
name:"王XX",
skill:"唢呐"
},
{
name:"王XX",
skill:"钢琴"
}
]
},
{
key:"羽毛球",
value:0,
data:[
{
name:"王XX",
skill:"唢呐"
},
{
name:"王XX",
skill:"钢琴"
}
]
},
{
key:"长跑",
value:0,
data:[
{
name:"王XX",
skill:"唢呐"
},
{
name:"王XX",
skill:"钢琴"
}
]
},
{
key:"乒乓球",
value:0,
data:[
{
name:"王XX",
skill:"唢呐"
},
{
name:"王XX",
skill:"钢琴"
}
]
},
{
key:"足球",
value:0,
data:[
{
name:"王XX",
skill:"唢呐"
},
{
name:"王XX",
skill:"钢琴"
}
]
}
];
ret["tytc"] = {title:"体育特长", dataList:tytc};
let ystc = [
{
key:"唱歌",
value:0,
data:[
{
name:"王XX",
skill:"唢呐"
},
{
name:"王XX",
skill:"钢琴"
}
]
},
{
key:"跳舞",
value:0,
data:[
{
name:"王XX",
skill:"唢呐"
},
{
name:"王XX",
skill:"钢琴"
}
]
},
{
key:"绘画",
value:0,
data:[
{
name:"王XX",
skill:"唢呐"
},
{
name:"王XX",
skill:"钢琴"
}
]
},
{
key:"书法",
value:0,
data:[
{
name:"王XX",
skill:"唢呐"
},
{
name:"王XX",
skill:"钢琴"
}
]
},
{
key:"戏剧",
value:0,
data:[
{
name:"王XX",
skill:"唢呐"
},
{
name:"王XX",
skill:"钢琴"
}
]
}
];
ret["ystc"] = {title:"艺术特长", dataList:ystc};
res.send(ret);
}
/**
* 学生画像年级(对内)
*/
import { xshxNENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import { getKeyValue, readFileList } from "../outData";
import { jshxTableData } from "../../data/table/duiwai";
import { keyValuePackage, tablePackage } from "../../dataPackage/inFrontOut";
import { systemConfig } from "../../config/serverConfig";
import { xshxnjzTableData } from "../../data/table/duinei";
const ImgUrl = `img/对内/学生画像/`;
const Grade = {
1:"一年级组",
2:"二年级组",
3:"三年级组",
4:"四年级组",
5:"五年级组",
6:"六年级组",
7:"七年级组",
8:"八年级组",
9:"九年级组",
10:"高一年级组",
11:"高二年级组",
12:"高三年级组",
}
const GradeChange = {
1:"一年级",
2:"二年级",
3:"三年级",
4:"四年级",
5:"五年级",
6:"六年级",
7:"七年级",
8:"八年级",
9:"九年级",
10:"高一",
11:"高二",
12:"高三",
}
export async function getData(req, res) {
let grade = req.body.grade || 1; //【一年级:1、二年级:2、三年级:3、四年级:4】
let ret:any = {};
let excelData = xshxnjzTableData(Grade[grade]);
let tzjcData = await getReqApiData(xshxNENUM.体质监测各年级合格率优良率, {gradeId:grade});
let tzjc = [
{
key:"优良率",
value:parseInt(tzjcData.gradeFine[GradeChange[grade]])
},
{
key:"合格率",
value:parseInt(tzjcData.gradePass[GradeChange[grade]])
},
];
ret["tzjc"] = {title:"体质监测", dataList:tzjc};
// let BMIData = await getReqApiData(xshxNENUM.查询各年级BMI, {gradeId:grade});
let BMIbjData = await getReqApiData(xshxNENUM.查询各班级BMI, {gradeId:grade});
let njtzjc = {};
BMIbjData.forEach( info => {
let {code, name, value} = info;
if (!njtzjc[code]) njtzjc[code] = [];
njtzjc[code].push({key:name, value})
})
let njtzjcInfo = {};
for(let key in njtzjc) {
let after = key.slice(-2);
njtzjcInfo[after] = njtzjc[key];
}
ret["tzjcqs"] = {title:"体质检测趋势", dataList:njtzjcInfo};
let sljc = [];
let sljcnjData = await getReqApiData(xshxNENUM.查询各年级视力不良率, {});
sljcnjData.forEach( info => {
let {code, name, value} = info;
sljc.push({key:name, value});
})
ret["sljc"] = {title:"视力监测", dataList:sljc};
let sljcData = await getReqApiData(xshxNENUM.查询年级各班级视力不良率, {gradeId:grade});
let sljcqs = [];
sljcData.forEach( info => {
let {code, name, value} = info;
sljcqs.push({key:name, value});
})
// let sljcqs = {
// 左眼:[
// {
// key:"一班",
// value:0
// },
// {
// key:"二班",
// value:0
// },
// {
// key:"三班",
// value:0
// },
// {
// key:"四班",
// value:0
// },
// ],
// 右眼:[
// {
// key:"一班",
// value:0
// },
// {
// key:"二班",
// value:0
// },
// {
// key:"三班",
// value:0
// },
// {
// key:"四班",
// value:0
// },
// ],
// };
ret["sljcqs"] = {title:"视力检测趋势", dataList:sljcqs};
/**社会实践活动情况 */
// let shsjhdqkData = await getReqApiData(xshxNENUM.社会实践活动情况, {grade}); //todo
let shsjhdqkData = excelData["品德发展与公民素养"].dataList;
// [
// {
// name:"社会考察",
// wcks:8,
// zks:8
// },
// {
// name:"公益劳动",
// wcks:2,
// zks:2
// },
// {
// name:"职业体验",
// wcks:2,
// zks:2
// },
// {
// name:"安全实训",
// wcks:0,
// zks:0
// },
// ];
let shsjhdqk = [];
shsjhdqkData.forEach( info => {
let {name, wcks, zks} = info;
shsjhdqk.push({name, wcks:parseInt(wcks), zks:parseInt(zks)});
})
ret["shsjhdqk"] = {title:"社会实践活动情况", dataList:shsjhdqk};
/**团队德育活动 */
// let cyksData = await getReqApiData(xshxNENUM.团队德育活动, {grade}) //todo
let cyks = [
{
key:"参与课时",
value:6
}
];
ret["cyks"] = {title:"参与课时", dataList:cyks};
// let tddyhdData = await getReqApiData(xshxNENUM.团队德育活动, {grade}) //todo
let tddyhd = [
{
key:"仪式活动",
value:6
},
{
key:"主题教育",
value:11
}
];
ret["tddyhd"] = {title:"团队德育活动", dataList:tddyhd};
/**综合评价(统计等第) */
// let zhpjData = await getReqApiData(xshxNENUM.综合统计, {grade}) //todo
let zhpj = excelData["综合评价"].dataList;
ret["zhpj"] = {title:"综合评价", dataList:zhpj};
let xykcyxycj = {
优秀: excelData["修业课程与学业成绩-优秀"].dataList,
良好: excelData["修业课程与学业成绩-良好"].dataList,
合格: excelData["修业课程与学业成绩-合格"].dataList,
};
ret["xykcyxycj"] = {title:"修业课程与学业成绩", dataList:xykcyxycj};
let xsbjrsData = await getReqApiData(xshxNENUM.获取班级数学生数, {});
let bjsl = xsbjrsData.classNum;
let xsrsData = xsbjrsData.studentNum;
let xsrs = 0;
xsrsData.forEach( info=> {
let {code, name, value} = info;
xsrs += value;
})
let jcsj = [
{
key:"总学生数",
value:xsrs
},
{
key:"班级数",
value:parseInt(bjsl.classNum)
}
];
ret["jcsj"] = {title:"基础数据", dataList:jcsj};
let bjwcl = [
{
key:"1班",
value:20,
rate:86
},
{
key:"2班",
value:20,
rate:86
},
{
key:"3班",
value:20,
rate:86
},
{
key:"4班",
value:20,
rate:86
},
];
ret["bjwcl"] = {title:"班级完成率", dataList:bjwcl};
let jgyzhwcl = [
{
key:"九个一综合完成率",
value:0
}
];
ret["jgyzhwcl"] = {title:"九个一综合完成率", dataList:jgyzhwcl};
// let jgyxxwcqk = [
// {
// key:"阅读一本经典书籍",
// value:32,
// rate:40
// },
// {
// key:"参观一个科技场馆",
// value:14,
// rate:17.5
// },
// {
// key:"完成一个课题研究",
// value:34,
// rate:42.5
// },
// {
// key:"举办一场读书报告",
// value:31,
// rate:38.75
// },
// {
// key:"进行一次公开演讲",
// value:0,
// rate:0
// },
// {
// key:"拥有一项运动爱好",
// value:11,
// rate:13.75
// },
// {
// key:"参加一次公开表演",
// value:15,
// rate:18.75
// },
// {
// key:"参加一次社区服务",
// value:22,
// rate:27.5
// },
// {
// key:"掌握一门乐器演奏",
// value:33,
// rate:41.25
// }
// ];
let xsczData = await getReqApiData(xshxNENUM.学生九个一完成情况, {type:"grade", gradeId:grade});
let jgyxxwcqk = [];
let stuCount = 0;
for (let key in xsczData.grade) {
stuCount += parseInt(xsczData.grade[key]);
}
let rate = 0;
for (let key in xsczData.grade) {
if (stuCount || xsrs) rate = Math.round(stuCount / xsrs) || 0;
jgyxxwcqk.push({key, value:parseInt(xsczData.grade[key]), rate});
}
ret["jgyxxwcqk"] = {title:"九个一详细完成情况", dataList:jgyxxwcqk};
let njtshd = {
titleList:["活动种类", "活动名称", "时间", "地点", "参与人数"],
dataList:[
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
]
};
ret["njtshd"] = {title:"年级特色活动", dataList:njtshd};
let hdly = readFileList(`${ImgUrl}活动掠影/`, [], "png");
ret["hdly"] = {title:"活动掠影", dataList:hdly};
// let yjxy = [
// {
// key:"莫熙湖",
// value:`${ImgUrl}预警/学业/`
// },
// {
// key:"杨均文",
// value:`${ImgUrl}预警/学业/`
// },
// ];
// ret["yjxy"] = {title:"预警-学业", dataList:yjxy};
let yjcq = [
{
key:"请假人数",
value:3
},
{
key:"请假天数",
value:4
}
];
ret["yjcq"] = {title:"预警-出勤", dataList:yjcq};
let yjcqxx = [
{
key:"莫熙湖",
class:"六年级(2)班",
value:"病假",
time:"2024.04.22第六节~2024.04.22第十节",
img:`${systemConfig.ipUrl}对内/学生画像/预警/出勤/莫熙湖.png`
},
{
key:"杨均文",
class:"六年级(4)班",
value:"事假",
time:"2024.04.19第六节~2024.04.19第十节",
img:`${systemConfig.ipUrl}对内/学生画像/预警/出勤/杨均文.png`
},
];
ret["yjcqxx"] = {title:"预警-出勤详细", dataList:yjcqxx};
// let yjxw = [];
// ret["yjxw"] = {title:"预警-行为", dataList:yjxw};
// let yjqt = [];
// ret["yjqt"] = {title:"预警-其他", dataList:yjqt};
let cxjsysjnl = excelData["创新精神与实践能力"].dataList;
ret["cxjsysjnl"] = {title:"创新精神与实践能力", dataList:cxjsysjnl};
let kjsyJcsj = excelData["科技素养-基础数据"].dataList;
ret["kjsyJcsj"] = {title:"科技素养-基础数据", dataList:kjsyJcsj};
let kjsyNjktlb = excelData["科技素养-年级课题列表明细"].dataList;
ret["kjsyNjktlb"] = {title:"科技素养-年级课题列表明细", dataList:kjsyNjktlb};
let kjsyNjktlbmx = {
titleList: excelData['科技素养-年级课题列表明细表格'].headerList[0],
dataList: excelData['科技素养-年级课题列表明细表格'].bodyList
};
ret["kjsyNjktlbmx"] = {title:"科技素养-年级课题列表明细表格", dataList:kjsyNjktlbmx};
let kjsyGbjcxqk = excelData["科技素养-各班级创新情况"].dataList;
ret["kjsyGbjcxqk"] = {title:"科技素养-各班级创新情况", dataList:kjsyGbjcxqk};
let rwsyJcsj = excelData["人文素养-基础数据"].dataList;
ret["rwsyJcsj"] = {title:"人文素养-基础数据", dataList:rwsyJcsj};
let rwsyNjktlb = excelData["人文素养-年级课题列表明细"].dataList;
ret["rwsyNjktlb"] = {title:"人文素养-年级课题列表明细", dataList:rwsyNjktlb};
let rwsyNjktlbmx = {
titleList: excelData['人文素养-年级课题列表明细表格'].headerList[0],
dataList: excelData['人文素养-年级课题列表明细表格'].bodyList
};
ret["rwsyNjktlbmx"] = {title:"人文素养-年级课题列表明细表格", dataList:rwsyNjktlbmx};
let rwsyGbjcxqk = excelData["人文素养-各班级创新情况"].dataList;
ret["rwsyGbjcxqk"] = {title:"人文素养-各班级创新情况", dataList:rwsyGbjcxqk};
let yssyJcsj = excelData["艺术素养-基础数据"].dataList;
ret["yssyJcsj"] = {title:"艺术素养-基础数据", dataList:yssyJcsj};
let yssyNjktlb = excelData["艺术素养-年级课题列表明细"].dataList;
ret["yssyNjktlb"] = {title:"艺术素养-年级课题列表明细", dataList:yssyNjktlb};
let yssyNjktlbmx = {
titleList: excelData['艺术素养-年级课题列表明细表格'].headerList[0],
dataList: excelData['艺术素养-年级课题列表明细表格'].bodyList
};
ret["yssyNjktlbmx"] = {title:"艺术素养-年级课题列表明细表格", dataList:yssyNjktlbmx};
let yssyGbjcxqk = excelData["艺术素养-各班级创新情况"].dataList;
ret["yssyGnjcxqk"] = {title:"艺术素养-各班级创新情况", dataList:yssyGbjcxqk};
let jksyJcsj = excelData["健康素养-基础数据"].dataList;
ret["jksyJcsj"] = {title:"健康素养-基础数据", dataList:jksyJcsj};
let jksyNjktlb = excelData["健康素养-年级课题列表明细"].dataList;
ret["jksyNjktlb"] = {title:"健康素养-年级课题列表明细", dataList:jksyNjktlb};
let jksyNjktlbmx = {
titleList: excelData['健康素养-年级课题列表明细表格'].headerList[0],
dataList: excelData['健康素养-年级课题列表明细表格'].bodyList
};
ret["jksyNjktlbmx"] = {title:"健康素养-年级课题列表明细表格", dataList:jksyNjktlbmx};
let jksyGbjcxqk = excelData["健康素养-各班级创新情况"].dataList;
ret["jksyGbjcxqk"] = {title:"健康素养-各班级创新情况", dataList:jksyGbjcxqk};
let gjglhd = excelData["各级各类活动"].dataList;
ret["gjglhd"] = {title:"各级各类活动", dataList:gjglhd};
let gjglhdxx = {
科技素养:{
titleList: excelData['各级各类活动-科技素养'].headerList[0],
dataList: excelData['各级各类活动-科技素养'].bodyList
},
人文素养:{
titleList: excelData['各级各类活动-人才素养'].headerList[0],
dataList: excelData['各级各类活动-人才素养'].bodyList
},
艺术素养:{
titleList: excelData['各级各类活动-艺术素养'].headerList[0],
dataList: excelData['各级各类活动-艺术素养'].bodyList
},
健康素养:{
titleList: excelData['各级各类活动-健康素养'].headerList[0],
dataList: excelData['各级各类活动-健康素养'].bodyList
},
};
ret["gjglhdxx"] = {title:"各级各类活动详细", dataList:gjglhdxx};
// let hjcgzsData = await getReqApiData(xshxNENUM.获奖成果展示, {}); //todo
// let hjcgzs = [
// {
// img:`${systemConfig.ipUrl}对内/学生画像/获奖成果展示/1.png`,
// name:"荣誉奖项图"
// },
// {
// img:`${systemConfig.ipUrl}对内/学生画像/获奖成果展示/2.png`,
// name:"荣誉奖项图"
// },
// {
// img:`${systemConfig.ipUrl}对内/学生画像/获奖成果展示/3.png`,
// name:"荣誉奖项图"
// },
// {
// img:`${systemConfig.ipUrl}对内/学生画像/获奖成果展示/4.png`,
// name:"荣誉奖项图"
// },
// {
// img:`${systemConfig.ipUrl}对内/学生画像/获奖成果展示/5.png`,
// name:"荣誉奖项图"
// }
// ]
// ret["hjcgzs"] = {title:"获奖成果展示", dataList:hjcgzs};
let hjcgzsData = excelData["获奖成果展示"].dataList;
let hjcgzs = [];
hjcgzsData.forEach( info => {
let {key, value} = info;
hjcgzs.push({img:`${systemConfig.ipUrl}对外/学生画像/获奖成果展示/${key}`, name:value});
});
ret["hjcgzs"] = {title:"获奖成果展示", dataList:hjcgzs};
res.send(ret);
}
/**学生画像筛选个人 */
export async function getStudent(req, res) {
let grade = req.body.grade; //【一年级:1、二年级:2、三年级:3、四年级:4】
let className = req.body.className;
let name = req.body.name;
let ret:any = {};
let body = {};
if(grade) body["gradeId"] = grade;
if(className) body["classNum"] = className;
if(name) body["studentName"] = name;
let xsgrData = await getReqApiData(xshxNENUM.获取学生信息, body); //todo
let xsgrConf = [
{
"studentId": "6abc38b8425b11ee98a202031519086a",
"studentName": "吕**",
"idNumber": null,
"studentNum": null,
"studentGnum": null,
"ethnicCode": null,
"birthday": null,
"sex": "0",
"schoolId": null,
"gradeId": "1",
"className": "一年级2班",
"classId": "63c5ee96422411eeb5e0020315204705",
"studentSort": null,
"remark": null
}
];
let xsgr = [];
if (xsgrData) xsgr = xsgrData;
else xsgr = xsgrConf;
ret["xsgr"] = {title:"学生筛选个人", dataList:xsgr};
res.send(ret);
}
/**
* 教师画像(对内)-学业水平
*/
import { title } from "process";
import { xshxNENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import { getKeyValue, readFileList } from "../outData";
import { jshxTableData } from "../../data/table/duiwai";
import { keyValuePackage, tablePackage } from "../../dataPackage/inFrontOut";
import { systemConfig } from "../../config/serverConfig";
const ImgUrl = "img/对内/学生画像/学业水平/";
/**各学科成绩分析 */
export async function getGxkcjfx(req, res) {
let grade = req.body.grade || 1; //【一年级:1、二年级:2、三年级:3、四年级:4】
let className = req.body.className || "一班";
let score = req.body.className || "A";
let ret:any = {};
let zhpjf = [
{
key:"综合平均分",
value:0,
unit:"分"
}
];
ret["zhpjf"] = {title:"综合平均分", dataList:zhpjf};
let gxkcjfx = {
班级:[
{
key:"语文",
value:30
},
{
key:"数学",
value:57
},
{
key:"英语",
value:41
},
{
key:"品德",
value:37
},
{
key:"体育",
value:24
},
{
key:"音乐",
value:30
},
],
年级:[
{
key:"语文",
value:30
},
{
key:"数学",
value:57
},
{
key:"英语",
value:41
},
{
key:"品德",
value:37
},
{
key:"体育",
value:24
},
{
key:"音乐",
value:30
},
],
平均:[
{
key:"语文",
value:30
},
{
key:"数学",
value:57
},
{
key:"英语",
value:41
},
{
key:"品德",
value:37
},
{
key:"体育",
value:24
},
{
key:"音乐",
value:30
},
]
};
ret["gxkcjfx"] = {title:"各学科成绩分析", dataList:gxkcjfx};
res.send(ret);
}
/**本学期学科变化趋势 */
export async function getBxqxkbhqs(req, res) {
let grade = req.body.grade || 1; //【一年级:1、二年级:2、三年级:3、四年级:4】
let className = req.body.className || "一班";
let score = req.body.className || "A";
let ret:any = {};
let bxqxkbhqs = {
期中:[
{
key:"语文",
value:30
},
{
key:"数学",
value:57
},
{
key:"英语",
value:41
},
{
key:"品德",
value:37
},
{
key:"体育",
value:24
},
{
key:"音乐",
value:30
},
],
期末:[
{
key:"语文",
value:30
},
{
key:"数学",
value:57
},
{
key:"英语",
value:41
},
{
key:"品德",
value:37
},
{
key:"体育",
value:24
},
{
key:"音乐",
value:30
},
]
};
ret["bxqxkbhqs"] = {title:"本学期学科变化趋势", dataList:bxqxkbhqs};
res.send(ret);
}
/**整体数据 */
export async function getData(req, res) {
let grade = req.body.grade || 1; //【一年级:1、二年级:2、三年级:3、四年级:4】
let className = req.body.className || "一班";
// let score = req.body.className || "A";
let ret:any = {};
let zhms = [
{
key:"得A率",
value:90,
unit:"%"
},
{
key:"得B率",
value:90,
unit:"%"
},
{
key:"得C率",
value:90,
unit:"%"
},
{
key:"得D率",
value:90,
unit:"%"
},
];
ret["zhms"] = {title:"综合面试", dataList:zhms};
let khxxsc = {
在校:[
{
key:"一月",
value:100
},
{
key:"二月",
value:100
},
{
key:"三月",
value:100
},
{
key:"四月",
value:100
},
{
key:"五月",
value:100
},
{
key:"六月",
value:100
},
{
key:"七月",
value:100
},
{
key:"八月",
value:100
},
],
课后作业:[
{
key:"一月",
value:100
},
{
key:"二月",
value:100
},
{
key:"三月",
value:100
},
{
key:"四月",
value:100
},
{
key:"五月",
value:100
},
{
key:"六月",
value:100
},
{
key:"七月",
value:100
},
{
key:"八月",
value:100
},
],
};
ret["khxxsc"] = {title:"课后学习时长", dataList:khxxsc};
let zywcqk = [
{
key:"课后作业",
value:0
},
{
key:"探究作业",
value:0
},
{
key:"打卡作业",
value:0
}
];
ret["zywcqk"] = {title:"作业完成情况", dataList:zywcqk};
let xydjdb = {
班级:[
{
key:"A等",
value:97
},
{
key:"B等",
value:17
},
{
key:"C等",
value:77
},
{
key:"D等",
value:23
},
{
key:"E等",
value:11
},
],
年级:[
{
key:"A等",
value:87
},
{
key:"B等",
value:97
},
{
key:"C等",
value:71
},
{
key:"D等",
value:21
},
{
key:"E等",
value:19
},
],
};
ret["xydjdb"] = {title:"学业等级对比", dataList:xydjdb};
let xyjc = {
语文:[
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XXX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
],
数学:[
{
key:"王XX",
value:"优秀"
},
{
key:"王XX",
value:"优秀"
},
{
key:"孔XXX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
],
英语:[
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XXX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
],
物理:[
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XXX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
],
化学:[
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XXX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
],
生物:[
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XXX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
],
历史:[
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XXX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
{
key:"孔XX",
value:"优秀"
},
]
};
ret["xyjc"] = {title:"学业检测", dataList:xyjc};
let mcjbyxxs = [
{
key:"孔维玮",
value:"进步13",
state:"良好"
},
{
key:"朱清仪",
value:"进步10",
state:"良好"
},
{
key:"寇仟凡玉",
value:"进步5",
state:"良好"
},
{
key:"张恒",
value:"进步11",
state:"良好"
},
{
key:"刘抒辰",
value:"进步13",
state:"良好"
},
{
key:"冯跃如",
value:"进步9",
state:"良好"
},
];
ret["mcjbyxxs"] = {title:"名次进步优秀学生(年级前30名)", dataList:mcjbyxxs, count:22}
let xksyj = [
{
key:"郭晋同",
evaluate:"优秀",
value:"名次113"
},
{
key:"杨均文",
evaluate:"优秀",
value:"名次104"
},
{
key:"朱亦腾",
evaluate:"优秀",
value:"名次110"
},
{
key:"仲韬",
evaluate:"优秀",
value:"名次127"
},
{
key:"邱云汉",
evaluate:"优秀",
value:"名次99"
},
];
ret["xksyj"] = {title:"学困生预警", dataList:xksyj, count:11};
res.send(ret);
}
/**下拉成绩等级 */
export async function getRank(req, res) {
let ret:any = {};
let rank = ["A", "B", "C", "D", "E", "F", "G"];
ret["rank"] = {title:"成绩等级下拉", dataList:rank};
res.send(ret);
}
/**
* 教师画像(对内)-综合实践活动参与情况
*/
import { title } from "process";
import { xshxNENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import { getKeyValue, readFileList } from "../outData";
import { jshxTableData } from "../../data/table/duiwai";
import { keyValuePackage, tablePackage } from "../../dataPackage/inFrontOut";
import { systemConfig } from "../../config/serverConfig";
const ImgUrl = "img/对内/学生画像/综合实践活动参与情况/";
/**左侧 */
export async function getTddyhd(req, res) {
let grade = req.body.grade || 1; //【一年级:1、二年级:2、三年级:3、四年级:4】
let className = req.body.className || "一班";
let ret:any = {};
let cyrc = [
{
key:"参与人次",
value:243
}
];
ret["cyrc"] = {title:"参与人次", dataList:cyrc};
let tddyhd = [
{
key:"活动类型",
value:12
},
{
key:"仪式活动",
value:30
},
{
key:"主题教育",
value:27
},
{
key:"团课",
value:19
},
{
key:"队课",
value:10
},
];
ret["tddyhd"] = {title:"团队德育活动", dataList:tddyhd};
let shsjqk = [
{
key:"社会考察",
period:8,
rate:100
},
{
key:"公益劳动",
period:10,
rate:87
},
{
key:"职业体验",
period:2,
rate:100
},
{
key:"安全实训",
period:0,
rate:90
},
];
ret["shsjqk"] = {title:"社会实践情况", dataList:shsjqk};
let zhpjdAl = [
{
key:"学习态度",
value:"待评价"
},
{
key:"课堂表现",
value:"待评价"
},
{
key:"综合评价",
value:"待评价"
}
];
ret["zhpjdAl"] = {title:"综合评价得A率", dataList:zhpjdAl};
let zywcqk = [
{
key:"作业完成情况",
value:"待评价"
},
{
key:"课堂表现",
value:"待评价"
},
{
key:"综合评价",
value:"待评价"
}
];
ret["zywcqk"] = {title:"作业完成情况", dataList:zywcqk};
res.send(ret);
}
/**基础数据 */
export async function getData(req, res) {
let grade = req.body.grade || 1; //【一年级:1、二年级:2、三年级:3、四年级:4】
let ret:any = {};
let xshjcgzs = [
{
key:"获奖人次",
value:39
},
{
key:"国家级",
value:2
},
{
key:"市级",
value:0
},
{
key:"区级",
value:4
},
{
key:"校级",
value:33
},
];
ret["xshjcgzs"] = {title:"学生获奖成果展示", dataList:xshjcgzs};
let hdfcImg = readFileList(`${ImgUrl}活动风采/`, [], "png");
let hdfc = [];
for(let i = 0; i < hdfcImg.length; i++) {
hdfc.push({key:i+1+"*******", value:hdfcImg[i]});
}
ret["hdfc"] = {title:"活动风采", dataList:hdfc};
let cxjsysjnl = [
{
key:"科研课题",
value:0
},
{
key:"科研成果",
value:0
},
];
ret["cxjsysjnl"] = {title:"创新精神与实践能力", dataList:cxjsysjnl};
let kykt = {
titleList:["时间", "类型", "课题名称", "指导老师", "是否跨学科"],
dataList:[
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
]
};
ret["kykt"] = {title:"科研课题", dataList:kykt};
let kxkkt = {
titleList:["时间", "类型", "课题名称", "指导老师", "是否跨学科"],
dataList:[
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
]
};
ret["kxkkt"] = {title:"跨学科课题", dataList:kxkkt};
let gjglhd = [
{
key:"科技",
value:2
},
{
key:"人文",
value:2
},
{
key:"艺术",
value:4
},
{
key:"健康",
value:3
},
];
ret["gjglhd"] = {title:"各级各类活动", dataList:gjglhd};
let gjglhdxx = {
titleList:["活动时间", "活动名称", "活动类型", "招生人数", "课时数"],
dataList:[
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
]
};
ret["gjglhdxx"] = {title:"各级各类活动表格", dataList:gjglhdxx};
let shsjhdjl = {
titleList:["活动时间", "活动名称", "活动类型", "参与人数", "课时数"],
dataList:[
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
]
};
ret["shsjhdjl"] = {title:"社会实践活动记录", dataList:shsjhdjl};
let zhsjhdcyqk = {
titleList:["活动时间", "活动名称", "活动类型", "参与人数", "课时数"],
dataList:[
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
["-", "-", "-", "-", "-"],
]
};
ret["zhsjhdcyqk"] = {title:"综合实践活动参与情况", dataList:zhsjhdcyqk};
res.send(ret);
}
/**中间底部-班级特色活动 */
export async function getBjtshd(req, res) {
let grade = req.body.grade || 1; //【一年级:1、二年级:2、三年级:3、四年级:4】
let className = req.body.className || "一班";
let ret:any = {};
let tshdsl = [
{
key:"特色活动数量",
value:"待组织"
}
];
ret["tshdsl"] = {title:"特色活动数量", dataList:tshdsl};
let bjtshd = {
titleList:["活动时间", "活动名称", "活动类型", "参与人数"],
dataList:[
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
]
}
ret["bjtshd"] = {title:"班级特色活动", dataList:bjtshd};
let hdlyImg = readFileList(`${ImgUrl}活动掠影/`, [], "png");
let hdly = [];
for (let i = 0; i < hdlyImg.length; i++) {
hdly.push({time:"2024-01-26", img:hdlyImg[i], txt:"********************"})
}
ret["hdly"] = {title:"活动掠影", dataList:hdly};
res.send(ret);
}
/**
* 部门负责人
* @param req
* @param res
*/
export async function getBmfzr(req, res) {
let userId = req.query.userId;
let deptId = req.query.deptId;
let ret:any = {};
let bmfzrData = await getReqApiData(xshxNENUM.获取部门负责人, {userId, deptId});
ret["bmfzr"] = bmfzrData;
res.send(ret);
}
/**
* 整体办学(对内)
*/
import { ztbxNENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import moment = require("moment");
import { xxgzapTableData, xxzdhdTableData, ztbxTableData } from "../../data/table/duinei";
import { getKeyValue } from "../outData";
import { keyValuePackage, onceYBarChartPackage } from "../../dataPackage/inFrontOut";
import { getKeyValueOut, getOnceYBarChartOut } from "../../dataPackage/out";
import { systemConfig } from "../../config/serverConfig";
import { tysjyTableData } from "../../data/table/duiwai";
const ImgUrl = "img/对内/整体办学/";
export async function getData(req, res) {
let ret:any = {};
const NowTime = new Date();
let excelData = ztbxTableData();
let 统一excelData = tysjyTableData();
// let tqxxData = await getReqApiData(ztbxNENUM.天气信息, {});
// let tqxx = {
// wendu: "14~19℃",
// fengxiang: "西北311.0",
// fengsu: "风速3级",
// wrcd: "中度污染",
// wrzb: 160,
// jkts: "儿童、老年人呼吸系统疾病患者避免高强度的户外锻炼,一般人群减少户外运动。"
// };
// ret["tqxx"] = {title:"天气预报&空气质量", dataList:tqxxData};
//学生=================
let startTime = moment(NowTime).format("YYYY-MM-DD 00:00:00");
let endTime = moment(NowTime).format("YYYY-MM-DD HH:mm:ss");
// {startDate:startTime, endDate:endTime}
let xscqData = await getReqApiData(ztbxNENUM.学生请假统计, {}, "POST");
let jrcq = {
应到总人数:10,
请假人数:10,
出勤率:0.99,
};
ret["jrcq"] = {title:"今日出勤", dataList:jrcq};
let qjqk = [
{
key:"感冒",
value:"5"
},
{
key:"流行病",
value:"17"
},
{
key:"事假",
value:"3"
},
];
ret["qjqk"] = {title:"请假情况", dataList:qjqk};
let startOfWeek = moment().subtract(7, 'days').format("YYYY-MM");
let weekDay = moment().subtract(7, 'days').format("DD");
let endOfWeek = moment(NowTime).format("YYYY-MM-DD");
let bjrsqs = [];
for(let i = 1; i < 7; i++) {
let thisStart = parseInt(weekDay) + i;
let thisStartWeek = `${startOfWeek}-${thisStart} 00:00:00`;
let thisEndWeek = `${startOfWeek}-${thisStart} 23:59:59`;
let xsbjrsqsData = await getReqApiData(ztbxNENUM.学生病假人数趋势, {beginDate:thisStartWeek, endDate:thisEndWeek}, "GET", "data");
bjrsqs.push({key:`${startOfWeek}-${thisStart}`, value:xsbjrsqsData.list[0].num})
}
// let bjrsqs = [
// {
// key:"2024-4-15",
// value:30
// },
// {
// key:"2024-4-16",
// value:30
// },
// {
// key:"2024-4-17",
// value:30
// },
// {
// key:"2024-4-18",
// value:30
// },
// {
// key:"2024-4-19",
// value:30
// },
// ];
ret["bjrsqs"] = {title:"病假人数趋势", dataList:bjrsqs};
//教师=================
let kqCount = await getReqApiData(ztbxNENUM.参加考勤人员名单, {}, "GET", "data");
let jsjrcqData = await getReqApiData(ztbxNENUM.教师当天请假人数, {type:1});
let cql = "0";
cql = (((parseInt(kqCount.count) - parseInt(jsjrcqData[0].value)) / parseInt(kqCount.count)) * 100).toFixed(2)//实到人数/应到人数
let jsjrcq = {
应到总人数:parseInt(kqCount.count),
请假人数:parseInt(jsjrcqData[0].value),
出勤率:`${cql}%`,
};
ret["jsjrcq"] = {title:"今日出勤_教师", dataList:jsjrcq};
let jsqjqk = [
{
key:"感冒",
value:"5"
},
{
key:"流行病",
value:"17"
},
{
key:"事假",
value:"3"
},
];
ret["jsqjqk"] = {title:"请假情况_教师", dataList:jsqjqk};
let jsbjrsqsData = await getReqApiData(ztbxNENUM.教师病假人数趋势, {beginDate:startOfWeek, endDate:endOfWeek});
let jsbjrsInfo = {};
jsbjrsqsData.forEach( info => {
let sj = moment(info.name).format("YYYY-MM-DD");
if (!jsbjrsInfo[sj]) jsbjrsInfo[sj] = 0;
jsbjrsInfo[sj] += parseInt(info.value);
})
let jsbjrsqs = [];
for (let key in jsbjrsInfo) {
jsbjrsqs.push({key, value:jsbjrsInfo[key]});
}
// let jsbjrsqs = [
// {
// key:"2024-4-15",
// value:30
// },
// {
// key:"2024-4-16",
// value:30
// },
// {
// key:"2024-4-17",
// value:30
// },
// {
// key:"2024-4-18",
// value:30
// },
// {
// key:"2024-4-19",
// value:30
// },
// ];
ret["jsbjrsqs"] = {title:"病假人数趋势", dataList:jsbjrsqs};
//食堂&饮水安全
let stjc = excelData['食堂检测'].dataList;
ret["stjc"] = {title:"食堂检测", dataList:stjc};
let mrspTime = moment(NowTime).format("YYYY-MM-DD");
// 小学每日食谱
let mrspQuery = {date_str:mrspTime, typeid:4};
let xxmrsp = await getReqApiData(ztbxNENUM.每日食谱, mrspQuery, "GET", "data");
let xx = [];
if (xxmrsp) xx = getMrsp(xxmrsp.list);
// 初中A每日食谱
let czmrsp = [];
let czamrspQuery = {date_str:mrspTime, typeid:5};
let czamrsp = await getReqApiData(ztbxNENUM.每日食谱, czamrspQuery, "GET", "data");
let cza = [];
if (czamrsp) cza = getMrsp(czamrsp.list);
// cza = getMrsp(czamrsp.list);
czmrsp = cza;
// 初中B每日食谱
let czbmrspQuery = {date_str:mrspTime, typeid:8};
let czbmrsp = await getReqApiData(ztbxNENUM.每日食谱, czbmrspQuery, "GET", "data");
let czb = [];
if (czbmrsp) czb = getMrsp(czbmrsp.list);
czb.forEach( info => {
czmrsp.push(info);
})
// 住宿生每日食谱
let zssmrspQuery = {date_str:mrspTime, typeid:10};
let zssmrsp = await getReqApiData(ztbxNENUM.每日食谱, zssmrspQuery, "GET", "data");
let zss = []
if (zssmrsp) zss = getMrsp(zssmrsp.list);
let mrsp = {
"小学午餐":xx,
"初中午餐":czmrsp,
"住宿生晚餐":zss,
};
ret["mrsp"] = {title:"每日食谱", dataList:mrsp};
let sthj = excelData['食堂其他信息'].dataList;
ret["sthj"] = {title:"食堂环境", dataList:sthj};
let startOfYys = moment().subtract(1, 'days').format("YYYY-MM-DD HH:mm:ss");
let endOfYys = moment(NowTime).format("YYYY-MM-DD HH:mm:ss");
let yysQuery = {samplingDate:startOfYys, samplingDateEnd:endOfYys}
let yysjcData = await getReqApiData(ztbxNENUM.水质检测, {}, "GET", "list");
let yysjcjcrq = [
{
key:"检测日期",
value:moment(yysjcData[0].samplingDate).format("YYYY-MM-DD HH:mm:ss")
}
];
ret["yysjcjcrq"] = {title:"饮用水检测日期", dataList:yysjcjcrq};
let yysjc = [
{
key:"总大肠菌群100ml",
value:yysjcData[0].mpnResName
},
{
key:"菌落总数100ml",
value:yysjcData[0].cfuResName
},
];
ret["yysjc"] = {title:"饮用水检测", dataList:yysjc};
let xsbjData = await getReqApiData(ztbxNENUM.学生人数班级数量, {})
let bjsl = xsbjData.classNum;
let xsrsData = xsbjData.studentNum;
let xsrs = 0;
xsrsData.forEach( info=> {
let {code, name, value} = info;
xsrs += value;
})
let baseDate = [
{
key:"学生人数",
value: xsrs
},
{
key:"班级数量",
value: parseInt(bjsl)
}
]
统一excelData["教师人员"].dataList.forEach(info => {
baseDate.push(info);
})
ret["jcsj"] = {title:"基础数据", dataList:baseDate};
let fxgj = [
{
key:"告警数量",
value:10
},
];
ret["fxgj"] = {title:"风险告警", dataList:fxgj};
let gjsl = [
{
key:"高",
value:12
},
{
key:"中",
value:31
},
{
key:"低",
value:54
}
];
ret["gjsl"] = {title:"告警数量", dataList:gjsl};
let gjlx = [
{
key:"类型一",
value:25
},
{
key:"类型二",
value:25
},
{
key:"类型三",
value:25
},
{
key:"类型四",
value:25
},
];
ret["gjlx"] = {title:"告警类型", dataList:gjlx};
let czqk = [
{
key:"已处置",
value:5
},
{
key:"待处置",
value:8
},
{
key:"处置中",
value:6
},
];
ret["czqk"] = {title:"处置情况", dataList:czqk};
let ryllData = await getReqApiData(ztbxNENUM.智慧安防出入人数, {startDate:startTime, endDate:endTime, pageSize:100, pageNum:1});
let ryllCount = 0;
let crrs = {chu:0, ru:0};
if (ryllData) {
if (ryllData.list.length > 0) {
let zhafry = ryllData.list;
ryllCount = zhafry.length;
zhafry.forEach( info => {
let enterOrExit = info.enterOrExit; //0:出、1:入
if (enterOrExit == 0) crrs.chu += enterOrExit;
else crrs.ru += enterOrExit;
})
}
}
let ryld = [
{
key:"人员总流量",
value:ryllCount || 0 //todo
},
{
key:"入",
value:crrs.ru || 0 //todo
},
{
key:"出",
value:crrs.chu || 0 //todo
},
];
ret["ryld"] = {title:"人员流动", dataList:ryld};
let jcmd = {
titleList: ["姓名", "联系电话", "类型", "原因"],
dataList:[
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
["-", "-", "-", "-"],
]
}
ret["jcmd"] = {title:"进出名单", dataList:jcmd};
let jxcg = excelData["教学常规"].dataList;
ret["jxcg"] = {title:"教学常规", dataList:jxcg};
// todo 改为接调代课接口
let cdlx = excelData["迟到类型"].dataList;
let xsbjrsData = await getReqApiData(ztbxNENUM.调代课记录, {startDate:startTime, endDate:endTime});
ret["cdlx"] = {title:"迟到类型", dataList:cdlx};
let zypgqk = excelData["作业批改情况"].dataList;
ret["zypgqk"] = {title:"作业批改情况", dataList:zypgqk};
// let grbzrc = [
// {
// key:"个人本周日常",
// value:10
// }
// ];
// ret["grbzrc"] = {title:"个人本周日常", dataList:grbzrc};
// let xxgzapExcel = xxgzapTableData()
// let xxgzap = [];
// for (let key in xxgzapExcel) {
// let content = [];
// xxgzapExcel[key].dataList.forEach( info => {
// let {dz, hdms, jssj, kssj} = info;
// content.push({
// data:kssj,
// pop: { txt:hdms, time:`${kssj}-${jssj}`, add:dz}
// });
// })
// xxgzap.push({label:key, content});
// }
let weekStart = moment().startOf('week').format('YYYY-MM-DD');
let weekEnd = moment().endOf('week').format('YYYY-MM-DD');
let rcxx = await getReqApiData(ztbxNENUM.日程信息, {startTime:weekStart, endTime:weekEnd, calendarType:"CALENDAR_TYPE1"});
let rcapConfig = {
0:"七",
1:"一",
2:"二",
3:"三",
4:"四",
5:"五",
6:"六"
};
let rcapData = {};
rcxx.forEach( info => {
let {startTime, endTime, calendarContent, address} = info;
let days = new Date(startTime).getDay();
for (let key in rcapConfig) {
if (!rcapData[rcapConfig[key]]) rcapData[rcapConfig[key]] = [];
}
rcapData[rcapConfig[days]].push({
data:startTime,
pop:{
txt:calendarContent,
time:`${startTime} - ${endTime}`,
add:address
}
});
})
let rcap = [];
let rcapSort = ["一", "二", "三", "四", "五", "六", "七"];
rcapSort.forEach( key => {
rcap.push({label:key, content:rcapData[key]});
})
ret["xxgzap"] = {title:"学校工作安排", dataList:rcap, count:rcxx.length};
let xxzdhdExcel = xxzdhdTableData()
let xxzdhd = [];
for (let key in xxzdhdExcel) {
let content = [];
xxzdhdExcel[key].dataList.forEach( info => {
let {dz, hdms, jssj, kssj} = info;
content.push({
data:kssj,
pop: { txt:hdms, time:`${kssj}-${jssj}`, add:dz}
});
})
xxzdhd.push({label:key, content});
}
ret["xxzdhd"] = {title:"学校重大活动", dataList:xxzdhd, count:0};
res.send(ret);
}
/**
* 课程安排
*/
export async function getKcap(req, res) {
let grade = req.body.grade || "一年级"; //【一年级:1、二年级:2、三年级:3、四年级:4】
let className = req.body.className || "1班";
let ret:any = {};
const NowTime = new Date();
let startDate = moment(NowTime).format("YYYY-MM-DD 00:00:00");
let endDate = moment(NowTime).format("YYYY-MM-DD HH:mm:ss");
let kbap = await getReqApiData(ztbxNENUM.课表安排, {startDate, endDate})
let kcapData = {};
kbap.data.list.forEach( info => {
let class_name = "其他";
if (info.class_name) class_name = info.class_name;
if(!kcapData[class_name]) kcapData[class_name] = [];
kcapData[class_name].push({key:info.section_name, value:info.subject_name});
})
let kcap = kcapData[`${grade}${className}`];
ret["kcap"] = {title:"课程安排", dataList:kcap};
res.send(ret);
}
/**课程安排下拉选择年级班级(根据年级选择班级) */
export async function getClass(req, res) {
let ret:any = {};
// let classData = await postReqApiData(ztbxNENUM.获取班级列表信息, {});
let classData = {
一年级:["1班", "2班", "3班", "4班", "5班"],
二年级:["1班", "2班", "3班", "4班", "5班"],
三年级:["1班", "2班", "3班", "4班", "5班", "6班"],
四年级:["1班", "2班", "3班", "4班", "5班", "6班"],
五年级:["1班", "2班", "3班", "4班", "5班", "6班"],
六年级:["1班", "2班", "3班", "4班", "5班"],
七年级:["1班", "2班", "3班", "4班"],
八年级:["1班", "2班", "3班"],
九年级:["1班", "2班", "3班", "4班", "5班"],
高中一年级:["1班"],
高中二年级:["1班"]
};
ret["kcapxl"] = {title:"课程安排下拉", dataList:classData};
res.send(ret);
}
/**
* 获取最大数
* @param obj
* @returns
*/
function getObjectMaxValue(obj) {
let maxValue = -Infinity;
for (let key in obj) {
let num = parseFloat(obj[key]);
if (obj.hasOwnProperty(key) && typeof num === 'number' && num > maxValue) {
maxValue = num;
}
}
return maxValue === -Infinity ? null : maxValue;
}
/**
* 获取每日食谱的所有菜品
* @param data
* @returns
*/
function getMrsp(data) {
let result = [];
data.forEach( info => {
result.push(info.food_name);
})
return result;
}
import { systemConfig } from "../../config/serverConfig";
import { getBase64Str, getAppToken, getReqApiData, getAppTicket } from "../../data/interface/url";
import { BizError } from "../../util/bizError";
import { get } from "../../util/request";
export async function getHashStr(req, res) {
let ret:any = {};
ret["hashstr"] = await getBase64Str();
res.send(ret);
}
export async function getToken(req, res) {
let ret:any = {};
ret["token"] = await getAppToken();
res.send(ret);
}
export async function getTicket(req, res) {
let ticket = req.query.ticket;
if (!ticket) new BizError("缺少必要参数ticket");
let ret:any = {};
// let accessToken = await getAppToken();
// ret["ticket"] = await getReqApiData("/getTicket", {ticket, accessToken});
// ret["ticket"] = await get(`${systemConfig.url}/getTicket?ticket=${ticket}&accessToken=${accessToken}`, {}, {});
ret["ticket"] = await getAppTicket(ticket);
// console.log(ret["ticket"]);
res.send(ret);
}
/**
* 教师画像(对外)
*/
import { jshxWENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import { getKeyValue, readFileList } from "../outData";
import { jshxTableData, jyzjshxTableData, tysjyTableData, ztbxTableData } from "../../data/table/duiwai";
import { keyValuePackage, tablePackage } from "../../dataPackage/inFrontOut";
const ImgUrl = "img/对外/教师画像/";
export async function getData(req, res) {
let ret:any = {};
let excelData = jshxTableData();
let 统一excelData = tysjyTableData();
const NowTime = new Date();
// let jszyData = await getReqApiData(jshxWENUM.教师资源, {}); //todo
//教师人数和教辅人员改为excel表格数据
let jszy = [];
统一excelData["教师人员"].dataList.forEach(info => {
if (info.key == "教师人数") jszy.push(info);
})
jszy.push({ key:"教师资源达标率", value:"-"});
let jszyData = keyValuePackage(jszy);
ret["jszy"] = {title:"教师资源", dataList:jszyData};
let nlfbData = await getReqApiData(jshxWENUM.年龄分布, {type:"age"});
let nlfb = getKeyValue(nlfbData);
ret["nlfb"] = {title:"年龄分布", dataList:nlfb};
let zzmmData = await getReqApiData(jshxWENUM.教师政治面貌, {type:"political"});
let zzmm = getKeyValue(zzmmData);
ret["zzmm"] = {title:"政治面貌", dataList:zzmm};
// let jyzdjData = await getReqApiData(jshxWENUM.教研组搭建, {}); //todo
let jyzjsConf = ["语文", "数学", "英语", "综理", "综文", "体育", "艺术"];
let jyzdj = [];
for(let i = 0; i < jyzjsConf.length; i++) {
let jyzExcelData = jyzjshxTableData(`${jyzjsConf[i]}组`);
let jszyTableData = jyzExcelData["教师资源"].dataList;
jyzdj.push({key:jyzjsConf[i], value:jszyTableData.length})
}
ret["jyzdj"] = {title:"教研组搭建", dataList:jyzdj};
// let zzgcData = await getReqApiData(jshxWENUM.组织构成, {}); //todo
// let zzgc = [
// {
// key:"组长",
// value:30
// },
// {
// key:"副组长",
// value:30
// },
// {
// key:"组员",
// value:40
// },
// ]
// ret["zzgc"] = {title:"组织构成", dataList:zzgc};
// let jymbData = await getReqApiData(jshxWENUM.教研目标, {}); //todo
// let jymb = [
// {
// key:"目标1",
// value: 13,
// rate: "56%"
// },
// {
// key:"目标2",
// value: 19,
// rate: "26%"
// },
// {
// key:"目标3",
// value: 3,
// rate: "11%"
// },
// {
// key:"目标4",
// value: 13,
// rate: "56%"
// },
// {
// key:"目标5",
// value: 8,
// rate: "3%"
// },
// {
// key:"目标6",
// value: 21,
// rate: "21%"
// },
// {
// key:"目标7",
// value: 13,
// rate: "56%"
// },
// ]
// ret["jymb"] = {title:"教研目标", dataList:jymb};
let dssl = keyValuePackage(excelData["校内导师"].dataList);
ret["dssl"] = {title:"导师数量", dataList:dssl};
let yxbzr = tablePackage(excelData["班主任导师"].headerList[0], excelData["班主任导师"].bodyList);
ret['yxbzr'] = {title: '班主任导师', dataList: yxbzr};
let xkdszb = keyValuePackage(excelData["学科导师占比"].dataList);
ret["xkdszb"] = {title:"学科导师占比", dataList:xkdszb};
let jcsj = keyValuePackage(excelData["基础数据"].dataList);
ret["jcsj"] = {title:"基础数据", dataList:jcsj};
// let jszpq = keyValuePackage(excelData["教师照片墙"].dataList);
let jszpq = readFileList(`img/对外/教师照片/`, [], "png");
ret["jszpq"] = {title:"教师照片墙", dataList:jszpq};
// let jxtjData = await getReqApiData(jshxWENUM.奖项统计, {pageNo:1, pageSize:100});
let jxtjData = await getReqApiData(jshxWENUM.获奖情况, {type:1}, null, "data", "jsfz");
// let jxtjCount = {gjj:0, sj:0, qj:0, xj:0};
let jxtjDataList = {gjj:[], sj:[], qj:[], xj:[]};
if (jxtjData) {
jxtjData.list.data.forEach( info => {
//todo 对应标准发给我之后修改
if (info.level == "国家级及以上") jxtjDataList.gjj.push(info);
if (info.level == "省/市级") jxtjDataList.sj.push(info);
if (info.level == "区/县级") jxtjDataList.qj.push(info);
if (info.level == "校级") jxtjDataList.xj.push(info);
})
}
let jxtj = [
{
key:"国家级奖项",
value:jxtjDataList.gjj.length || 0
},
{
key:"市级奖项",
value:jxtjDataList.sj.length || 0
},
{
key:"区级奖项",
value:jxtjDataList.qj.length || 0
},
{
key:"校级奖项",
value:jxtjDataList.xj.length || 0
},
]
ret["jxtj"] = {title:"奖项统计", dataList:jxtj};
let cycjjss = keyValuePackage(excelData["参与创建教师数"].dataList);
ret["cycjjss"] = {title:"参与创建教师数", dataList:cycjjss};
let dxyfxhpgy = keyValuePackage(excelData["大学与附校互聘共育"].dataList);
ret["dxyfxhpgy"] = {title:"大学与附校互聘共育", dataList:dxyfxhpgy};
let tskccj = tablePackage(excelData["特色课程创建"].headerList[0], excelData["特色课程创建"].bodyList);
let tskccjData = [];
tskccj.dataList.forEach( info => {
let item = [];
for(let key in info) {
item.push(info[key]);
}
tskccjData.push(item);
})
let tskccjDataList = {
titleList:tskccj.titleList,
dataList:tskccjData
}
ret["tskccj"] = {title:"特色课程创建", dataList:tskccjDataList};
//todo
let xmzs = excelData["项目化学习总数"].dataList;
ret["xmzs"] = {title:"项目总数", dataList:xmzs};
let xmhxx = excelData["项目化学习"].dataList;
ret["xmhxx"] = {title:"项目化学习", dataList:xmhxx};
// let zyfzcgData = await getReqApiData(jshxWENUM.专业发展成果, {}); //todo
let zyfzcgData = await getReqApiData(jshxWENUM.专业发展成果, {type:1}, null, "data", "jsfz");
let lwfb = [
{
key:"论文论著发表",
value:zyfzcgData.list.treatiseNum || 0
}
];
ret["zyfzcg"] = {title:"论文发表", dataList:lwfb};
let lwfbImg = readFileList(`${ImgUrl}论文发表图片/`, [], "png");
ret["lwfbImg"] = {title:"论文发表图片", dataList:lwfbImg};
// let jyhj = keyValuePackage(excelData["教师获奖"].dataList);
let jyhj = [
{
key:"指导学生获奖",
value:zyfzcgData.list.studentNum || 0
},
{
key:"教学评优",
value:zyfzcgData.list.teachNum || 0
},
{
key:"课题获奖",
value:zyfzcgData.list.subjectNum || 0
},
{
key:"论文获奖",
value:zyfzcgData.list.thesisNum || 0
},
]
ret["jyhj"] = {title:"教研获奖", dataList:jyhj};
// let cyzcgjpxData = await getReqApiData(jshxWENUM.参与主持人各级培训, {}); //todo
let cyzcgjpxData = await getReqApiData(jshxWENUM.参与主持各级培训, {type:1}, null, "data", "jsfz");
let pxcs = [
{
key:"培训次数",
value:0
}
];
let cyzcgjpx = {
titleList:["培训时间", "参与人数", "任务名称", "培训人", "培训类型"],
dataList:[]
};
if (cyzcgjpxData) {
pxcs[0].value = cyzcgjpxData.list.total;
cyzcgjpxData.list.data.forEach( info => {
let jyzkt = [];
for (let key in info) {
jyzkt.push(info[key]);
}
cyzcgjpx.dataList.push(jyzkt);
})
}
ret["pxcs"] = {title:"培训次数", dataList:pxcs};
ret["cyzcgjpx"] = {title:"参与&主持各级培训", dataList:cyzcgjpx};
// let hdlxcyqxfxData = await getReqApiData(jshxWENUM.活动类型参与趋势分析, {}); //todo
let hdlxcyqxfx = [
{
key:"2021下",
xn:70,
xw:106
},
{
key:"2022上",
xn:170,
xw:163
},
{
key:"2022下",
xn:120,
xw:97
},
{
key:"2023上",
xn:70,
xw:106
},
{
key:"2023下",
xn:170,
xw:163
},
{
key:"2024上",
xn:137,
xw:63
},
];
ret["hdlxcyqxfx"] = {title:"活动类型参与趋势分析", dataList:hdlxcyqxfx};
let lnqsdb = ["2020", "2021", "2021", "2022", "2023", "2024"];
let lnqsdbData = [];
for( let i = 0; i < lnqsdb.length; i++) {
let kyqkData = await getReqApiData(jshxWENUM.参与科研情况, {type:lnqsdb[i]}, null, "data", "jsfz");
let count = 0;
if (kyqkData) {
for (let key in kyqkData.list) {
for (let info in kyqkData.list[key]) {
let {num, name} = kyqkData.list[key][info];
count += num;
};
}
}
lnqsdbData.push({key:lnqsdb[i], value:count});
}
ret["lnqsdb"] = {title:"历年获奖趋势对比", dataList:lnqsdbData};
res.send(ret);
}
/**
* 跨学科教学
* 弃用
* @param req time 时间段(近一周、近一月、近三月)
* @param res
*/
export async function getKxkjx(req, res) {
let time = req.body.time || "近一周";
let ret:any = {};
// let kxkjxData = await getReqApiData(jshxWENUM.跨学科教学, {time}); //todo 参数:时间段【近一周、近一月、近三月】
let kxkjxjcsj = [
{
key:"参与教师数",
value:0
},
{
key:"项目数",
value:0
}
]
let kxkjx = [
{
name:"项目名称1",
rate:45,
startTime:"2024.04.25"
},
{
name:"项目名称2",
rate:45,
startTime:"2024.04.25"
},
{
name:"项目名称3",
rate:45,
startTime:"2024.04.25"
},
]
ret["kxkjxjcsj"] = {title:"跨学科教学基础数据", dataList:kxkjxjcsj};
ret["kxkjx"] = {title:"跨学科教学项目列表", dataList:kxkjx};
res.send(ret);
}
/**
* 教学教研 / 参与&科研情况
* @param req year:年份
* @param res
*/
export async function getKyqk(req, res) {
let year = req.body.year;
let ret:any = {};
// let kyqkData = await getReqApiData(jshxWENUM.科研情况, {year}); //todo 参数 年份:2023
let kyqk = []
let kyqkData = await getReqApiData(jshxWENUM.参与科研情况, {type:year}, null, "data", "jsfz");
if (kyqkData) {
for (let key in kyqkData.list) {
let count = 0;
for (let info in kyqkData.list[key]) {
let {num, name} = kyqkData.list[key][info];
count += num;
};
let dataList = []
for (let info in kyqkData.list[key]) {
let {num, name} = kyqkData.list[key][info];
let rate = 0;
if (num != 0) rate = Math.round(num/count*100);
dataList.push({name, rate:`${rate}%`, value:num});
};
if (key == "openClass") {
kyqk.push({
key:"公开课",
dataList
})
} else if (key == "achievement") {
kyqk.push({
key:"成果发表",
dataList
})
} else if (key == "lecture") {
kyqk.push({
key:"讲座及报告(专家级)",
dataList
})
};
}
}
ret["kyqk"] = {title:"教学教研", dataList:kyqk};
res.send(ret);
}
/**
* 市区校级课题
* @param req
* @param res
*/
export async function getSqxjkt(req, res) {
// let subject = req.body.subject || "语文"; //去掉下拉选择,课题数据没有这个字段
let ret:any = {};
let jyzkt = [
{
key:"课题数量",
value: 0
}
];
let jyzktTable = {
titleList:["课题名称", "课题开始时间", "教师姓名", "课题级别"],
dataList:[]
};
let jyzktslData = await getReqApiData(jshxWENUM.市区校级课题, {type:1}, null, "data", "jsfz");
if (jyzktslData.list) {
jyzkt[0].value = jyzktslData.list.total;
jyzktslData.list.data.forEach( info => {
let jyzkt = [];
for (let key in info) {
jyzkt.push(info[key]);
}
jyzktTable.dataList.push(jyzkt);
})
}
ret["jyzktsl"] = {title:"课题数量", dataList:jyzkt};
ret["sqxjkt"] = {title:"市区校级课题", dataList:jyzktTable};
res.send(ret);
}
/**
* 水平分析弹窗
*/
import { getReqApiData } from "../../data/interface/url";
import { spfxWENUM } from "../../config/interficeEnum";
const ImgUrl = "img/对外/水平分析弹窗/";
export async function getData(req, res) {
let ret: any = {};
let studentId = req.body.studentId || "733f97c4425a11ee98a202031519086a";
let xyspfx = [
{
key:"综合水平",
value:"A"
},
{
key:"同比",
value:0.23
}
];
ret["xyspfx"] = {title:"学业水平分析", dataList:xyspfx};
let dbfxsj = [
{
"subject":"数学",
"result":"优秀",
"contrastAnalysis": [
{
"ageScore":"97",
"dataList":[
{
"key":"2021上",
"value":"86"
},
{
"key":"2021下",
"value":"86"
},
{
"key":"2022上",
"value":"86"
},
{
"key":"2022下",
"value":"86"
},
{
"key":"2023上",
"value":"86"
},
]
}
],
"classComparison": {
"ageScore":"97",
"dataList":[
{
"key":"2021上",
"value":"86"
},
{
"key":"2021下",
"value":"76"
},
{
"key":"2022上",
"value":"89"
},
{
"key":"2022下",
"value":"93"
},
{
"key":"2023上",
"value":"90"
},
]
},
"sdyssydbfx":[
{
key:"科技素养",
person:76,
grade:80
},
{
key:"艺术素养",
person:83,
grade:80
},
{
key:"健康素养",
person:55,
grade:80
},
{
key:"人文素养",
person:91,
grade:80
},
]
},
{
"subject":"语文",
"result":"优秀",
"contrastAnalysis": [
{
"ageScore":"97",
"dataList":[
{
"key":"2021上",
"value":"86"
},
{
"key":"2021下",
"value":"76"
},
{
"key":"2022上",
"value":"89"
},
{
"key":"2022下",
"value":"93"
},
{
"key":"2023上",
"value":"90"
},
]
}
],
"classComparison": {
"ageScore":"97",
"dataList":[
{
"key":"2021上",
"value":"83"
},
{
"key":"2021下",
"value":"86"
},
{
"key":"2022上",
"value":"81"
},
{
"key":"2022下",
"value":"89"
},
{
"key":"2023上",
"value":"91"
},
]
},
"sdyssydbfx":[
{
key:"科技素养",
person:76,
grade:80
},
{
key:"艺术素养",
person:83,
grade:80
},
{
key:"健康素养",
person:55,
grade:80
},
{
key:"人文素养",
person:91,
grade:80
},
]
},
];
ret["dbfxsj"] = {title:"对比分析数据", dataList:dbfxsj};
// let xspjfx = [
// {
// key:"学生评价分析",
// value:"分析中"
// }
// ];
// ret["xspjfx"] = {title:"学生评价分析", dataList:xspjfx};
// let sdyssydbfx = [
// {
// key:"科技素养",
// person:76,
// grade:80
// },
// {
// key:"艺术素养",
// person:83,
// grade:80
// },
// {
// key:"健康素养",
// person:55,
// grade:80
// },
// {
// key:"人文素养",
// person:91,
// grade:80
// },
// ];
// ret["sdyssydbfx"] = {title:"四大素养对比分析", dataList:sdyssydbfx};
let sg = [
{
key:"身高",
value:157.8
}
];
ret["sg"] = {title:"身高", dataList:sg};
let sgczfx = [
{
"key":"2021上",
"value":"120",
"age":"130"
},
{
"key":"2021下",
"value":"125",
"age":"130"
},
{
"key":"2022上",
"value":"120",
"age":"130"
},
{
"key":"2022下",
"value":"125",
"age":"130"
},
{
"key":"2023上",
"value":"120",
"age":"130"
},
];
ret["xgczfx"] = {title:"身高成长分析", dataList:sgczfx};
let tzBMI = [
{
key:"体重",
value:46.9
},
{
key:"BMI",
value:"待评价"
}
];
ret["tzBMI"] = {title:"体重BMI", dataList:tzBMI};
let tzczfx = [
{
"key":"2021上",
"value":"32.5 ",
"age":"30"
},
{
"key":"2021下",
"value":"35.2",
"age":"35"
},
{
"key":"2022上",
"value":"32.5 ",
"age":"30"
},
{
"key":"2022下",
"value":"35.2",
"age":"35"
},
{
"key":"2023上",
"value":"32.5 ",
"age":"30"
},
{
"key":"2023下",
"value":"35.2",
"age":"35"
},
];
ret["tzczfx"] = {title:"体重成长分析", dataList:tzczfx};
let BMIfx = [
{
"key":"2021上",
"value":"21",
"age":"20.7"
},
{
"key":"2021下",
"value":"21.5",
"age":"21.3"
},
{
"key":"2022上",
"value":"21",
"age":"20.7"
},
{
"key":"2022下",
"value":"21.5",
"age":"21.3"
},
{
"key":"2023上",
"value":"21",
"age":"20.7"
},
{
"key":"2023下",
"value":"21.5",
"age":"21.3"
},
];
ret["BMIfx"] = {title:"BMI分析", dataList:BMIfx};
let sl = [
{
key:"左",
value:5.0
},
{
key:"右",
value:5.1
},
];
ret["sl"] = {title:"视力", dataList:sl};
let slfx = [
{
"key":"2021上",
"value":"5.2",
"age":"4.9"
},
{
"key":"2021下",
"value":"5.0",
"age":"4.7"
},
{
"key":"2022上",
"value":"5.2",
"age":"4.9"
},
{
"key":"2022下",
"value":"5.0",
"age":"4.7"
},
{
"key":"2023上",
"value":"5.2",
"age":"4.9"
},
{
"key":"2023下",
"value":"5.0",
"age":"4.7"
},
];
ret["slfx"] = {title:"视力分析", dataList:slfx};
let xgfx = {
"evaluateTotalScore":"0",
"ageScore":"98",
"maximumcore":[
{
"key":"2022下",
"value":"97"
},
{
"key":"2023上",
"value":"93"
},
{
"key":"2023下",
"value":"97"
},
{
"key":"2024上",
"value":"93"
},
]
}
ret["xgfx"] = {title:"行为表现", dataList:xgfx};
let wcqkdb91 = [
{
key:"年级完成学生数",
value:"84"
},
{
key:"班级完成学生数",
value:"21"
},
];
ret["wcqkdb"] = {title:"九个一完成情况对比", dataList:wcqkdb91};
let wcqkData = await getReqApiData(spfxWENUM.九加一完成情况, {studentId});
let wcqk91 = {
project:"每个学期完成一个课题研究",
speak:"每个学段进行一次公开演讲",
visitTechnology:"每个假期参观一个科技场馆",
communityServices:"每个假期参加一次社区服务",
readClassicBook:"每个月阅读一本经典书籍",
sportsHobby:"每位学生拥有一项运动爱好",
readingReport:"每个学期举办一场读书报告",
instrumental:"每位学生掌握一门乐器演奏",
performance:"每个学段参加一次公开表演",
write:"每位学生能写一手好字"
};
let wcqk = [];
for(let key in wcqk91) {
let name = wcqk91[key];
let value = parseFloat(wcqkData[key]) || 0;
wcqk.push({key:name, value});
}
ret["wcqk"] = {title:"九+一完成情况", dataList:wcqk};
let tytctj = [
{
"key":"体育体侧总分",
"value":"80"
}
];
ret["tytctj"] = {title:"体育体侧统计", dataList:tytctj};
let jqtccyqk = [
{
"key":"肺活量(ml)",
"value":2087
},
{
"key":"50米跑(秒)",
"value":8.34
},
{
"key":"坐位体前屈(cm)",
"value":16.5
},
{
"key":"一分钟跳绳(次)",
"value":135
},
{
"key":"一分钟仰卧起坐(次)",
"value":50
},
];
ret["jqtccyqk"] = {title:"当前学期体质测试结果", dataList:jqtccyqk};
let bjcjtj = [
{
"key":"优良率",
"value":"0.0%"
},
{
"key":"及格率",
"value":"0.0%"
}
];
ret["bjcjtj"] = {title:"班级成绩统计", dataList:bjcjtj};
let njcjtj = [
{
"key":"优良率",
"value":"0.0%"
},
{
"key":"及格率",
"value":"0.0%"
}
];
ret["njcjtj"] = {title:"年级成绩统计", dataList:njcjtj};
let hjcs = [
{
key:"获奖次数",
value:4
}
];
ret["hjcs"] = {title:"获奖次数", dataList:hjcs};
let hjfx = [
{
"key":"国家级",
"value":"3",
"age":"11"
},
{
"key":"市级",
"value":"1",
"age":"10"
},
{
"key":"区级",
"value":"3",
"age":"11"
},
{
"key":"校级",
"value":"1",
"age":"10"
},
];
ret["hjfx"] = {title:"获奖分析", dataList:hjfx};
res.send(ret);
}
/**
* 学生档案弹窗
*/
import { getReqApiData } from "../../data/interface/url";
import { xsdaWENUM } from "../../config/interficeEnum";
export async function getData(req, res) {
let ret:any = {};
// let {studentId, grade} = req.body;
let studentId = req.body.studentId || "733f97c4425a11ee98a202031519086a";
let grade = req.body.grade || "六年级下";
//成长相册 todo
let czxcData = await getReqApiData(xsdaWENUM.学生照片, {studentId, grade, type:2}); //type:类型(1:3D模型,2:照片)
ret["czxc"] = {title:"成长相册", dataList:czxcData || ""};
//todo
// let xssyData = await getReqApiData(xsdaWENUM.学生素养, {studentId, grade});
let xssy = [
{
key:"科技素养",
value:"70",
rate:"16%"
},
{
key:"艺术素养",
value:"30",
rate:"21%"
},
{
key:"健康素养",
value:"70",
rate:"63%"
},
{
key:"人文素养",
value:"70",
rate:"51%"
},
];
ret["xssy"] = {title:"学生素养", dataList:xssy};
//todo
let czjy = [
{
key:"老师成长寄语的原话",
value:""
}
];
// let teacherMsg = await getReqApiData(xsdaWENUM.老师成长寄语, {studentId, grade});
ret["czjy"] = {title:"成长寄语", dataList:czjy};
let czjl = {
sg:0,
tz:0,
BMI:"待评价",
zuo:0,
you:0
};
let tzjkData = await getReqApiData(xsdaWENUM.获取学生体质健康, {studentId, grade});
if (tzjkData.length) {
let item = tzjkData[0];
czjl.sg = item.height || 0;
czjl.tz = item.width || 0;
czjl.BMI = item.bmi || "待评价";
}
let xsslData = await getReqApiData(xsdaWENUM.学生视力, {studentId, grade});
if (xsslData.length) {
let item = xsslData[0];
czjl.zuo = item.nakedVisionLeft;
czjl.you = item.nakedVisionRight;
}
ret["czjl"] = {title:"成长记录", dataList:czjl};
// let sgczjlData = await getReqApiData(xsdaWENUM.身高成长记录, {studentId, grade});
let sgczjl = [
{
key:"2021上",
value:120
},
{
key:"2021下",
value:125
},
{
key:"2022上",
value:133
},
{
key:"2022下",
value:141
},
{
key:"2023上",
value:150
},
];
ret["sgczjl"] = {title:"身高成长记录", dataList:sgczjl};
// let tzczjlData = await getReqApiData(xsdaWENUM.体重成长记录, {studentId, grade});
let tzczjl = [
{
key:"2021上",
value:32.5,
BMI:20.7
},
{
key:"2021下",
value:35.2,
BMI:21.3
},
{
key:"2022上",
value:133,
BMI:21.3
},
{
key:"2022下",
value:141,
BMI:21.3
},
{
key:"2023上",
value:150,
BMI:21.3
},
];
ret["tzczjl"] = {title:"体重成长记录", dataList:tzczjl};
let sljlData = await getReqApiData(xsdaWENUM.视力记录, {studentId, grade});
let sljl = [
{
key:"2021上",
value:5.2
},
{
key:"2021下",
value:5.0
},
{
key:"2022上",
value:5.0
},
{
key:"2022下",
value:5.0
},
{
key:"2023上",
value:4.9
},
];
ret["sljl"] = {title:"视力记录", dataList:sljl};
let xkcjfbData = await getReqApiData(xsdaWENUM.学科成绩分布, {studentId, grade});
let zhsp = [
{
key:"综合水平",
value:"A"
}
];
ret["zhsp"] = {title:"综合水平", dataList:zhsp};
let xkcjfb = [
{
"name":"语文",
"dataList":[
{
"key":"2021上",
"value":"91"
},
{
"key":"2021下",
"value":"89"
},
]
},
{
"name":"数学",
"dataList":[
{
"key":"2021上",
"value":"91"
},
{
"key":"2021下",
"value":"89"
},
]
},
{
"name":"英语",
"dataList":[
{
"key":"2021上",
"value":"91"
},
{
"key":"2021下",
"value":"89"
},
]
},
]
ret["xkcjfb"] = {title:"学科成绩分布", dataList:xkcjfb};
let cyzks = [
{
key:"参与总课时",
value:124
}
];
ret["cyzks"] = {title:"参与总课时", dataList:cyzks};
// let kccy = [
// {
// key:"拓展课参与课时",
// value:27,
// rate:"45%"
// },
// {
// key:"探究课参与课时",
// value:33,
// rate:"55%"
// },
// ];
// ret["kccy"] = {title:"课程参与", dataList:kccy};
// let lscyksqs = [
// {
// key:"2021上",
// value:120
// },
// {
// key:"2021下",
// value:97
// },
// {
// key:"2022上",
// value:151
// },
// {
// key:"2022下",
// value:123
// },
// {
// key:"2023上",
// value:150
// },
// ];
// ret["lscyksqs"] = {title:"历史参与课时趋势", dataList:lscyksqs};
let kccyzks = [
{
key:"总课时",
value:124
}
];
ret['kccyzks'] = {title:"课程参与总课时", dataList:kccyzks};
let kccy = [
{
title:"拓展课课程",
data:[
{
key:"课程名称",
state:"已参与",
startTime:"2024.06.03 13:00:00",
name:"章老师"
},
{
key:"课程名称",
state:"未开始",
startTime:"2024.06.04 13:00:00",
name:"王老师"
},
{
key:"课程名称",
state:"已参与",
startTime:"2024.06.03 13:00:00",
name:"张老师"
},
]
},
{
title:"探究课课程",
data:[
{
key:"课程名称",
state:"已参与",
startTime:"2024.06.03 13:00:00",
name:"章老师"
},
{
key:"课程名称",
state:"已参与",
startTime:"2024.06.02 13:00:00",
name:"王老师"
},
{
key:"课程名称",
state:"未开始",
startTime:"2024.06.05 13:00:00",
name:"张老师"
},
]
},
{
title:"兴趣课课程",
data:[
{
key:"课程名称",
state:"已参与",
startTime:"2024.06.02 13:00:00",
name:"王老师"
},
{
key:"课程名称",
state:"已参与",
startTime:"2024.06.03 13:00:00",
name:"章老师"
},
{
key:"课程名称",
state:"未开始",
startTime:"2024.06.05 13:00:00",
name:"张老师"
},
]
}
];
ret['kccy'] = {title:"课程参与", dataList:kccy};
let hjcgData = await getReqApiData(xsdaWENUM.奖项统计, {studentId, pageNo:1, pageSize:100});
// let hjcg = {
// gjj:[],
// sj:[],
// qj:[],
// xj:[]
// };
//调试数据
let hjcg = {
gjj:[],
sj:[],
qj:[],
xj:[
{
time:"2023/11/4",
name:"第五届秋季运动会六年级组男子组4分钟跳绳比赛第一"
},
{
time:"2023/10/13",
name:"第五届秋季运动会六年级男子组跳远比赛第二名"
},
{
time:"2023/10/1",
name:"9月月度之星"
},
]
};
if (hjcgData.length) {
hjcgData.forEach( info => {
let {awardLevel, awardTime, awardName} = info;
switch (awardLevel) {
case "国家级":
hjcg.gjj.push({
time:awardTime,
name:awardName
})
break;
case "市级":
hjcg.sj.push({
time:awardTime,
name:awardName
})
break;
case "区级":
hjcg.qj.push({
time:awardTime,
name:awardName
})
break;
case "校级":
hjcg.xj.push({
time:awardTime,
name:awardName
})
break;
}
})
}
let hjcgList = [
{
key:"国家级",
value:hjcg.gjj
},
{
key:"市级",
value:hjcg.sj
},
{
key:"区级",
value:hjcg.qj
},
{
key:"校级",
value:hjcg.xj
},
]
ret["hjcg"] = {title:"获奖成果", dataList:hjcgList};
let czzj = [
{
time:"2023-08-29",
img:"http://******.jpg",
name:"参与军训",
evaluate:"表现优秀"
},
{
time:"2023-09-01",
img:"http://******.jpg",
name:"英语学科《黑布林英语名著》读书小报",
evaluate:"表现优秀"
},
];
ret["czzj"] = {title:"成长足迹", dataList:czzj};
res.send(ret);
}
/**
* 学生画像(对外)
*/
import { xshxWENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import { xshxTableData } from "../../data/table/duiwai";
import { keyValuePackage, tablePackage } from "../../dataPackage/inFrontOut";
import { GRADEENUM } from "../../config/enum";
import { changeEnumValue } from "../../tools/eccEnum";
import { systemConfig } from "../../config/serverConfig";
import { xshxnjzTableData } from "../../data/table/duinei";
const Grade = {
1:"一年级组",
2:"二年级组",
3:"三年级组",
4:"四年级组",
5:"五年级组",
6:"六年级组",
7:"七年级组",
8:"八年级组",
9:"九年级组",
10:"高中组"
}
export async function getData(req, res) {
let ret:any = {};
let excelData = xshxTableData();
let xsbjrsData = await getReqApiData(xshxWENUM.学校学生数班级数, {});
let bjsl = xsbjrsData.classNum;
let xsrsData = xsbjrsData.studentNum;
let xsrs = 0;
let nanshen = {
key:"男生人数",
value:0,
rate:""
};
let nvshen = {
key:"女生人数",
value:0,
rate:""
};
xsrsData.forEach( info=> {
let {code, name, value} = info;
xsrs += value;
let codeToInt = parseInt(code);
if (codeToInt == 0) {
nvshen.value = value;
} else {
nanshen.value = value;
}
})
let xsbjDate = [
{
key:"学校学生数",
value: xsrs || 0
},
{
key:"学校班级数",
value: bjsl || 0
}
]
ret["xsbjrs"] = {title:"学校学生班级人数", dataList:xsbjDate};
nanshen.rate = Math.round(nanshen.value/xsrs*100 ) + "%";
nvshen.rate = Math.round(nvshen.value/xsrs*100 ) + "%";
let nannvshen = [nanshen, nvshen];
ret["xbrszb"] = {title:"男生人数女生人数", dataList:nannvshen};
let gnjbjxsstjData = [];
//获取1年级到6年级的数据
for (let i = 1; i <= 9; i++) {
/**各年级班级学生数统计 */
let studentData = await getReqApiData(xshxWENUM.各年级班级学生数统计, {grade:i});
let gradeData = {
key:changeEnumValue(GRADEENUM, i),
value:0
};
studentData.studentNum.forEach( info => {
gradeData.value += info.value;
})
gnjbjxsstjData.push(gradeData);
}
ret["gnjbjxsstj"] = {title:"各年级班级学生数统计", dataList:gnjbjxsstjData};
let xsgbxxbData = tablePackage(excelData["学生干部小学部"].headerList[0], excelData["学生干部小学部"].bodyList);
let xsgbxxb = {titleList:xsgbxxbData.titleList, dataList:[]};
xsgbxxbData.dataList.forEach( info => {
let {A, B, C} = info;
let img = `${systemConfig.ipUrl}对外/学生画像/学生干部/${C}`;
xsgbxxb.dataList.push({A, B, C:img});
});
ret['xsgbxxb'] = {title: '学生干部小学部', dataList: xsgbxxb};
let xsgbczbData = tablePackage(excelData["学生干部初中部"].headerList[0], excelData["学生干部初中部"].bodyList);
let xsgbczb = {titleList:xsgbczbData.titleList, dataList:[]};
xsgbczbData.dataList.forEach( info => {
let {A, B, C} = info;
let img = `${systemConfig.ipUrl}对外/学生画像/学生干部/${C}`;
xsgbczb.dataList.push({A, B, C:img});
});
ret['xsgbczb'] = {title: '学生干部初中部', dataList: xsgbczb};
// let shsjbtlxkszbData = await getReqApiData(xshxWENUM.社会实践不同类型的课时占比, {}); //todo
let shsjbtlxkszb = [
{
key:"课题1",
value:69
},
{
key:"课题2",
value:12
},
{
key:"课题3",
value:19
},
{
key:"课题4",
value:37
},
];
let btnjkszb = [
{
key:"六年级",
value:30,
rate:"30%"
},
{
key:"七年级",
value:180,
rate:"100%"
},
{
key:"八年级",
value:90,
rate:"50%"
},
{
key:"九年级",
value:12,
rate:"12%"
},
];
let xx = getPdfzgmsy(1, 7);
let cz = getPdfzgmsy(7, 9);
let gz = getPdfzgmsy(10, 11);
let pdfzygmsy = {
"小学":{
shsjbtlxkszb:keyValuePackage(xx.shsjbtlxkszb),
btnjkszb:xx.btnjkszb
},
"初中":{
shsjbtlxkszb:keyValuePackage(cz.shsjbtlxkszb),
btnjkszb:cz.btnjkszb
},
"高中":{
shsjbtlxkszb:keyValuePackage(gz.shsjbtlxkszb),
btnjkszb:gz.btnjkszb
},
};
ret['pdfzygmsy'] = {title: '品德发展与公民素养', dataList: pdfzygmsy};
// let jsrs = await getReqApiData(xshxWENUM.近视人数, {}) || 0; //todo
let jsl = await getReqApiData(xshxWENUM.近视率, {}); //todo
// let jstb = await getReqApiData(xshxWENUM.近视同比, {}); //todo
let tytz = await getReqApiData(xshxWENUM.特异体质, {}); //todo
// let tytztb = await getReqApiData(xshxWENUM.特异体质同比, {}); //todo
let jstb:any = 0;
if (jsl.length != 0) {
let thisYear = jsl[jsl.length-1].value;
let lastYear = jsl[jsl.length-2].value;
jstb = ((thisYear - lastYear) / lastYear * 100 / 100).toFixed(2);
}
let sxjk = [
{
key:"近视率",
value:`${jsl[jsl.length-1].value}%`,
yoy:`${jstb}%`
},
{
key:"特异体质",
value:tytz,
yoy:"0"
}
];
ret["sxjk"] = {title:"身心健康", dataList:sxjk};
// let spjjslData = await getReqApiData(xshxWENUM.市平均近视率, {}); //todo
let spjjsl = {
key:"市平均近视率",
value:"50%"
}
ret["spjjsl"] = {title:"市平均近视率", dataList:spjjsl};
let gnjjslData = await getReqApiData(xshxWENUM.各年级近视率, {});
let gnjjsl = [];
gnjjslData.forEach( info=> {
let {code, name, value} = info;
gnjjsl.push({
key:name,
value
});
})
ret["gnjjsl"] = {title:"各年级近视率", dataList:gnjjsl};
// let gnjtytzData = await getReqApiData(xshxWENUM.各年级特异体质, {}); //todo 接口不对,必填参数学生id,我们需要的是汇总数据
let gnjtytz = [
{
key:"一年级",
value:"12"
},
{
key:"二年级",
value:"17"
},
{
key:"三年级",
value:"11"
},
{
key:"四年级",
value:"6"
},
{
key:"五年级",
value:"3"
},
{
key:"六年级",
value:"27"
},
]
ret["gnjtytz"] = {title:"各年级特异体质", dataList:gnjtytz};
// let lnjrsbjsData = await getReqApiData(xshxWENUM.六年级人数, {grade:6});
// let lnjrs = {
// key:"六年级人数",
// value:0
// };
// let bjs = {
// key:"班级数",
// value:lnjrsbjsData.classNum || 0
// }
// lnjrsbjsData.studentNum.forEach( info => {
// lnjrs.value += info.value;
// })
// let lnjrsbjs = [lnjrs, bjs];
// ret["lnjrsbjs"] = {title:"六年级人数班级数", dataList:lnjrsbjs};
let jxtjData = await getReqApiData(xshxWENUM.奖项统计, {pageNo:1, pageSize:100});
let jxtjCount = {gjj:0, sj:0, qj:0, zj:0, xj:0};
switch (jxtjData.list.awardLevel) {
case "国家级":
jxtjCount.gjj++;
break;
case "市级":
jxtjCount.sj++;
break;
case "区级":
jxtjCount.qj++;
break;
case "校级":
jxtjCount.xj++;
break;
}
let jxtj = [
{
key:"国家级奖项",
value:jxtjCount.gjj
},
{
key:"市级奖项",
value:jxtjCount.sj
},
{
key:"区级奖项",
value:jxtjCount.qj
},
{
key:"校级奖项",
value:jxtjCount.xj
},
]
ret["jxtj"] = {title:"奖项统计", dataList:jxtj};
// let xytshdData = await getReqApiData(xshxWENUM.校园特色活动, {}); //todo
let xytshd = [
{ "key":"健康素养", "dataList": excelData["健康素养"].dataList },
{ "key":"科技素养", "dataList": excelData["科技素养"].dataList },
{ "key":"艺术素养", "dataList": excelData["艺术素养"].dataList },
{ "key":"人文素养", "dataList": excelData["人文素养"].dataList },
];
ret["xytshd"] = {title:"校园特色活动", dataList:xytshd};
// let xytshdhzData = await getReqApiData(xshxWENUM.校园特色活动汇总, {}); //todo
let xytshdhz = excelData["校园特色活动汇总"].dataList;
ret["xytshdhz"] = {title:"校园特色活动汇总", dataList:xytshdhz};
let xshgbData = tablePackage(excelData["学生会干部"].headerList[0], excelData["学生会干部"].bodyList);
let xshgb = {titleList:xshgbData.titleList, dataList:[]};
xshgbData.dataList.forEach( info => {
let {A, B, C} = info;
let img = `${systemConfig.ipUrl}对外/学生画像/学生会干部/${C}`;
xshgb.dataList.push({A, B, C:img});
});
ret['xshgb'] = {title: '学生会干部', dataList: xshgb};
let ycjh = keyValuePackage(excelData["英才计划"].dataList);
ret["ycjh"] = {title:"英才计划", dataList:ycjh};
let lqmd = tablePackage(excelData["录取名单"].headerList[0], excelData["录取名单"].bodyList);
ret['lqmd'] = {title: '录取名单', dataList: lqmd};
let ryxsData = tablePackage(excelData["荣誉学生"].headerList[0], excelData["荣誉学生"].bodyList);
let ryxs = {titleList:ryxsData.titleList, dataList:[]};
ryxsData.dataList.forEach( info => {
let {A, B, C, D} = info;
let img = `${systemConfig.ipUrl}对外/学生画像/荣誉学生/${A}`;
ryxs.dataList.push({A:img, B, C, D});
});
ret['ryxs'] = {title: '荣誉学生', dataList: ryxs};
let tsstjcsj = keyValuePackage(excelData["特色社团基础数据"].dataList);
ret["tsstjcsj"] = {title:"特色社团基础数据", dataList:tsstjcsj};
// let tsstzb = tablePackage(excelData["特色社团课程数"].headerList[0], excelData["特色社团课程数"].bodyList);
let tsstzb = keyValuePackage(excelData["特色社团课程数"].dataList);
ret['tsstzb'] = {title: '特色社团课程数', dataList: tsstzb};
let rmstTOP5Data = tablePackage(excelData["热门社团TOP5"].headerList[0], excelData["热门社团TOP5"].bodyList);
let rmstTOP5 = {titleList:rmstTOP5Data.titleList, dataList:[]};
rmstTOP5Data.dataList.forEach( info => {
let {A, B, C} = info;
let img = `${systemConfig.ipUrl}对外/学生画像/热门社团/${C}`;
rmstTOP5.dataList.push({A, B, C:img});
});
ret['rmstTOP5'] = {title: '热门社团TOP5', dataList: rmstTOP5};
// let xktjhdData = await getReqApiData(xshxWENUM.学科探究活动, {}); //todo
// let xmhtjhdData = await getReqApiData(xshxWENUM.项目化探究活动, {}); //todo
// let kjsyNjktlbData = await getReqApiData(xshxWENUM.年级课题列表明细, {}); //todo
// let kjsyGnjcxqkData = await getReqApiData(xshxWENUM.各年级创新情况, {}); //todo
/**探究学习 */
let kjsyJcsj = excelData["探究学习-基础数据"].dataList;
ret["kjsyJcsj"] = {title:"探究学习-基础数据", dataList:kjsyJcsj};
let kjsyNjktlb = keyValuePackage(excelData["探究学习-年级课题列表明细"].dataList);
ret["kjsyNjktlb"] = {title:"探究学习-年级课题列表明细", dataList:kjsyNjktlb};
let tjxxNjktlbTc = {
titleList: excelData['探究学习-年级课题列表明细弹窗'].headerList[0],
dataList: excelData['探究学习-年级课题列表明细弹窗'].bodyList
};
ret["tjxxNjktlbTc"] = {title:"探究学习-年级课题列表明细弹窗", dataList:tjxxNjktlbTc};
let kjsyGnjcxqk = excelData["探究学习-各年级创新情况"].dataList;
ret["kjsyGnjcxqk"] = {title:"探究学习-各年级创新情况", dataList:kjsyGnjcxqk};
/**科学实验 */
let rwsyJcsj = excelData["科学实验-基础数据"].dataList;
ret["rwsyJcsj"] = {title:"科学实验-基础数据", dataList:rwsyJcsj};
let rwsyNjktlb = keyValuePackage(excelData["科学实验-年级课题列表明细"].dataList);
ret["rwsyNjktlb"] = {title:"科学实验-年级课题列表明细", dataList:rwsyNjktlb};
let kxsyNjktlbTc = {
titleList: excelData['科学实验-年级课题列表明细弹窗'].headerList[0],
dataList: excelData['科学实验-年级课题列表明细弹窗'].bodyList
};
ret["kxsyNjktlbTc"] = {title:"科学实验-年级课题列表明细弹窗", dataList:kxsyNjktlbTc};
let rwsyGnjcxqk = excelData["科学实验-各年级创新情况"].dataList;
ret["rwsyGnjcxqk"] = {title:"科学实验-各年级创新情况", dataList:rwsyGnjcxqk};
/**社会考察 */
let yssyJcsj = excelData["社会考究-基础数据"].dataList;
ret["yssyJcsj"] = {title:"社会考究-基础数据", dataList:yssyJcsj};
let yssyNjktlb = keyValuePackage(excelData["社会考究-年级课题列表明细"].dataList);
ret["yssyNjktlb"] = {title:"社会考究-年级课题列表明细", dataList:yssyNjktlb};
let shkjNjktlbTc = {
titleList: excelData['社会考究-年级课题列表明细弹窗'].headerList[0],
dataList: excelData['社会考究-年级课题列表明细弹窗'].bodyList
};
ret["shkjNjktlbTc"] = {title:"社会考究-年级课题列表明细弹窗", dataList:shkjNjktlbTc};
let yssygnjcxqk = excelData["社会考究-各年级创新情况"].dataList;
ret["yssyGnjcxqk"] = {title:"社会考究-各年级创新情况", dataList:yssygnjcxqk};
/**创新作品 */
let jksyJcsj = excelData["创新作品-基础数据"].dataList;
ret["jksyJcsj"] = {title:"创新作品-基础数据", dataList:jksyJcsj};
let jksyNjktlb = keyValuePackage(excelData["创新作品-年级课题列表明细"].dataList);
ret["jksyNjktlb"] = {title:"创新作品-年级课题列表明细", dataList:jksyNjktlb};
let cxzpNjktlbTc = {
titleList: excelData['创新作品-年级课题列表明细弹窗'].headerList[0],
dataList: excelData['创新作品-年级课题列表明细弹窗'].bodyList
};
ret["cxzpNjktlbTc"] = {title:"创新作品-年级课题列表明细弹窗", dataList:cxzpNjktlbTc};
let jksyGnjcxqk = excelData["创新作品-各年级创新情况"].dataList;
ret["jksyGnjcxqk"] = {title:"创新作品-各年级创新情况", dataList:jksyGnjcxqk};
// let shsjhdjlData = await getReqApiData(xshxWENUM.社会实践活动记录, {}); //todo
let shsjhdjl = excelData["社会实践活动记录"].dataList;
ret["shsjhdjl"] = {title:"社会实践活动记录", dataList:shsjhdjl};
// let shkcData = await getReqApiData(xshxWENUM.社会考察, {}); //todo
let shkc = {
titleList:excelData["社会考察"].headerList[0],
dataList:excelData["社会考察"].bodyList
};
ret["shkc"] = {title:"社会考察", dataList:shkc};
// let gyldData = await getReqApiData(xshxWENUM.公益劳动, {}); //todo
let gyld = {
titleList:excelData["公益劳动"].headerList[0],
dataList:excelData["公益劳动"].bodyList
};
ret["gyld"] = {title:"公益劳动", dataList:gyld};
// let zytyData = await getReqApiData(xshxWENUM.职业体验, {}); //todo
let zyty = {
titleList:excelData["职业体验"].headerList[0],
dataList:excelData["职业体验"].bodyList
};
ret["zyty"] = {title:"职业体检", dataList:zyty};
// let aqsxData = await getReqApiData(xshxWENUM.安全实训, {}); //todo
let aqsx = {
titleList:excelData["安全实训"].headerList[0],
dataList:excelData["安全实训"].bodyList
};
ret["aqsx"] = {title:"安全实训", dataList:aqsx};
// let hjcgzsData = await getReqApiData(xshxWENUM.获奖成果展示, {}); //todo
let hjcgzsData = excelData["获奖成果展示"].dataList;
let hjcgzs = [];
hjcgzsData.forEach( info => {
let {key, value} = info;
hjcgzs.push({img:`${systemConfig.ipUrl}对外/学生画像/获奖成果展示/${key}`, name:value});
});
ret["hjcgzs"] = {title:"获奖成果展示", dataList:hjcgzs};
res.send(ret);
}
/**
* 获取品德发展与公民素养
*/
function getPdfzgmsy(start, end) {
let shsjbtlxkszb = [];
let btnjkszb = [];
let shsj = {};
for(let i = start; i < end; i++) {
let xsData = xshxnjzTableData(Grade[i]);
let dataList = xsData["品德发展与公民素养"].dataList;
let count = 0;
let zksCount = 0;
dataList.forEach( info => {
let {name, wcks, zks} = info;
if (!shsj[name]) shsj[name] = 0;
shsj[name] += parseInt(wcks);
count += parseInt(wcks);
zksCount += parseInt(zks);
})
let rate = 0;
if (count || zksCount) rate = count / zksCount;
btnjkszb.push( {key:Grade[i], value:count, rate:`${rate}%`} );
}
for (let key in shsj) {
shsjbtlxkszb.push({key, value:shsj[key]});
}
return {shsjbtlxkszb, btnjkszb}
}
/**
* 学生画像个人
*/
import moment = require("moment");
import { GRADEENUM } from "../../config/enum";
import { xshxgrWENUM } from "../../config/interficeEnum";
import { getReqApiData, postReqApiData } from "../../data/interface/url";
import { xshxgrTableData, xycjTableData } from "../../data/table/duinei";
import { changeEnumValue } from "../../tools/eccEnum";
export async function getData(req, res) {
let ret:any = {};
let studentId = req.body.studentId || "bdbb8be6417e11ee9ec102031519086a";
let excelData = xshxgrTableData();
let cjExcelData = xycjTableData();
let name = "";
let gradeClass = "";
let schoolId = "";
let classId = "";
let baseData = await getReqApiData(xshxgrWENUM.获取学生列表, {studentId});
let imgData = await getReqApiData(xshxgrWENUM.学生照片, {studentId, type:2}); //type:类型(1:3D模型,2:照片)
let stuInfo = await getReqApiData(xshxgrWENUM.获取学生成长档案个人信息, {studentId}, null, "data", "platform");
let tzjkData = await getReqApiData(xshxgrWENUM.获取学生体质健康, {studentId});
// let stuPersonality = await getReqApiData(xshxgrWENUM.获取学生个人特长, {studentId});
let bmi = 0;
let bmiLevel = "";
let base = {
img: imgData.url || "", //学生照片
name:"", //姓名
className:"", //班级
nation:"", //民族
studentId:"", //学籍号
height:"", //身高
weight:"", //体重
dateOfBirth:"", //出生日期
// politicalOutlook:"", //政治面貌
};
if (baseData) {
if (baseData.length) {
let item = baseData[0] || {};
name = item.studentName;
gradeClass = item.className;
schoolId = item.schoolId;
classId = item.classId;
base.name = item.studentName || '';
base.className = item.className || '';
base.studentId = item.studentSort || '';
}
}
if (tzjkData.length) {
let item = tzjkData[0];
base.weight = item.weight || '';
base.height = item.height || '';
}
if (stuInfo) {
let stuBaseInfo = stuInfo.baseInfo || null;
if (stuBaseInfo) {
base.dateOfBirth = moment(stuBaseInfo.birthday).format("YYYY-MM-DD");
base.nation = stuBaseInfo.nation;
}
}
ret["jcsj"] = {title:"学生基础数据", dataList:base};
let growthProfile = {
xjgw : [], //校级岗位
bjgw : [], //班级岗位
xxjl : [],
wdxq : "",
zym : "",
zwpj : "",
};
let growthProfileData = await getReqApiData(xshxgrWENUM.获取学生个人特长, {studentId});
if (growthProfileData) {
if (growthProfileData.list) {
if (growthProfileData.list.length != 0) {
// growthProfile.xxjl = [{time:"2015.09-2018.07", value:"上海交通大学闵行幼儿园"}]; // todo 学习经历
growthProfile.wdxq = growthProfileData.list[0].hobby || "";
growthProfile.zym = growthProfileData.list[0].motto || "";
growthProfile.zwpj = growthProfileData.list[0].evaluation || "";
}
}
}
//todo
let sxgw = {
reflection: "" //随想感悟
};
if (stuInfo) {
let stuBaseInfo = stuInfo.baseInfo || null; //学生基础信息
if (stuBaseInfo) {
growthProfile.xjgw.push(stuBaseInfo.schoolPosition);
growthProfile.bjgw.push(stuBaseInfo.classPosition);
sxgw.reflection = stuBaseInfo.selfAssessment
}
let stuXxjl = stuInfo.studyExperienceList || null; //学生学习经历
if (stuXxjl) {
stuXxjl.forEach( info => {
let expTimeStart = moment(info.expTimeStart).format("YYYY-MM-DD");
let expTimeEnd = moment(info.expTimeEnd).format("YYYY-MM-DD");
growthProfile.xxjl.push({time:`${expTimeStart}-${expTimeEnd}`, value:info.schoolName});
})
}
}
ret["jcxx"] = {title:"基础信息", dataList:growthProfile};
/**身心健康 */
let sxjk = {
zjyctj:"",
yctz:"无", //异常体质
jwbs:"无", //既往病史
};
let gmqkData = await getReqApiData(xshxgrWENUM.学生过敏情况, {studentId});
if(gmqkData.length) {
let item = gmqkData[0];
sxjk.jwbs = item.allergy || '无';
};
let tytzData = await getReqApiData(xshxgrWENUM.获取学生特异体质, {studentId});
if(tytzData.length) {
let item = tytzData[0];
sxjk.yctz = item.atopy || '无';
};
ret["sxjk"] = {title:"身心健康", dataList:sxjk};
/**身心健康-体质监测 */
let tzjc = {
sg:0,
tz:0,
BMI:"待评价",
BMIChart:[]
};
if (tzjkData.length) {
let item = tzjkData[0];
tzjc.sg = item.height || 0;
tzjc.tz = item.weight || 0;
tzjc.BMI = item.bmi || "待评价";
}
let BIMData = await getReqApiData(xshxgrWENUM.学生BMI趋势, {studentId});
if(BIMData) {
BIMData.forEach(info => {
let {name, value} = info;
tzjc.BMIChart.push({key:name, value});
});
}
ret["tzjc"] = {title:"体质监测", dataList:tzjc};
/**身心健康-视力监测 */
let sljc = {
zy:"",
yy:"",
slChart:[]
};
let sljcData = await getReqApiData(xshxgrWENUM.学生视力, {studentId});
if (sljcData.length) {
let item = sljcData[0];
sljc.zy = item.nakedVisionLeft;
sljc.yy = item.nakedVisionRight;
}
// sljc.slChart = [
// {
// key:"一年级上",
// value:"5.0"
// },
// {
// key:"一年级下",
// value:"5.0"
// },
// {
// key:"二年级上",
// value:"5.0"
// },
// {
// key:"二年级下",
// value:"5.0"
// },
// ];
// sljc.slChart = [
// {
// key:"一年级上",
// value:"5.0"
// }
// ];
sljcData.forEach(info => {
let {studentInfo, nakedVisionLeft, nakedVisionRight} = info;
sljc.slChart.push({ key:studentInfo.gradeName, left:nakedVisionLeft, right:nakedVisionRight})
})
ret["sljc"] = {title:"视力监测", dataList:sljc};
/**社会实践活动情况 */
// let shsjhdqkData = await getReqApiData(xshxgrWENUM.社会实践活动情况, {studentId}); //todo
let shsjhdqk = [
{
name:"社会考察",
wcks:8,
zks:8
},
{
name:"公益劳动",
wcks:2,
zks:2
},
{
name:"职业体验",
wcks:2,
zks:2
},
{
name:"安全实训",
wcks:0,
zks:0
},
];
ret["shsjhdqk"] = {title:"社会实践活动情况", dataList:shsjhdqk};
/**团队德育活动 */
// let cyksData = await getReqApiData(xshxgrWENUM.团队德育活动, {studentId}) //todo
let cyks = [
{
key:"参与课时",
value:0
}
];
ret["cyks"] = {title:"参与课时", dataList:cyks};
// let tddyhdData = await getReqApiData(xshxgrWENUM.团队德育活动, {studentId}) //todo
let tddyhd = [
{
key:"仪式活动",
value:0
},
{
key:"主题教育",
value:0
}
];
ret["tddyhd"] = {title:"团队德育活动", dataList:tddyhd};
/**综合评价(统计等第) */
// let zhpjData = await getReqApiData(xshxgrWENUM.综合统计, {studentId}) //todo
let zhpjData = await getReqApiData(xshxgrWENUM.获取学生成绩综合信息, {studentId, type:"综合面试"}); //todo
let zhpj = [
{
key:"学习态度",
value:"待评价",
rate:0
},
{
key:"作业完成情况",
value:"待评价",
rate:0
},
{
key:"课堂表现",
value:"待评价",
rate:0
},
{
key:"日常行规",
value:"待评价",
rate:0
}
];
ret["zhpj"] = {title:"综合评价", dataList:zhpj};
/**修业课程与学业成绩 */
let xycjzfData = await getReqApiData(xshxgrWENUM.获取学生成绩综合信息, {studentId, type:"基础课程"}); //todo
let xycjzData = cjExcelData["学业成绩"].dataList;
let stuXycjData = {};
xycjzData.forEach(info => {
for (let key in info) {
if (typeof info[key] === 'string') info[key] = info[key].trim();
}
let {xq, xm, njbj, ywqz, sxqz, yyqz, qzzf, ywqm, sxqm, yyqm, dfqm, wlqm, hxqm, swqm, lsqm, dlqm, zzqm, qmzf, xqzhmscj, yyky, tyqm} = info;
// let trimXm = xm.trim();
// let trimNjbj = njbj.trim();
stuXycjData[`${xm}_${njbj}`] = info;
})
let thisStuXycj = stuXycjData[`${name}_${gradeClass}`];
if (!thisStuXycj) {
thisStuXycj = {
xq: "-",
xm: "- ",
njbj: "- ",
ywqz: "-",
sxqz: "-",
yyqz: "-",
qzzf: "-",
ywqm: "-",
sxqm: "-",
yyqm: "-",
dfqm: "-",
wlqm: "-",
hxqm: "-",
swqm: "-",
lsqm: "-",
dlqm: "-",
zzqm: "-",
qmzf: "-",
xqzhmscj: "-",
yyky: "-",
tyqm: "-",
}
}
let xycjzf = [
{
key:"期中总分",
value:thisStuXycj.qzzf
},
{
key:"期末总分",
value:thisStuXycj.qmzf
}
];
ret["xycjzf"] = {title:"修业课程与学业成绩", dataList:xycjzf};
let gkcjData = await getReqApiData(xshxgrWENUM.获取学生各科成绩, {studentId}); //todo
let gkcj = [];
if (gkcjData.length) {
let score = gkcjData[0].score;
let gkcjInfo = {};
score.forEach( info => {
if (!gkcjInfo[info.subject]) gkcjInfo[info.subject] = {qz:0, qm:0};
gkcjInfo[info.subject].qz = info.score4;
gkcjInfo[info.subject].qm = info.score5;
})
for (let key in gkcjInfo) {
gkcj.push({key, midTerm:gkcjInfo[key].qz, endTerm:gkcjInfo[key].qm});
}
}
// let gkcj = [
// {
// key:"语文",
// midTerm:0,
// endTerm:0
// },
// {
// key:"数学",
// midTerm:0,
// endTerm:0
// },
// {
// key:"英语",
// midTerm:0,
// endTerm:0
// },
// {
// key:"体育",
// midTerm:0,
// endTerm:0
// },
// {
// key:"美术",
// midTerm:0,
// endTerm:0
// },
// {
// key:"品德",
// midTerm:0,
// endTerm:0
// },
// ]
ret["gkcj"] = {title:"各科成绩", dataList:gkcj};
// let xqzhmscjData = await getReqApiData(xshxgrWENUM.获取学生成绩综合信息, {studentId, type:"综合面试"}); //todo
let xqzhmscj = [
{
key:"学期综合面试成绩",
value:thisStuXycj.xqzhmscj
}
];
ret["xqzhmscj"] = {title:"学期综合面试成绩", dataList:xqzhmscj};
/**科技素养课程、人文素养课程、艺术素养课程、健康素养课程 */
let kjsy = getXykc(excelData["科技素养"].dataList, studentId, "xsid");
let rwsy = getXykc(excelData["人文素养"].dataList, studentId, "xsid");
let yssy = getXykc(excelData["艺术素养"].dataList, studentId, "xsid");
let jksy = getXykc(excelData["健康素养"].dataList, studentId, "xsid");
let xykc = [
{title:"科技素养课程", count:kjsy.count, dataList:kjsy.data},
{title:"人文素养课程", count:rwsy.count, dataList:rwsy.data},
{title:"艺术素养课程", count:yssy.count, dataList:yssy.data},
{title:"健康素养课程", count:jksy.count, dataList:jksy.data}
]
ret["xykc"] = {title:"修业课程", dataList:xykc};
let wcqkData = await getReqApiData(xshxgrWENUM.九加一完成情况, {studentId});
// let wcqk9加1 = {
// project:"每个学期完成一个课题研究",
// speak:"每个学段进行一次公开演讲",
// visitTechnology:"每个假期参观一个科技场馆",
// communityServices:"每个假期参加一次社区服务",
// readClassicBook:"每个月阅读一本经典书籍",
// sportsHobby:"每位学生拥有一项运动爱好",
// readingReport:"每个学期举办一场读书报告",
// instrumental:"每位学生掌握一门乐器演奏",
// performance:"每个学段参加一次公开表演",
// write:"每位学生能写一手好字"
// };
let wcqk = [];
for(let key in wcqkData) {
let value = parseFloat(wcqkData[key]) || 0;
wcqk.push({key, value});
}
ret["wcqk"] = {title:"九+一完成情况", dataList:wcqk};
// let xssyData = await getReqApiData(xshxgrWENUM.学生素养, {studentId}); //todo
let xssy = [
{
key:"科技素养",
value:"16%"
},
{
key:"艺术素养",
value:"21%"
},
{
key:"健康素养",
value:"63%"
},
{
key:"人文素养",
value:"51%"
},
];
ret["xssy"] = {title:"学生素养", dataList:xssy};
// let xydtData = getReqApiData(xshxgrWENUM.学业动态, {studentId}); // todo
// let xydt = {
// rcdp:12,
// dataList:[
// {
// key:"思想品德",
// value:14,
// rate:"45%"
// },
// {
// key:"学业水平",
// value:4,
// rate:"15%"
// },
// {
// key:"社会实践",
// value:12,
// rate:"60%"
// },
// ]
// };
// ret["dtxy"] = {title:"动态-学业", dataList:xydt};
// let jkdtData = getReqApiData(xshxgrWENUM.健康动态, {studentId}); // todo
// let jkdt = {
// rcdp:12,
// dataList:[
// {
// key:"身体健康",
// value:14,
// rate:"45%"
// },
// {
// key:"学业水平",
// value:4,
// rate:"15%"
// },
// {
// key:"社会实践",
// value:12,
// rate:"60%"
// },
// ]
// };
// ret["dtjk"] = {title:"动态-健康", dataList:jkdt};
/**todo 接口接入方式不一致,最后修改 */
// let dtData = await postReqApiData(xshxgrWENUM.学生日常行为规范, {personId:studentId, schoolId, classId});
let dt = [
{
key:"思想品德",
value:12
},
{
key:"学业水平",
value:15
},
{
key:"艺术素养",
value:7
},
{
key:"身心健康",
value:1
},
{
key:"社会实践",
value:3
}
];
ret["dt"] = {title:"动态", rcdp:12, dataList:dt};
//todo
let czjy = {
teacher: "", //老师成长寄语
parents: "", //家长成长寄语
};
// let teacherMsg = await getReqApiData(xshxgrWENUM.老师成长寄语, {studentId});
// let parentsMsg = await getReqApiData(xshxgrWENUM.家长成长寄语, {studentId});
ret["czjy"] = {title:"成长寄语", dataList:czjy};
ret["sxgw"] = {title:"随想感悟", dataList:sxgw};
//todo
// let cxjsysjnlData = await getReqApiData(xshxgrWENUM.创新精神与实践能力, {studentId});
let cxjsysjnl = [
{
key:"个人完成",
value:0,
rate:"0"
},
{
key:"合作完成",
value:0,
rate:"0"
}
];
ret["cxjsysjnl"] = {title:"创新精神与实践能力", dataList:cxjsysjnl};
let cxjsysjnlChart = {
titleList:[
"时间", "类型", "课题名称", "指导老师", "是否跨学科"
],
dataList:[
[
"2024-01-26",
"探究学习报告",
"*********",
"李**",
"是"
],
]
};
ret["cxjsysjnlxxsj"] = {title:"创新精神与实践能力表格", dataList:cxjsysjnlChart};
//todo 无数据返回
// let hjcgData = await getReqApiData(xshxgrWENUM.奖项统计, {studentId, pageNo:1, pageSize:100});
// let hjcg = {
// gjj:[],
// sj:[],
// qj:[],
// xj:[]
// };
//调试数据
let hjcg = {
gjj:[],
sj:[],
qj:[],
xj:[
// {
// time:"2023/11/4",
// name:"第五届秋季运动会六年级组男子组4分钟跳绳比赛第一"
// },
// {
// time:"2023/10/13",
// name:"第五届秋季运动会六年级男子组跳远比赛第二名"
// },
// {
// time:"2023/10/1",
// name:"9月月度之星"
// },
]
};
let hjcgData = stuInfo.honorList;
if (hjcgData.length) {
hjcgData.forEach( info => {
// let {awardLevel, awardTime, awardName} = info;
let {level, levelName, title, honorTime} = info;
let hjcjTime = moment(honorTime).format("YYYY-MM-DD");
switch (levelName) {
// case 1:
case "国家级":
hjcg.gjj.push({
time:hjcjTime,
name:title
})
break;
// case 3:
case "市级":
hjcg.sj.push({
time:hjcjTime,
name:title
})
break;
// case 4:
case "区级":
hjcg.qj.push({
time:hjcjTime,
name:title
})
break;
// case 5:
case "校级":
hjcg.xj.push({
time:hjcjTime,
name:title
})
break;
}
})
}
let hjcgList = [
{
key:"国家级",
value:hjcg.gjj
},
{
key:"市级",
value:hjcg.sj
},
{
key:"区级",
value:hjcg.qj
},
{
key:"校级",
value:hjcg.xj
},
]
ret["hjcg"] = {title:"获奖成果", dataList:hjcgList};
//todo
let gjglhdcyData = await getReqApiData(xshxgrWENUM.各级各类活动参加, {studentId, pageNo:1, pageSize:100});
let gjglhdcyCount = [
{
"key":"科技",
"value":3
},
{
"key":"人文",
"value":6
},
{
"key":"艺术",
"value":3
},
{
"key":"健康",
"value":5
},
];
ret["gjglhdcyCount"] = {title:"各级各类活动参与", dataList:gjglhdcyCount};
let gjglhdcy = {
"titleList":[
"类型", "时间", "活动名称"
],
"dataList":[
[
"科技", //科技、人文、艺术、健康
"2023/11/4",
"中国科学院上海药物研究所研学活动",
],
[
"人文",
"2023/11/4",
"中国科学院上海药物研究所研学活动",
],
[
"艺术",
"2023/11/4",
"中国科学院上海药物研究所研学活动",
],
[
"健康",
"2023/11/4",
"中国科学院上海药物研究所研学活动",
],
]
};
ret["gjglhdcy"] = {title:"各级各类活动参与表格", dataList:gjglhdcy};
let zpzs = [
{
"key":"活动瞬间",
"value":"10"
},
{
"key":"个人风采",
"value":"8"
}
];
ret["zpzs"] = {title:"作品展示", dataList:zpzs};
let zpzstp = [
{
"key":"活动瞬间",
"value":"http://*******.jpg"
},
{
"key":"个人风采",
"value":"http://*******.jpg"
},
{
"key":"科技活动",
"value":"http://*******.jpg"
},
{
"key":"个人风采",
"value":"http://*******.jpg"
},
];
ret["zpzstp"] = {title:"作品展示图片", dataList:zpzstp};
// todo
let sjhdjl = {
titleList:["时间", "实践主题", "场所", "课时"],
dataList:[
["2024-04-24", "这里是实践主题", "这里是场所", "18"],
["2024-04-24", "这里是实践主题", "这里是场所", "18"],
["2024-04-24", "这里是实践主题", "这里是场所", "18"],
["2024-04-24", "这里是实践主题", "这里是场所", "18"],
["2024-04-24", "这里是实践主题", "这里是场所", "18"],
["2024-04-24", "这里是实践主题", "这里是场所", "18"],
]
};
ret["sjhdjl"] = {title:"实践活动记录", dataList:sjhdjl};
res.send(ret);
}
/**
* 获取学生列表
* @param grade 年级id
* @param classNum 班级 协定id 1就是1班
* @param name 名称 模糊查询
* @returns
*/
export async function selectStudentList( grade:number, classNum:number, name:string ) {
let reqBody:any = {};
if (grade) reqBody.gradeId = grade;
if (classNum) reqBody.classNum = classNum;
if (name) reqBody.studentName = name;
let reqData:any = await getReqApiData(xshxgrWENUM.获取学生列表, reqBody, 'page');
let dataList = [];
if (reqData) {
reqData.forEach(info => {
let {studentId, studentName, className, gradeId, studentSort} = info;
dataList.push({
studentName,
gradeName:changeEnumValue(GRADEENUM, parseInt(gradeId)),
className,
studentSort,
studentId
});
});
}
return { dataList };
}
/**
* 获取对应学生id的表格数据
* @param oldConf 表格数据原本的key
* @param newConf 需要修改成的中文key
* @param dataList 表格数据
* @param name 匹配数据的参数
* @param subName 参数匹配数据的字段key
* @returns [{key:"", value:""}, {}]
*/
export function getOneChange(oldConf, newConf, dataList, name?, subName?){
let reg = new RegExp(name);
let data = [];
dataList.forEach(info => {
if (reg.test(info[subName])) {
for(let i = 0; i < newConf.length; i++) {
data.push({
key: newConf[i],
value: info[oldConf[i]] || ""
})
}
}
});
return data;
}
/**
* 修改统计修业课程
* @param dataList
* @param name
* @param subName
* @returns
*/
export function getXykc(dataList, name?, subName?){
let reg = new RegExp(name);
let data = [];
let count = 0;
dataList.forEach(info => {
if (reg.test(info[subName])) {
count += info.ks;
data.push({
key:info.kcmc || "待开发",
value:info.ks || ""
});
}
});
return {data, count};
}
/**
* 校园文化标识、发展里程碑
*/
import { xyfzlcbWENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import { xywhbsTableData } from "../../data/table/duiwai";
import { readFileList } from "../outData";
const ImgUrl = "img/对外/校园文化标识/";
export async function getData(req, res) {
let ret:any = {};
const NowTime = new Date();
let excelData = xywhbsTableData();
let xyxwData = excelData['校园新闻'].dataList;
let xyxw = [];
xyxwData.forEach( info => {
let {img, title, value} = info;
let imgUrl = readFileList(`${ImgUrl}${img}/`, [], "jpg");
xyxw.push({img:imgUrl, title, value});
})
ret["xyxw"] = {title:"校园新闻", dataList:xyxw};
//发展里程碑数据直接页面写死,不过接口
res.send(ret);
}
/**
* 整体办学(对外)
*/
import { ztbxWENUM } from "../../config/interficeEnum";
import { getReqApiData } from "../../data/interface/url";
import moment = require("moment");
import { getKeyValue, hasImages } from "../outData";
import { jyzjshxTableData, tysjyTableData, xshxTableData, ztbxTableData } from "../../data/table/duiwai";
import { keyValuePackage, onceYBarChartPackage } from "../../dataPackage/inFrontOut";
import { systemConfig } from "../../config/serverConfig";
import { jshxTableData } from "../../data/table/duinei";
export async function getData(req, res) {
let ret:any = {};
let excelData = ztbxTableData();
let 统一excelData = tysjyTableData();
let jshxexcelData = jshxTableData()
let xxhxExcelData = xshxTableData();
const NowTime = new Date();
let startTime = moment("2024-01-01").format("YYYY-MM-DD 00:00:00")
let endTime = moment(NowTime).format("YYYY-MM-DD HH:mm:ss")
let xshbqkData = await getReqApiData(ztbxWENUM.各学段学生变化情况, {});
let zsrs = 0;
let xshbqk = {};
xshbqkData.studentNum.forEach( info => {
let {code, name, value} = info;
zsrs += value;
if(!xshbqk[code]) xshbqk[code] = []
xshbqk[code].push({
key:name,
value,
})
});
let nianji = ["小学", "初中", "高中"];
let zsrstj = {};
for(let sjd in xshbqk) {
zsrstj[sjd] = {}
for(let i = 0; i < nianji.length; i++) {
zsrstj[sjd][nianji[i]] = 0;
};
let xshbqkList = xshbqk[sjd];
for (let sj in zsrstj) {
xshbqkList.forEach( info => {
let {key, value} = info;
zsrstj[sjd][key] = value;
})
};
};
let xssbhqk = {};
for(let key in zsrstj) {
if (!xssbhqk[key]) xssbhqk[key] = [];
for(let name in zsrstj[key]) {
xssbhqk[key].push({key:name, value:zsrstj[key][name]});
}
}
ret["zsrs"] = {title:"招生人数", dataList:[{key:"招生人数", value:zsrs}]};
ret["xshbqk"] = {title:"学生数变化情况", dataList:xssbhqk};
let jszy = keyValuePackage(excelData["教师情况"].dataList);
ret["jszy"] = {title:"教师资源", dataList:jszy};
// let xlfbData = await getReqApiData(ztbxWENUM.学历分布, {type:"education"});
// let xlfbConf = {"大学专科毕业":"大专", "大学本科毕业":"本科", "硕士研究生毕业":"硕士", "博士研究生毕业":"博士"};
// let xlfbList = {};
// xlfbData.forEach( info => {
// let count = parseInt(info.count) || 0;
// let type = info.type || "";
// for(let key in xlfbConf) {
// switch (type) {
// case key:
// xlfbList[xlfbConf[key]] = count;
// break;
// default:
// if (!xlfbList["其他"]) xlfbList["其他"] = count;
// else xlfbList["其他"] += count;
// break;
// }
// }
// });
// let xlfb = [];
// for (let key in xlfbList) {
// xlfb.push({key, value:xlfbList[key]});
// };
let xlfb = jshxexcelData["学历分布"].dataList;
ret["xlfb"] = {title:"学历分布", dataList:xlfb};
let nlfb = jshxexcelData["年龄分布"].dataList;
ret["nlfb"] = {title:"年龄分布", dataList:nlfb};
// let nlfbData = await getReqApiData(ztbxWENUM.年龄分布, {type:"age"});
// let nlfb = getKeyValue(nlfbData);
// ret["nlfb"] = {title:"年龄分布", dataList:nlfb};
// let jyzdjData = await getReqApiData(ztbxWENUM.教研组搭建, {}); //todo
let jyzjsConf = ["语文", "数学", "英语", "综理", "综文", "体育", "艺术"];
let jyzjsCount = {};
let jyzjs = {};
for(let i = 0; i < jyzjsConf.length; i++) {
let jyzExcelData = jyzjshxTableData(`${jyzjsConf[i]}组`);
let jszyTableData = jyzExcelData["教师资源"].dataList;
jyzjsCount[jyzjsConf[i]] = jszyTableData.length;
if (!jyzjs[jyzjsConf[i]]) jyzjs[jyzjsConf[i]] = [];
jszyTableData.forEach( info => {
let {cy, xb, zzmm, nl, zc, xl} = info;
jyzjs[jyzjsConf[i]].push(cy);
});
}
// let jyzjs = {
// 语文:["宋大轩", "唐秋芳", "卢彤", "涂紫璇", "孙彧"],
// 数学:["姜涛", "刘林娜", "齐艳平", "沈众辰", "刘璐"],
// 英语:["周小彦", "吴楚珺", "田泉月", "钱雨青", "何仰东"],
// 综理:["段婷婷", "柴园园", "姜晏", "徐子平", "周杨"],
// 综文:["龚思毓", "陈柏松", "朱倢", "刘艳丽", "王蕾"],
// 体育:["王梵", "李钰", "陈昀端", "张雪莲", "高超"],
// 艺术:["王康", "宋楚莹", "陈斐成", "冯琪涵", "刘陆"],
// };
// let jyzjsCount = {
// 语文:37, 数学:25, 英语:22, 综理:15, 综文:8, 体育:14, 艺术:9,
// };
let jyzdj = [];
for(let key in jyzjs){
let dataList = [];
for(let i = 0; i < jyzjs[key].length; i++) {
let has = hasImages(`./img/对外/整体办学教研组/${key}/`, `${jyzjs[key][i]}.png`);
let img = "";
if (has) img = `${systemConfig.ipUrl}对外/整体办学教研组/${key}/${jyzjs[key][i]}.png`;
else img = `${systemConfig.ipUrl}对外/整体办学教研组/默认.png`
dataList.push({
key:jyzjs[key][i],
value:img
})
}
jyzdj.push({name:key, data:dataList, count:jyzjsCount[key]});
}
ret["jyzdj"] = {title:"教研组搭建", dataList:jyzdj};
let kjss = keyValuePackage(excelData["空间设施"].dataList);
ret["kjss"] = {title:"空间设施", dataList:kjss};
let xsbjData = await getReqApiData(ztbxWENUM.学生人数班级数量, {})
let bjsl = xsbjData.classNum;
let xsrsData = xsbjData.studentNum;
let xsrs = 0;
xsrsData.forEach( info=> {
let {code, name, value} = info;
xsrs += value;
})
let baseDate = [
{
key:"学生人数",
value: xsrs
},
{
key:"班级数量",
value: parseInt(bjsl)
}
];
//教师人数和教辅人员改为excel表格数据
统一excelData["教师人员"].dataList.forEach(info => {
baseDate.push(info);
})
ret["jcsj"] = {title:"基础数据", dataList:baseDate};
let zhafData = await getReqApiData(ztbxWENUM.智慧安防出入人数, {startDate:startTime, endDate:endTime, pageSize:100, pageNum:1});
let zhafCount = 0;
let crrs = {chu:0, ru:0};
if (zhafData) {
if (zhafData.list.length > 0) {
let zhafry = zhafData.list;
zhafCount = zhafry.length;
zhafry.forEach( info => {
let enterOrExit = info.enterOrExit; //0:出、1:入
if (enterOrExit == 0) crrs.chu += enterOrExit;
else crrs.ru += enterOrExit;
})
}
}
let zhaf = [
{
key:"人员总流量",
value:zhafCount || 0 //todo
},
{
key:"入",
value:crrs.ru || 0 //todo
},
{
key:"出",
value:crrs.chu || 0 //todo
},
];
ret["zhafrll"] = {title:"智慧安防人流量", dataList:zhaf};
let zhafQuery = {startDate:startTime, endDate:endTime, pageSize:100, pageNum:1, type:"alarm"};
let zhafyjlbData =await getReqApiData(ztbxWENUM.智慧安防预警列表, zhafQuery); // todo
let zhafyjlb = {
titleList: ["预警时间", "预警名称", "等级", "状态"],
dataList:[
["2024.04.09", "闸机故障", "二级", "处理中"],
["2024.04.09", "未知人员XXX", "一级", "已处理"],
["2024.04.09", "车辆堵塞", "四级", "已处理"],
]
}
ret["zhafyjlb"] = {title:"预警列表", dataList:zhafyjlb};
// let tshdData = await getReqApiData(ztbxWENUM.特色活动, {}); //todo
let xyhdData = excelData["校园活动"].dataList;
let xyhd = [];
xyhdData.forEach( info => {
let hdData = [];
let {hdtp, hdmc, hdsj, hddd, hdxs} = info;
hdData.push(
{ key:"活动照片", value:[`${systemConfig.ipUrl}对外/整体办学校园活动/${hdtp}.png`] },
{ key:"活动名称", value:hdmc },
{ key:"活动时间", value:hdsj },
{ key:"活动地点", value:hddd },
{ key:"活动形式", value:hdxs }
);
xyhd.push(hdData);
})
ret["xyhd"] = {title:"校园活动", dataList:xyhd};
let kjsyExcelData = onceYBarChartPackage(excelData["办学特色-科技素养"], '', '');
let kjsyData = getBxtsData(kjsyExcelData.dataInfo);
let kjsy = {
"baseData": kjsyData.keyValueResult,
"trendData": kjsyData.chartResult
}
ret["kjsy"] = {title:"科技素养", dataList:kjsy};
let rwsyExcelData = onceYBarChartPackage(excelData["办学特色-人文素养"], '', '');
let rwsyData = getBxtsData(rwsyExcelData.dataInfo);
let rwsy = {
"baseData": rwsyData.keyValueResult,
"trendData": rwsyData.chartResult
}
ret["rwsy"] = {title:"人文素养", dataList:rwsy};
let yssyExcelData = onceYBarChartPackage(excelData["办学特色-艺术素养"], '', '');
let yssyData = getBxtsData(yssyExcelData.dataInfo);
let yssy = {
"baseData": yssyData.keyValueResult,
"trendData": yssyData.chartResult
}
ret["yssy"] = {title:"艺术素养", dataList:yssy};
let jksyExcelData = onceYBarChartPackage(excelData["办学特色-健康素养"], '', '');
let jksyData = getBxtsData(jksyExcelData.dataInfo);
let jksy = {
"baseData": jksyData.keyValueResult,
"trendData": jksyData.chartResult
}
ret["jksy"] = {title:"健康素养", dataList:jksy};
// let jsczjcsjData = await getReqApiData(ztbxWENUM.教师成长基础数据, {}); //todo
let tsstjcsj = keyValuePackage(xxhxExcelData["特色社团基础数据"].dataList);
let jsczjcsj = [
{
key:"参与教师总数",
value:tsstjcsj[0].value
},
{
key:"特色课程创建次数",
value:tsstjcsj[0].value
}
];
ret["jsczjcsj"] = {title:"教师成长", dataList:jsczjcsj};
// let jsczData = await getReqApiData(ztbxWENUM.教师成长饼图数据, {}); //todo
// let jscz = [
// {
// key:"艺术素养",
// value:21
// },
// {
// key:"健康素养",
// value:37
// },
// {
// key:"科技素养",
// value:24
// },
// {
// key:"人文素养",
// value:17
// }
// ];
let jscz = keyValuePackage(xxhxExcelData["特色社团课程数"].dataList);
ret["jscz"] = {title:"教师成长饼图", dataList:jscz};
// let xscz9个1 = {
// project:"每个学期完成一个课题研究",
// speak:"每个学段进行一次公开演讲",
// visitTechnology:"每个假期参观一个科技场馆",
// communityServices:"每个假期参加一次社区服务",
// readClassicBook:"每个月阅读一本经典书籍",
// sportsHobby:"每位学生拥有一项运动爱好",
// readingReport:"每个学期举办一场读书报告",
// instrumental:"每位学生掌握一门乐器演奏",
// performance:"每个学段参加一次公开表演",
// write:"每位学生能写一手好字"
// };
// for(let key in xscz9个1) {
// let name = xscz9个1[key];
// let value = parseFloat(xsczData[key]) || 0;
// xscz.push({key:name, value});
// }
let xsczData = await getReqApiData(ztbxWENUM.统计学生九个一完成情况, {type:"school"});
let xscz = [];
for(let key in xsczData) {
let value = parseFloat(xsczData[key]) || 0;
xscz.push({key, value});
}
let maxValue = getObjectMaxValue(xsczData);
ret["xscz"] = {title:"学生成长", dataList:xscz, max:maxValue};
// let ryjxxsData = await getReqApiData(ztbxWENUM.荣誉奖项学生, {}); //todo
// let ryjxjsData = await getReqApiData(ztbxWENUM.荣誉奖项教师, {}); //todo
// let ryjxxxData = await getReqApiData(ztbxWENUM.荣誉奖项学校, {}); //todo
let ryjxxs = {
"baseData": [
{
key:"国家级",
value: 184
},
{
key:"市级",
value: 109
},
{
key:"区级",
value: 40
},
{
key:"校级",
value: 518
},
],
"trendData": [
{
key:"2019",
value: 30
},
{
key:"2020",
value: 15
},
{
key:"2021",
value: 20
},
{
key:"2022",
value: 50
},
{
key:"2023",
value: 20
},
{
key:"2024",
value: 10
},
]
}
ret["ryjxxs"] = {title:"荣誉奖项学生", dataList:ryjxxs};
let ryjxjs = {
"baseData": [
{
key:"国家级",
value: 6
},
{
key:"市级",
value: 114
},
{
key:"区级",
value: 35
},
{
key:"校级",
value: 0
},
],
"trendData": [
{
key:"2019",
value: 30
},
{
key:"2020",
value: 15
},
{
key:"2021",
value: 20
},
{
key:"2022",
value: 50
},
{
key:"2023",
value: 20
},
{
key:"2024",
value: 10
},
]
}
ret["ryjxjs"] = {title:"荣誉奖项教师", dataList:ryjxjs};
let ryjxxx = {
"baseData": excelData["办学成果-学校"].dataList,
"trendData": excelData["办学成果趋势-学校"].dataList,
}
ret["ryjxxx"] = {title:"荣誉奖项学校", dataList:ryjxxx};
let bysqx = keyValuePackage(excelData["毕业生去向"].dataList);
let bysqxqst = onceYBarChartPackage(excelData["毕业生去向趋势图"], "", "");
ret["bysqx"] = {title:"毕业生去向", dataList:bysqx};
ret["bysqxqst"] = {title:"毕业生去向趋势图", dataList:bysqxqst};
/**查看目标、查看明细弹窗 todo */
// let ckmb = [
// {key:"九个一完成情况", value:""}
// ];
let ckmb = keyValuePackage(excelData["九个一完成情况文本介绍"].dataList);
ret["ckmb"] = {title:"查看目标", dataList:ckmb};
let ckmx = {
titleList:excelData["特色课程创新明细"].headerList[0],
dataList:excelData["特色课程创新明细"].bodyList
};
ret["ckmx"] = {title:"特色课程创新明细", dataList:ckmx};
res.send(ret);
}
/**
* 获取最大数
* @param obj
* @returns
*/
function getObjectMaxValue(obj) {
let maxValue = -Infinity;
for (let key in obj) {
let num = parseFloat(obj[key]);
if (obj.hasOwnProperty(key) && typeof num === 'number' && num > maxValue) {
maxValue = num;
}
}
return maxValue === -Infinity ? null : maxValue;
}
function getBxtsData(data) {
let keyValueResult = [];
let chartResult = [];
let bxts = {};
let bxtsChart = {};
for(let type in data) {
/**计算key,value */
if(!bxts[type]) bxts[type] = 0;
let kjsyInfo = data[type];
kjsyInfo.forEach( info => {
bxts[type] += info.value;
});
/**计算chart */
data[type].forEach( info => {
let {key, value, unit} = info;
if (!bxtsChart[key]) bxtsChart[key] = 0;
bxtsChart[key] += value;
});
};
for(let key in bxts) {
keyValueResult.push({key, value:bxts[key]});
};
for(let key in bxtsChart) {
chartResult.push({key, value:bxtsChart[key]});
}
return {keyValueResult, chartResult};
}
import { systemConfig } from "../config/serverConfig";
const fs = require("fs");
const path = require('path');
// 图片文件的扩展名数组
const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.svg'];
export function getKeyValue(data) {
let result = [];
data.forEach( info => {
let {count, type} = info;
result.push({
key:type,
value:count
})
})
return result;
}
/**
* 获取教师画像图片
* @param dirPath 文件地址
* @param filesList 存放数据数组
* @param ext 文件类型
* @returns
*/
export function readFileList(dirPath, filesList, ext) {
let files = fs.readdirSync(dirPath);
// console.log(files);
for (let i = 0; i < files.length; i++) {
let itm = files[i];
let stat = fs.statSync(dirPath + itm);
if (stat.isDirectory()) { //判断文件是否是目录
//递归读取文件
readFileList(dirPath + itm + "/", filesList, ext)
} else if (path.extname(itm).toLowerCase() === `.${ext}`) {
let filePath = `${dirPath}${itm}`;
/**截取掉地址前面的pdf/ */
let pdfToRemove = filePath.replace(new RegExp(`^img/`), "");
let fileStr = `${systemConfig.ipUrl}${pdfToRemove}`;
filesList.push(fileStr);
}
}
return filesList;
}
/**
* 获取指定路径下的所有图片
* @param dirPath
* @param filesList
* @param ext
* @returns
*/
export function getImagesInDir(dirPath) {
let files = fs.readdirSync(dirPath);
let images = [];
files.forEach(file => {
let filePath = `${dirPath}${file}`;
/**截取掉地址前面的pdf/ */
let pdfToRemove = filePath.replace(new RegExp(`^img/`), "");
let fileStr = `${systemConfig.ipUrl}${pdfToRemove}`;
// let fullPath = path.join(dirPath, file);
let ext = path.extname(file).toLowerCase();
if (imageExtensions.includes(ext)) {
let nameWithoutExt = path.basename(file, ext);
// 如果是图片文件,则添加到结果数组中
images.push({
name:nameWithoutExt,
img:fileStr
});
}
// 注意:这里没有递归调用,所以不会检查子文件夹
});
return images;
}
/**
* 检查文件夹内是否有指定名称的图片文件
* @param dirPath 文件夹路径
* @param fileName 文件名称
* @returns
*/
export function hasImages(dirPath, fileName) {
let filePath = path.join(dirPath, fileName);
let has = fs.existsSync(filePath);
return has;
}
// 检查文件是否为图片文件的函数
function isImageFile(file) {
let ext = path.extname(file).toLowerCase();
return imageExtensions.includes(ext);
}
/**-----------------------------接口枚举------------------------------- */
/**
* 接口更新类型
*/
export enum INTERFACEREQUESTTYPEENUM {
即时更新 = 1,
定时更新
}
export enum TYPEENUM {
string = 1,
number,
object,
array,
boolean,
}
/**上传文件类型 */
export enum FILETYPE {
word = 1,
pdf,
图片,
视频,
多类型
}
//年级
export enum GRADEENUM {
一年级 = 1,
二年级,
三年级,
四年级,
五年级,
六年级,
七年级,
八年级,
九年级,
高一,
高二,
高三
}
export enum ERRORENUM {
未找到数据,
数据操作失败,
暂无对应数据,
文件不存在,
参数错误,
地址数据不完整,
请完善信息,
接口数据获取失败,
TOKEN获取失败,
TOKEN更新失败
}
export enum SYSTEMERRORENUM {
参数错误 = 1,
请求参数错误,
暂无对应数据,
初始化配置失败
}
export enum INTERFACEERRORENUM {
"系统错误" = 10001,
"服务暂停" = 10002,
"远程服务调用失败" = 10003,
"IP地址受限,不能访问此接口" = 10004,
"APP Key 不存在" = 10005,
"签名错误" = 10006,
"缺少 POST 参数" = 10007,
"POST 参数错误" = 10008,
"数据类别标识不存在" = 10009,
"数据对象标识不存在" = 10010,
"对数据对象没有写的权限" = 10011,
"对数据对象没有读的权限" = 10012,
"数据记录不存在" = 10013,
"数据记录的 id 已存在" = 10014,
"应用程序内部错误" = 10099,
}
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
/**
* 考勤信息
*/
export enum KAOQINGENUM {
获取时间段内出勤人员信息 = "/getTeacherReport",
教师参加考勤人数统计 = "/getTeacherReport",
教师参加考勤人员名单 = "/getTeacherClockingNameList",
教师考勤统计 = "/getTeacherClockingState",
教师个人考勤统计 = "/getTeacherClockingPerson",
}
/**校园发展和发展里程碑 */
export enum xyfzlcbWENUM {
校园新闻 = "",
发展里程碑 = "",
}
/**整体办学(对外) */
export enum ztbxWENUM {
各学段学生变化情况 = "/getYearStuLeaveCountEvent",
学历分布 = "/getTeacherStatistics",
年龄分布 = "/getTeacherStatistics",
// 教研组搭建 = "", // /getTeachingClass
学生人数班级数量 = "/getClassAndStuCountEvent",
// 教师人数 = "",
// 职工人数 = "",
智慧安防出入人数 = "/getSecurityVisitor",
访客记录列表 = "/getSecurityVisitor",
智慧安防预警列表 = "/getSecurityEvent",
// 特色活动 = "",
// 热门活动 = "",
// 办学特色科技素养 = "",
// 办学特色人文素养 = "",
// 办学特色艺术素养 = "",
// 办学特色健康素养 = "",
// 教师成长基础数据 = "",
// 教师成长饼图数据 = "",
统计学生九个一完成情况 = "/getCountStuTenComplete",
// 荣誉奖项学生 = "",
// 荣誉奖项教师 = "",
// 荣誉奖项学校 = "",
// 毕业生去向 = "",
}
/**教师画像(对外) */
export enum jshxWENUM {
// 教师资源 = "",
年龄分布 = "/getTeacherStatistics",
教师政治面貌 = "/getTeacherStatistics",
奖项统计 = "/getStuAwards",
市区校级课题 = "/api/portrait/sqxjkt",
获奖情况 = "/api/portrait/jxbscyqk",
专业发展成果 = "/api/portrait/zyfzcg",
参与主持各级培训 = "/api/portrait/cyzcgjpx",
参与科研情况 = "/api/portrait/cykyqk",
教师病假人数趋势 = "/getTeacherLeaveLine",
教研活动 = "/api/portrait/jyhd",
}
/**学生画像(对外) */
export enum xshxWENUM {
近视率 = "/getVisionDefect",
特异体质 = "",
特异体质同比 = "",
各年级近视率 = "/getGradeVisionDefect",
各年级特异体质 = "/getAtopy",
// 市平均近视率 = "",
学校学生数班级数 = "/getClassAndStuCountEvent",
各年级班级学生数统计 = "/getClassAndStuCountEvent", //参数:grade:年级(1:一年级、2:二年级......)
// 社会实践不同类型的课时占比 = "",
// 不同年级课时占比 = "",
奖项统计 = "/getStuAwards",
获取学生成长档案信息 = "/rest/api/queryStudentInfo.do",
// 校园特色活动 = "",
// 校园特色活动汇总 = "",
// 学科探究活动 = "",
// 项目化探究活动 = "",
// 年级课题列表明细 = "",
// 各年级创新情况 = "",
// 社会实践活动记录 = "",
// 社会考察 = "",
// 公益劳动 = "",
// 职业体验 = "",
// 安全实训 = "",
// 获奖成果展示 = "",
}
/**学生画像个人 */
export enum xshxgrWENUM {
学生照片 = "/queryStuModel",
获取学生列表 = "/getStudentList",
学生过敏情况 = "/getAllergy",
获取学生特异体质 = "/getAtopy",
获取学生体质健康 = "/getTzjkOne",
学生BMI趋势 = "/getBmiLine",
学生视力 = "/getVision",
获取学生活动列表 = "/getStuActivity",
获取学生各类活动统计 = "/getCountStuActivity",
获取学生成长档案个人信息 = "/rest/api/queryStudentInfo.do",
获取学生成绩综合信息 = "/getStuScore",
获取学生各科成绩 = "/getStudentInfoScore",
获取学生个人特长 = "/getStuPersonality",
九加一完成情况 = "/getStuTenComplete",
奖项统计 = "/getStuAwards",
各级各类活动参加 = "/getStuActivity",
学生日常行为规范 = "/studentDimensionRadar",
}
/**学生档案弹窗 */
export enum xsdaWENUM {
学生照片 = "/queryStuModel",
// 学生素养 = "",
// 老师成长寄语 = "",
获取学生体质健康 = "/getTzjkOne",
学生视力 = "/getVision",
// 身高成长记录 = "",
// 体重成长记录 = "",
视力记录 = "/getVision",
学科成绩分布 = "/getStuScore",
奖项统计 = "/getStuAwards",
}
/**水平分析弹窗 */
export enum spfxWENUM {
九加一完成情况 = "/getCountStuTenComplete",
}
//====================================================对内=======================================================
/**整体办学(对内) */
export enum ztbxNENUM {
天气信息 = "/weather",
教师考勤统计 = "/getTeacherClockingState",
教师病假人数趋势 = "/getTeacherLeaveLine",
学生请假统计 = "/student-apply-count", //post
学生病假人数趋势 = "/getStuLeaveCount",
学生人数班级数量 = "/getClassAndStuCountEvent",
获取班级列表信息 = "/queryClassList",
智慧安防出入人数 = "/getSecurityVisitor", //post
每日食谱 = "/getCookbook",
水质检测 = "/getWaterQuality",
课表安排 = "/getCourseSchedule",
调代课记录 = "/getMoveSubject",
日程信息 = "/getCalendar",
参加考勤人员名单 = "/getTeacherClockingNameList",
教师当天请假人数 = "/getTeacherLeave",
}
/**教师画像(对内) */
export enum jshxNENUM {
教师资源 = "",
教师男女比例 = "/getTeacherInfoList",
学历分布 = "/getTeacherStatistics",
教龄分布 = "/getTeacherStatistics",
年龄分布 = "/getTeacherStatistics",
教师政治面貌 = "/getTeacherStatistics",
职称分布 = "/getTeacherStatistics",
// 教研组搭建 = "", // /getTeachingClass
// 组织构成 = "",
// 教研目标 = "",
// 基础数据 = "",
// 特色课程创建 = "",
// 跨学科教学 = "",
// 专业发展成果 = "",
// 参与主持人各级培训 = "",
// 活动类型参与趋势分析 = "",
// 科研情况 = "",
获取教师信息 = "/queryGradeSubjectTea",
获取近七天出勤人员 = "/getTeacherReport",
教师调代课记录 = "/getMoveSubject",
获奖情况 = "/api/portrait/jxbscyqk",
听评课情况 = "/api/portrait/tpkqk",
任务听评课情况 = "/api/portrait/rwtpk",
全员导师制 = "/api/portrait/qydsz",
}
/**教师筛选(对内) */
export enum jssxNENUM {
各年级学科 = "/getGradeSubject",
各年级学科老师 = "/queryGradeSubjectTea",
}
/**教师个人发展(对内) */
export enum jsgrfzNENUM {
教师基本信息 = "/getTeacherInfoList",
教师任教班级 = "/getTeachingClass",
教师经历 = "/api/portrait/jxjl",
}
/**年级组教师画像(对内) */
export enum njzjshxNENUM {
教师基本信息 = "/getTeacherInfoList",
// 教师资源 = "",
学历分布 = "/getTeacherStatistics",
教龄分布 = "/getTeacherStatistics",
年龄分布 = "/getTeacherStatistics",
教师政治面貌 = "/getTeacherStatistics",
职称分布 = "/getTeacherStatistics",
获奖统计 = "/api/portrait/jxbscyqk",
教师男女比例 = "/getTeacherInfoList",
}
/**教研组教师画像 接口提供全部没有教研组区分,需要重新提供 */
export enum jyzjshxNENUM {
// 教师资源 = "",
教师男女比例 = "/getTeacherInfoList",
学历分布 = "/getTeacherStatistics",
教龄分布 = "/getTeacherStatistics",
年龄分布 = "/getTeacherStatistics",
教师政治面貌 = "/getTeacherStatistics",
职称分布 = "/getTeacherStatistics",
获奖统计 = "/getStuAwards",
}
/**学生画像年级 */
export enum xshxNENUM {
体质监测各年级合格率优良率 = "/getCountTzjkPassRatioGrade",
体质监测各班级合格率优良率 = "/getCountTzjkPassRatioClass",
查询各年级BMI = "/getCountTzjkBmiRatioGrade",
查询各班级BMI = "/getCountTzjkBmiRatioClass",
获取学生信息 = "/getStudentList",
获取部门负责人 = "/getDeptHeader",
获取班级数学生数 = "/getClassAndStuCountEvent",
学生九个一完成情况 = "/getCountStuTenComplete",
查询各年级视力不良率 = "/getVisionDefect",
查询年级各班级视力不良率 = "/getGradeClassVisionDefect",
}
const path = require('path');
import * as fs from "fs";
import { BizError, SysError } from "../util/bizError";
import { analysisXml } from "../util/myXML";
import {ServerConfig} from "../config/systemClass";
import { SYSTEMERRORENUM } from "./errorEnum";
export let systemConfig = new ServerConfig;
const ConfigName = "serverConfig.xml";
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", "ipUrl", "url", "sign", "appKey", "appSecret"];
checkConfig(integralConfig, configInfo.config);
let {port, ipUrl, url, sign, appKey, appSecret} = configInfo.config;
systemConfig.port = parseInt(port[0]);
systemConfig.ipUrl = ipUrl[0];
systemConfig.url = url[0];
systemConfig.sign = sign[0];
systemConfig.appKey = appKey[0];
systemConfig.appSecret = appSecret[0];
}
} 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;
ipUrl:string;
url:string;
sign:string;
appKey:string;
appSecret:string;
}
import { updateToken } from "./interface/url";
/**
* 初始化缓存数据 和相关凭证
*/
export async function initData() {
await updateToken();
}
//接口任务 定期更新
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 { INTERFACEREQUESTTYPEENUM } from "../../config/enum";
import { systemConfig } from "../../config/serverConfig";
//配置
// "接口名称":{
// type:"1是即时更新 2是即时更新 使用 INTERFACErEQUESTTYPEENUM",
// time:"更新频率毫秒 例如1小时这里就是 3600000",
// url:"url地址",
// reqType:"get还是post get = get post = post",
// header:{},
// body:{}
// }
export const Config = {
"校园文化标识":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"", reqType:"get", header:{}, body:{}},
"发展里程碑":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"", reqType:"get", header:{}, body:{}},
"整体办学对外":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"", reqType:"post", header:{}, body:{}},
"教师画像对外":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"", reqType:"post", header:{}, body:{}},
"学生画像对外":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"", reqType:"post", header:{}, body:{}},
"学生画像个人":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"", reqType:"post", header:{}, body:{}},
"学生档案弹窗":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"", reqType:"post", header:{}, body:{}},
"水平分析弹窗":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"", reqType:"post", header:{}, body:{}},
};
import moment = require("moment");
import { ERRORENUM } from "../../config/errorEnum";
import { systemConfig } from "../../config/serverConfig";
import { BizError } from "../../util/bizError";
import { get, post, postForm } from "../../util/request";
const CryptoJS = require('crypto-js');
const Crypto = require('crypto');
let token = "";//post 请求凭证
/**
* 封装get请求
*/
export async function getReqApiData(url:string, body:object, mothod?, dataNotInList?, jkmc?) {
let ms = new Date().valueOf();
let appSecret = systemConfig.appSecret;
let appKey = systemConfig.appKey;
if (!mothod) mothod = "GET";
let stage = "1";
let auths = `${systemConfig.appKey}&${mothod}&${stage}&${ms}`;
let hash = CryptoJS.HmacSHA256(auths, CryptoJS.enc.Base64.parse(appSecret));
let hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
const headers = {
"TY-Stage": stage,
"TY-AppKey": systemConfig.appKey,
"TY-Timestamp": ms,
"TY-Signature": hashInBase64
}
let query:any = Object.assign(body, {client_id:appKey});
if (jkmc == "jsfz") query = Object.assign(body, {app_key:appKey});
if (jkmc == "platform") query = Object.assign(body, {platformCode:999999});
//todo 没有找到对应接口,数据直接返回0
if (!url) return 0;
let res:any = await get(`${systemConfig.url}${url}`, query, headers );
if (dataNotInList) return res[dataNotInList];
if (res.page) return res.page;
if (res.list) return res.list;
// else return res.body;
else return res;
}
/**
* 封装的post请求
* @param url 请求路由
* @param body 请求参数
* @returns
*/
export async function postReqApiData(url:string, body:object) {
let ms = new Date().valueOf();
const AppKey = systemConfig.appKey;
const SignatureStr = `${AppKey}&POST&1&${ms}`;
const Hash = CryptoJS.HmacSHA256(SignatureStr, CryptoJS.enc.Base64.parse(systemConfig.appSecret));
const Base64Str = CryptoJS.enc.Base64.stringify(Hash);
let headers = {
"TY-Stage":"1",
"TY-AppKey":AppKey,
"TY-Timestamp":ms,
"TY-Signature":Base64Str
};
let query = { accessToken:token };
let res:any = await postForm(`${systemConfig.url}${url}?accessToken=${token}`, query, body, headers );
// let res:any = await post(`${systemConfig.url}${url}?accessToken=${token}`, query, body, headers );
if (res.retCode != "000000") {
/**更新token */
await updateToken();
res = await postForm(`${systemConfig.url}${url}?accessToken=${token}`, query, body, headers );
}
return res;
}
/**
* 更新token
*/
export async function updateToken() {
let timeStamp = new Date().valueOf();
let appId = 'F3D05D1E729B366ABDEFBD5380815DA7';
// let appId = 'AD0CB88FD07BAB073EFEEE64ECD17B4D';
let appKey = '376f898f9ba7432f90c640d5485c194c';
let data = `${appId}${appKey}${timeStamp}`;
const AppKey = systemConfig.appKey;
const SignatureStr = `${AppKey}&GET&1&${timeStamp}`;
const Hash = CryptoJS.HmacSHA256(SignatureStr, CryptoJS.enc.Base64.parse(systemConfig.appSecret));
const Base64Str = CryptoJS.enc.Base64.stringify(Hash);
let headers = {
"TY-Stage":"1",
"TY-AppKey":AppKey,
"TY-Timestamp":timeStamp,
"TY-Signature":Base64Str
};
let reqBody = {
appId,
timeStamp,
keyInfo:hmacSHA1(data, appKey),
platformCode:"999999"
}
let res:any = await post(`https://api-gateway.sasu.shanghaitech.edu.cn/getAccessToken`, {}, reqBody, headers);
if (res.retCode == '000000') {
let {accessToken} = res.tokenInfo;
console.log("token 更新=>", accessToken);
if (accessToken) token = accessToken;
else throw new BizError(ERRORENUM.TOKEN获取失败);
} else {
throw new BizError(ERRORENUM.TOKEN更新失败);
}
}
function hmacSHA1(data, key) {
let mac = Crypto.createHmac('sha1', Buffer.from(key, 'UTF-8'));
mac.update(Buffer.from(data, 'UTF-8'));
return mac.digest('hex');
}
/**
* 加密
*/
export async function getBase64Str() {
let timeStamp = new Date().valueOf();
let appId = 'F3D05D1E729B366ABDEFBD5380815DA7';
let appKey = '376f898f9ba7432f90c640d5485c194c';
let data = `${appId}${appKey}${timeStamp}`;
const AppKey = systemConfig.appKey;
const SignatureStr = `${AppKey}&GET&1&${timeStamp}`;
const Hash = CryptoJS.HmacSHA256(SignatureStr, CryptoJS.enc.Base64.parse(systemConfig.appSecret));
const Base64Str = CryptoJS.enc.Base64.stringify(Hash);
return Base64Str;
}
/**
* 获取token
*/
export async function getAppToken() {
let timeStamp = new Date().valueOf();
let appId = 'F3D05D1E729B366ABDEFBD5380815DA7';
// let appId = 'AD0CB88FD07BAB073EFEEE64ECD17B4D';
let appKey = '376f898f9ba7432f90c640d5485c194c';
let data = `${appId}${appKey}${timeStamp}`;
const AppKey = systemConfig.appKey;
const SignatureStr = `${AppKey}&GET&1&${timeStamp}`;
const Hash = CryptoJS.HmacSHA256(SignatureStr, CryptoJS.enc.Base64.parse(systemConfig.appSecret));
const Base64Str = CryptoJS.enc.Base64.stringify(Hash);
let headers = {
"TY-Stage":"1",
"TY-AppKey":AppKey,
"TY-Timestamp":timeStamp,
"TY-Signature":Base64Str
};
let reqBody = {
appId,
timeStamp,
keyInfo:hmacSHA1(data, appKey),
platformCode:"999999"
}
let res:any = await post(`https://api-gateway.sasu.shanghaitech.edu.cn/getAccessToken`, {}, reqBody, headers);
let validTime = parseInt(res.tokenInfo.validTime);
console.log(moment(validTime).format("YYYY-MM-DD HH:mm:ss"));
if (res.retCode == '000000') {
let {accessToken} = res.tokenInfo;
console.log("token 更新=>", accessToken);
if (accessToken) {
token = accessToken;
return token;
}
else throw new BizError(ERRORENUM.TOKEN获取失败);
} else {
throw new BizError(ERRORENUM.TOKEN更新失败);
}
}
/**
* 获取ticket
*/
export async function getAppTicket(ticket) {
let ms = new Date().valueOf();
let appSecret = systemConfig.appSecret;
let appKey = systemConfig.appKey;
let mothod = "GET";
let stage = "1";
let auths = `${systemConfig.appKey}&${mothod}&${stage}&${ms}`;
let hash = CryptoJS.HmacSHA256(auths, CryptoJS.enc.Base64.parse(appSecret));
let hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
const headers = {
"TY-Stage": stage,
"TY-AppKey": systemConfig.appKey,
"TY-Timestamp": ms,
"TY-Signature": hashInBase64
}
let query = Object.assign({}, {client_id:appKey});
//todo 没有找到对应接口,数据直接返回0
let accessToken = await getAppToken();
let res:any = await get(`${systemConfig.url}/getTicket?ticket=${ticket}&accessToken=${accessToken}`, query, headers);
return res;
}
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 ztbxTableData() {
let blockDataList = onceSheetBecomeOfblockData('对内.xlsx', '整体办学');
let keyValueOrTitleList = ['教学常规', '作业批改情况', '迟到类型', '食堂检测', '食堂其他信息']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = []; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
/**
* 弃用,改为接口
* @returns
*/
export function xxgzapTableData() {
let blockDataList = onceSheetBecomeOfblockData('对内.xlsx', '学校工作安排');
let keyValueOrTitleList = ['一', '二', '三', '四', '五', '六', '日']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = []; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function xxzdhdTableData() {
let blockDataList = onceSheetBecomeOfblockData('对内.xlsx', '学校重大活动');
let keyValueOrTitleList = ['一', '二', '三', '四', '五', '六', '日']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = []; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function jshxTableData() {
let blockDataList = onceSheetBecomeOfblockData('对内.xlsx', '教师画像');
let keyValueOrTitleList = ['男女人数', '学历分布', '教龄分布', '年龄分布', '教师政治面貌', '职称分布', '师资结构', '学科导师团队',
'教师学分获取汇总数据', '教师学分获取', '1-4年级总课时量', '5-9年级总课时量', '高中部总课时量']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = ['校本课程', '拓展课程', '选修课程', '进修课程数据']; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function njzjshxTableData(sheetName) {
let blockDataList = onceSheetBecomeOfblockData('年级组教师信息.xlsx', sheetName);
let keyValueOrTitleList = ['教师资源', '学科导师占比', '满工作量的人数', '不满工作量的人数', '超工作量的人数', '听评课情况', '出勤考核-日', '出勤考核-周', '出勤考核-月',
'整体出勤率-日', '整体出勤率-周', '整体出勤率-月', '会议出勤情况-日', '会议出勤情况-周', '会议出勤情况-月', '请假情况-日', '请假情况-周', '请假情况-月',
'请假原因占比分析-日', '请假原因占比分析-周', '请假原因占比分析-月', '教研活动', '教研活动详细', '课题参与次数', '公开课参与次数', '教师进修培训情况',
'大学听课', '名师工作室', '基地学习', '校本研修', '奖项数量', '教学比赛参与情况', '教学满意度反馈一至四', '教学满意度反馈五至九', '教学满意度反馈高中',
'工作坊活动参与情况']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = ['优秀班主任导师', '课题参与', '公开课参与', '教学比赛参与情况详细']; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function jsgrfzTableData() {
let blockDataList = onceSheetBecomeOfblockData('对内.xlsx', '教师画像个人');
let keyValueOrTitleList = ['学生评价', '学生平均评价', '同行评价', '同行平均评价', '参与创建特色课程', '教师研修学分获取', '学分', '课程', '填报学期', '上学期', '下学期', '历年满勤统计']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = ['参与创建特色课程详细', '教师研修学分获取详细']; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function xshxnjzTableData(sheetName) {
let blockDataList = onceSheetBecomeOfblockData('年级组学生信息.xlsx', sheetName);
let keyValueOrTitleList = ['品德发展与公民素养', '综合评价', '修业课程与学业成绩-优秀', '修业课程与学业成绩-良好', '修业课程与学业成绩-合格', '创新精神与实践能力',
'科技素养-基础数据', '人文素养-基础数据', '艺术素养-基础数据', '健康素养-基础数据',
'科技素养-年级课题列表明细', '人文素养-年级课题列表明细', '艺术素养-年级课题列表明细', '健康素养-年级课题列表明细',
'科技素养-各班级创新情况', '人文素养-各班级创新情况', '艺术素养-各班级创新情况', '健康素养-各班级创新情况',
'各级各类活动', '获奖成果展示']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = ['科技素养-年级课题列表明细表格', '人文素养-年级课题列表明细表格', '艺术素养-年级课题列表明细表格', '健康素养-年级课题列表明细表格',
'各级各类活动-科技素养', '各级各类活动-人才素养', '各级各类活动-艺术素养', '各级各类活动-健康素养']; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function xshxgrTableData() {
let blockDataList = onceSheetBecomeOfblockData('对内.xlsx', '学生画像个人');
let keyValueOrTitleList = ['科技素养', '人文素养', '艺术素养', '健康素养']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = []; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function xycjTableData() {
let blockDataList = onceSheetBecomeOfblockData('对内.xlsx', '学业成绩');
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 tysjyTableData() {
let blockDataList = onceSheetBecomeOfblockData('对外.xlsx', '统一数据源');
let keyValueOrTitleList = ['教师人员']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = []; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function ztbxTableData() {
let blockDataList = onceSheetBecomeOfblockData('对外.xlsx', '整体办学');
let keyValueOrTitleList = ['教师情况', '空间设施', '毕业生去向', '办学成果-学校', '办学成果趋势-学校', '九个一完成情况文本介绍', '校园活动']; //适配 饼图 键值以及需要多个Key的
let barChartList = ['毕业生去向趋势图', '办学特色-科技素养', '办学特色-人文素养', '办学特色-艺术素养', '办学特色-健康素养']; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = ["特色课程创新明细"]; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function jshxTableData() {
let blockDataList = onceSheetBecomeOfblockData('对外.xlsx', '教师画像');
let keyValueOrTitleList = ['校内导师', '基础数据', '学科导师占比', '大学与附校互聘共育', '参与创建教师数', '教师照片墙', '教师获奖', '项目化学习总数', '项目化学习']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = ['班主任导师', '特色课程创建']; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function xshxTableData() {
let blockDataList = onceSheetBecomeOfblockData('对外.xlsx', '学生画像');
let keyValueOrTitleList = ['英才计划', '特色社团基础数据', '特色社团课程数', '健康素养', '科技素养', '艺术素养', '人文素养', '校园特色活动汇总',
'探究学习-基础数据', '探究学习-年级课题列表明细', '探究学习-各年级创新情况', '科学实验-基础数据', '科学实验-年级课题列表明细', '科学实验-各年级创新情况',
'社会考究-基础数据', '社会考究-年级课题列表明细', '社会考究-各年级创新情况', '创新作品-基础数据', '创新作品-年级课题列表明细', '创新作品-各年级创新情况',
'社会实践活动记录', '获奖成果展示']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = ['学生干部小学部', '学生干部初中部', '学生会干部', '录取名单', '荣誉学生', '特色社团课程数表格', '热门社团TOP5',
'社会考察', '公益劳动', '职业体验', '安全实训',
'探究学习-年级课题列表明细弹窗', '科学实验-年级课题列表明细弹窗', '社会考究-年级课题列表明细弹窗', '创新作品-年级课题列表明细弹窗',]; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function xywhbsTableData() {
let blockDataList = onceSheetBecomeOfblockData('对外.xlsx', '校园文化标识');
let keyValueOrTitleList = ['校园新闻']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = []; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function jyzjshxTableData(sheetName) {
let blockDataList = onceSheetBecomeOfblockData('教研组教师信息.xlsx', sheetName);
let keyValueOrTitleList = ['教师资源', '荣誉获得数', '教研活动', '教研活动详细', '满工作量的人数', '不满工作量的人数', '超工作量的人数', '听评课情况', '科研', '教研',
'参与创建特色课程', '学分', '教师研修学分获取', '教研组均分', '教学满意度反馈', '工作坊活动参与情况']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = ['专业荣誉详细', '科研详细', '教研详细', '参与创建特色课程详细']; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function njzjshxTableData(sheetName) {
let blockDataList = onceSheetBecomeOfblockData('年级组教师信息.xlsx', sheetName);
let keyValueOrTitleList = ['教师资源']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = []; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
//打包完数据之后的处理
/**
* 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;
}
/**
* 修改表格数据结构
* @param titleList
* @param dataList
* @returns
*/
export function change(titleList, dataList) {
let data = [];
dataList.forEach(subList => {
let onceData:any = {};
subList.forEach( (item, index)=> {
let key = titleList[index];
onceData[key] = item;
} );
data.push(onceData);
});
return data;
}
/**
* 获取单条线路数据
* @param line 线路
* @param data 数据
* @param conf 配置
* @returns
*/
export function getLineOneData(line, data, conf) {
let result:any = {};
data.forEach(item => {
let dataLine = item.line;
if (line == dataLine) {
for (let name = 0; name < conf.length; name++) {
result[conf[name]] = item[conf[name]];
}
}
});
return result;
}
/**
* 单条弹窗数据
* @param line 线路
* @param data 数据
* @param conf 配置
* @returns
*/
export function getPopupOneData(line, data, conf) {
let result:any = {};
data.forEach(item => {
let dataLine = item.line;
let dataSite = item.site;
if (line == dataLine) {
if (!result[dataSite]) result[dataSite] = {};
for (let name = 0; name < conf.length; name++) {
result[dataSite][conf[name]] = item[conf[name]];
}
}
});
return result;
}
/**
* 多条弹窗数据
* @param line
* @param data
* @param conf
* @returns
*/
export function getPopupMoreData(line, data, conf) {
let result:any = {};
data.forEach(item => {
let dataLine = item.line;
let dataSite = item.site;
let pipelineRelocationData = {};
if (line == dataLine) {
if (!result[dataSite]) result[dataSite] = {site:item.site, state:item.state, data:[]};
for (let name = 0; name < conf.length; name++) {
pipelineRelocationData[conf[name]] = item[conf[name]];
}
result[dataSite]["data"].push(pipelineRelocationData);
}
});
return result;
}
/**
* 弹窗详细数据
* @param id
* @param tableData
* @param changeConf
* @param conf
* @returns
*/
export function getPopupDetailsData(id, tableData, changeConf, conf, name) {
let details:any = {};
for (let key in tableData) {
if (id == key) {
let data = change(changeConf, tableData[key].bodyList );
data.forEach(item => {
let itemName = item[name];
let detailsData = {};
if (!details[itemName]) details[itemName] = [];
for (let name = 0; name < conf.length; name++) {
detailsData[conf[name]] = item[conf[name]];
}
details[itemName].push(detailsData);
});
}
}
let detailsList = [];
for (let key in details) {
detailsList.push({name: key, dataList: details[key]})
}
return detailsList;
}
\ No newline at end of file
//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 需要的数据
* @param 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 += parseInt(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: Math.round(typeChangeValue * 100) /100, unit});
});
return {title, total: Math.round(total * 100) /100, 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 { httpServer } from "./net/http_server";
import { initConfig, systemConfig } from "./config/serverConfig";
import { initData } from "./data/dataInit";
import { getAppToken } from "./data/interface/url";
async function lanuch() {
await initConfig();
// await initData();
httpServer.createServer( systemConfig.port );
console.log('This indicates that the server is started successfully.');
await getAppToken();
}
lanuch();
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 * as crypto from 'crypto';
import { getInterfaceByInterfaceName } from '../data/interface/cronJob';
import { BizError } from '../util/bizError';
/**
* 加密
* @param text 要加密的明文
* @param key 密码
* @param iv 偏移量
* key和iv都应为16字节长
* @returns
*/
export function encrypt(text, key, iv) {
let cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
let encrypted = cipher.update(text, 'utf8', 'base64');
encrypted += cipher.final('base64');
return encrypted;
}
/**
* 解密
* @param encrypted 要解密的密文
* @param key 密码
* @param iv 偏移量
* key和iv都应为16字节长
* @returns
*/
export function decrypt(encrypted, key, iv) {
let decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
let decrypted = decipher.update(encrypted, 'base64', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
export async function getToken() {
let appId = "sec_dt_platform";
let plaintext = appId + new Date().valueOf();
let key = 'b81d56b0071dc916';
let iv = 'b81d56b0071dc916';
let signature = encrypt(plaintext, key, iv);
let data = await getInterfaceByInterfaceName("获取token接口", {appId, signature});
let token = "";
if (!data) throw new BizError("获取token失败");
let {success, message, code, timestamp, result, requestId} = data;
if (success) {
token = result;
} else {
throw new BizError(`${code} ${message} 获取token失败`)
}
return token;
}
\ No newline at end of file
export function httpErrorHandler(err, req, res, next) {
console.log("in httpErrorHandler");
console.log(err);
//todo 自定义错误编码
if (err) {
if (err.message == "您的登录已失效" ) {
res.success({success:false, msg:err.message, code:501});
next();
}
else if (err.message == "您的账户没有访问权限") {
res.success({success:false, msg:"非常抱歉,您没有权限,请联系工作人员!", code:502});
next();
} else if ( err.message == "token已过期") {
res.success({success:false, msg:"token失效", code:503});
next();
}
else {
res.success({success:false, msg:err.message, code:500});
next();
}
}
}
\ No newline at end of file
export function watch(req, res, next) {
res.success = success.bind({res:res, req:req});
return next();
}
function success(data) {
let resultPack;
if (data ) {
if ( data.success === undefined || data.success === true ) {
resultPack = {data, success:true, code:200};
}
else {
resultPack = data;
}
}else {
resultPack = {code:500, success:false, msg:'result is null'};
}
this.res.send(resultPack);
}
import express = require('express');
import bodyParser = require('body-parser');
import routers = require('../routers/router');
import compression = require('compression');
import * as fallback from 'express-history-api-fallback';
import * as path from "path";
import { watch } from '../middleware/watch';
import { httpErrorHandler } from '../middleware/httpErrorHandler';
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');
res.header("Authorization", 'Basic SzEyUlBDOksxMlJQQ1B3ZA==');
if(req.method === 'OPTIONS'){
res.statusCode = 200;
res.end();
}else{
next();
}
});
httpServer.use(bodyParser.json({limit:"20kb"}));
httpServer.use(compression())
httpServer.use(watch);
routers.setRouter(httpServer);
httpServer.use(httpErrorHandler);
httpServer.use(express.static(path.join(__dirname, "../../img/")) );
httpServer.use(express.static(path.join(__dirname, "../../pdf/")) );
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 xywhbsBiz from '../biz/duiwai/xywhbs';
import * as ztbxBiz from '../biz/duiwai/ztbx';
import * as jshxBiz from '../biz/duiwai/jshx';
import * as xshxBiz from '../biz/duiwai/xshx';
import * as xshxgrBiz from '../biz/duiwai/xshxgr';
import * as xsdatcBiz from '../biz/duiwai/xsdatc';
import * as spfxtcBiz from '../biz/duiwai/spfxtc';
//对内
import * as ztbxNBiz from '../biz/duinei/ztbx';
import * as jshxNBiz from '../biz/duinei/jshx';
// import * as njzjshxNBiz from '../biz/duinei/njzjshx';
import * as njzjshxNBiz from '../biz/duinei/njzjshx';
import * as jsgrfzNBiz from '../biz/duinei/jsgrfz';
import * as jyzjshxNBiz from '../biz/duinei/jyzjshx';
import * as xshxNBiz from '../biz/duinei/xshx';
import * as sxjkNBiz from '../biz/duinei/sxjk';
import * as zhsjhdcyqkNBiz from '../biz/duinei/zhsjhdcyqk';
import * as xyspNBiz from '../biz/duinei/xysp';
import * as jssxNBiz from '../biz/duinei/jssx';
import { getHashStr, getTicket } from '../biz/duiwai/getHash';
export function setRouter(httpServer){
httpServer.post('/gethashstr', asyncHandler(getHashStr));
httpServer.get('/getticket', asyncHandler(getTicket));
httpServer.get('/dw/fzlcb', asyncHandler(xywhbsBiz.getData));
httpServer.get('/dw/ztbx', asyncHandler(ztbxBiz.getData));
httpServer.get('/dw/jshx', asyncHandler(jshxBiz.getData));
httpServer.get('/dw/jshx/kxkjx', asyncHandler(jshxBiz.getKxkjx));
httpServer.get('/dw/jshx/kyqk', asyncHandler(jshxBiz.getKyqk));
httpServer.get('/dw/jshx/sqxjkt', asyncHandler(jshxBiz.getSqxjkt));
httpServer.get('/dw/xshx', asyncHandler(xshxBiz.getData));
httpServer.get('/dw/xshxgr', asyncHandler(xshxgrBiz.getData));
httpServer.get('/dw/xsdatc', asyncHandler(xsdatcBiz.getData));
httpServer.get('/dw/spfxtc', asyncHandler(spfxtcBiz.getData));
httpServer.post('/dw/fzlcb', asyncHandler(xywhbsBiz.getData));
httpServer.post('/dw/ztbx', asyncHandler(ztbxBiz.getData));
httpServer.post('/dw/jshx', asyncHandler(jshxBiz.getData));
httpServer.post('/dw/jshx/kxkjx', asyncHandler(jshxBiz.getKxkjx));
httpServer.post('/dw/jshx/kyqk', asyncHandler(jshxBiz.getKyqk));
httpServer.post('/dw/jshx/sqxjkt', asyncHandler(jshxBiz.getSqxjkt));
httpServer.post('/dw/xshx', asyncHandler(xshxBiz.getData));
httpServer.post('/dw/xshxgr', asyncHandler(xshxgrBiz.getData));
httpServer.post('/dw/xsdatc', asyncHandler(xsdatcBiz.getData));
httpServer.post('/dw/spfxtc', asyncHandler(spfxtcBiz.getData));
//====================对内=======================
httpServer.get('/dn/ztbx', asyncHandler(ztbxNBiz.getData));
httpServer.get('/dn/getclass', asyncHandler(ztbxNBiz.getClass));
httpServer.get('/dn/getkcap', asyncHandler(ztbxNBiz.getKcap));
httpServer.get('/dn/jshx', asyncHandler(jshxNBiz.getData));
httpServer.get('/dn/jshx/kyqk', asyncHandler(jshxNBiz.getKyqk));
httpServer.get('/dn/njzjshx', asyncHandler(njzjshxNBiz.getData));
httpServer.get('/dn/jsgrfz', asyncHandler(jsgrfzNBiz.getData));
httpServer.get('/dn/jyzjshx', asyncHandler(jyzjshxNBiz.getData));
httpServer.get('/dn/xshx', asyncHandler(xshxNBiz.getData));
httpServer.get('/dn/xshxgr', asyncHandler(xshxNBiz.getStudent));
/**身心健康 */
httpServer.get('/dn/sxjk/tzjc', asyncHandler(sxjkNBiz.getTzjc));
httpServer.get('/dn/sxjk/xscqqk', asyncHandler(sxjkNBiz.getXscqqk));
httpServer.get('/dn/sxjk/tzcsqk', asyncHandler(sxjkNBiz.getTzcsqk));
/**综合实践活动参与情况 */
httpServer.get('/dn/zhsjhdcyqk/tddyhd', asyncHandler(zhsjhdcyqkNBiz.getTddyhd));
httpServer.get('/dn/zhsjhdcyqk/jcsj', asyncHandler(zhsjhdcyqkNBiz.getData));
httpServer.get('/dn/zhsjhdcyqk/bjtshd', asyncHandler(zhsjhdcyqkNBiz.getBjtshd));
/**学业水平 */
httpServer.get('/dn/xysp/gxkcjfx', asyncHandler(xyspNBiz.getGxkcjfx));
httpServer.get('/dn/xysp/bxqxkbhqs', asyncHandler(xyspNBiz.getBxqxkbhqs));
httpServer.get('/dn/xysp/jcsj', asyncHandler(xyspNBiz.getData));
httpServer.get('/dn/xysp/rank', asyncHandler(xyspNBiz.getRank));
/**筛选弹窗 */
httpServer.get('/dn/grade', asyncHandler(jssxNBiz.getGrade));
httpServer.get('/dn/gradesubject/tea', asyncHandler(jssxNBiz.getGradeSubjectTea));
httpServer.post('/dn/ztbx', asyncHandler(ztbxNBiz.getData));
httpServer.post('/dn/getclass', asyncHandler(ztbxNBiz.getClass));
httpServer.post('/dn/getkcap', asyncHandler(ztbxNBiz.getKcap));
httpServer.post('/dn/jshx', asyncHandler(jshxNBiz.getData));
httpServer.post('/dn/jshx/kyqk', asyncHandler(jshxNBiz.getKyqk));
httpServer.post('/dn/njzjshx', asyncHandler(njzjshxNBiz.getData));
httpServer.post('/dn/jsgrfz', asyncHandler(jsgrfzNBiz.getData));
httpServer.post('/dn/jyzjshx', asyncHandler(jyzjshxNBiz.getData));
httpServer.post('/dn/xshx', asyncHandler(xshxNBiz.getData));
httpServer.post('/dn/xshxgr', asyncHandler(xshxNBiz.getStudent));
httpServer.post('/dn/sxjk/tzjc', asyncHandler(sxjkNBiz.getTzjc));
httpServer.post('/dn/sxjk/xscqqk', asyncHandler(sxjkNBiz.getXscqqk));
httpServer.post('/dn/sxjk/tzcsqk', asyncHandler(sxjkNBiz.getTzcsqk));
httpServer.post('/dn/zhsjhdcyqk/tddyhd', asyncHandler(zhsjhdcyqkNBiz.getTddyhd));
httpServer.post('/dn/zhsjhdcyqk/jcsj', asyncHandler(zhsjhdcyqkNBiz.getData));
httpServer.post('/dn/zhsjhdcyqk/bjtshd', asyncHandler(zhsjhdcyqkNBiz.getBjtshd));
httpServer.post('/dn/xysp/gxkcjfx', asyncHandler(xyspNBiz.getGxkcjfx));
httpServer.post('/dn/xysp/bxqxkbhqs', asyncHandler(xyspNBiz.getBxqxkbhqs));
httpServer.post('/dn/xysp/jcsj', asyncHandler(xyspNBiz.getData));
httpServer.post('/dn/xysp/rank', asyncHandler(xyspNBiz.getRank));
httpServer.post('/dn/grade', asyncHandler(jssxNBiz.getGrade));
httpServer.post('/dn/gradesubject/tea', asyncHandler(jssxNBiz.getGradeSubjectTea));
httpServer.get('/bmfzr', asyncHandler(zhsjhdcyqkNBiz.getBmfzr));
}
import { ERRORENUM } from "../config/errorEnum";
import { BizError } from "../util/bizError";
/**
* 校验value是否符合传入的枚举
* @param name 被掉用名称 用于输出异常日志
* @param key 目标字段 用于输出异常日志
* @param enumConf 目标枚举
* @param value 目标值
* 无返回 有异常直接报错
*/
export function eccEnumValue(name:string, key:string, enumConf, value:any) {
let eccSuccess = true;
if ( typeof value == 'number' ) {
if (!enumConf[value] ) eccSuccess = false;
} else if (Array.isArray(value)) {
value.forEach(item => {
if ( !enumConf[item] ) eccSuccess = false;
});
}
if (!eccSuccess) throw new BizError(ERRORENUM.请完善信息, `${name} 下的 ${key} 字段值为 ${value} 不满足枚举范围`);
}
/**
* 将枚举值转换成对应的枚举名(key)
* @param enumConf 目标枚举
* @param value 目标值
* @returns string 返回字符串 如果传入多个枚举值,就拼接字符串
*/
export function changeEnumValue(enumConf, value:any) {
if (!value) return '';
if ( typeof value == 'number' ) {
let str = enumConf[value];
/**特化处理 */
if(/_dou/.test(str)) str = str.replace(/_dou/gm, ",");
if(/_zyh/.test(str)) str = str.replace(/_zyh/gm, "“");
if(/_yyh/.test(str)) str = str.replace(/_yyh/gm, "”");
if(/_dun/.test(str)) str = str.replace(/_dun/gm, "、");
if(/_ju/.test(str)) str = str.replace(/_ju/gm, "。");
return str
} else if (typeof value == 'string') {
try {//兼容数据库 '[1,2,3]'
value = JSON.parse(value);
}catch(err) {
return enumConf[parseInt(value)];
}
}
let str = "";
value.forEach((item, index) => {
let subStr = enumConf[item];
/**特化处理 */
if(/_dou/.test(subStr)) subStr = subStr.replace(/_dou/gm, ",");
if(/_zyh/.test(subStr)) subStr = subStr.replace(/_zyh/gm, "“");
if(/_yyh/.test(subStr)) subStr = subStr.replace(/_yyh/gm, "”");
if(/_dun/.test(subStr)) subStr = subStr.replace(/_dun/gm, "、");
if(/_ju/.test(subStr)) subStr = subStr.replace(/_ju/gm, "。");
str += subStr;
if (index == value.length-1) str+="";
else str += ","
});
return str;
}
\ No newline at end of file
/**
* 校验参数工具
*
*/
import { ERRORENUM } from "../config/errorEnum";
import { BizError } from "../util/bizError";
/**
* 通过config校验表单参数param
* 包括类型 String, Number, Boolean, [Number], [Object]
* 参数是必填
* 方法会校验表单中存在的多余字段
* @param name 被调用的方法名
* @param config 校验配置
* @param param 需要校验的参数
* @returns true 无需关注返回
*/
export function eccFormParam(name:string, keyTypeConf:object, param:object) {
/**校验多余字段 */
for (let key in param) {
if (!keyTypeConf[key]) throw new BizError(ERRORENUM.参数错误, name, `多余${key}字段`);
}
/**校验已填参数 */
for (let key in keyTypeConf ) {
let {type, notMustHave} = keyTypeConf[key];
let isError = false; //校验是否异常
let errorStr = "";//异常说明
let value = param[key];
let valueType = typeof value;
if ( value == null || value == undefined ) {
if (!notMustHave) throw new BizError(ERRORENUM.参数错误, name, `缺失${key}字段`);
} else {
switch(type) {
case 'Number':
if ( type.toLowerCase() != valueType ) {
isError = true;
} else {
if ((""+param[key]).indexOf('.') > -1) {
param[key] = parseInt(`${param[key] *1000}`)/1000;
}
}
break;
case 'String':
case 'Boolean':
if ( type.toLowerCase() != valueType ) isError = true;
break;
case '[Number]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'number' ) {
isError = true;
errorStr = `${key}应是number型数组其中下标${i}${typeof item}`;
}
}
break;
case '[String]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'string' ) {
isError = true;
errorStr = `${key}应是String型数组其中下标${i}${typeof item}`;
}
}
break;
case '[Object]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'object' ) {
isError = true;
errorStr = `${key}应是object型数组其中下标${i}${typeof item}`;
}
}
break;
case 'Address':
/**地址类型 基本数据类型为数组字符串但是要判断层级关系 */
if ( !Array.isArray(param[key]) ) {
isError = true;
errorStr = `${key}应是数组形`;
}
if ( param[key].length != 4) {
isError = true;
errorStr = `${key}超过特定长度4 目前长度 ${param[key].length}`;
}
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'string' ) {
isError = true;
errorStr = `${key}应是string型数组其中下标${i}${typeof item}`;
}
}
/** 不符合规则的 */
let nullIndex = -1;
for (let i = 0; i < param[key].length; i++) {
if (nullIndex != -1) {//出现过空 第一次出现后的位置 都不能有值
if (param[key]) {
//做一个特化
throw new BizError(ERRORENUM.地址数据不完整, name, `${key} 下标 ${nullIndex} 为空 `);
}
}
if (nullIndex == -1 && !param[key][i]) {
/**按顺序第一次赋值 */
nullIndex = i;
}
}
break;
}
errorStr = isError && errorStr == "" ? `${key}应该是${type}型 而不是${valueType}`: errorStr;
if ( isError ) throw new BizError(ERRORENUM.请完善信息, name, errorStr);
}
}
return true;
}
/**
* 根据conf配置校验请求参数
* @param conf 配置
* @param param 表单
* @param skipKeys []不必填的字段
*/
export function eccReqParamater(conf:object, param, skipKeys?) {
skipKeys = skipKeys || [];
let skipMap = {};
skipKeys.forEach(keyName => {
skipMap[keyName] = 1;
});
/**校验多余字段 */
for (let key in param) {
if (!conf[key]) throw new BizError(ERRORENUM.参数错误, `多余${key}字段`);
}
/**校验必填和缺失字段 */
for (let key in conf) {
let confType = conf[key];
let value = param[key];
let valueType = typeof value;
if ( value == null || value == undefined ) {
if (!skipMap[key]) throw new BizError(ERRORENUM.参数错误, `缺失${key}字段`);
} else {
let isError = false;
let errorStr = "";
switch(confType) {
case 'Number':
if ( confType.toLowerCase() != valueType ) isError = true;
else {
if ((""+param[key]).indexOf('.') > -1) {
param[key] = parseInt(`${param[key] *100}`)/100;
}
}
break;
case 'String':
case 'Boolean':
if ( confType.toLowerCase() != valueType ) isError = true;
break;
case '[Number]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'number' ) {
isError = true;
errorStr = `${key}应是number型数组其中下标${i}${typeof item}`;
}
}
break;
case '[String]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'string' ) {
isError = true;
errorStr = `${key}应是String型数组其中下标${i}${typeof item}`;
}
}
break;
case '[Object]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'object' ) {
isError = true;
errorStr = `${key}应是object型数组其中下标${i}${typeof item}`;
}
}
break;
case 'Address':
/**地址类型 基本数据类型为数组字符串但是要判断层级关系 */
if ( !Array.isArray(param[key]) ) {
isError = true;
errorStr = `${key}应是数组形`;
}
if ( param[key].length != 4) {
isError = true;
errorStr = `${key}超过特定长度4 目前长度 ${param[key].length}`;
}
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'string' ) {
isError = true;
errorStr = `${key}应是string型数组其中下标${i}${typeof item}`;
}
}
/** 不符合规则的 */
let nullIndex = -1;
for (let i = 0; i < param[key].length; i++) {
if (nullIndex != -1) {//出现过空 第一次出现后的位置 都不能有值
if (param[key]) {
//做一个特化
throw new BizError(ERRORENUM.地址数据不完整, `${key} 下标 ${nullIndex} 为空 `);
}
}
if (nullIndex == -1 && !param[key][i]) {
/**按顺序第一次赋值 */
nullIndex = i;
}
}
break;
}
errorStr = isError && errorStr == "" ? `${key}应该是${confType}型 而不是${valueType}`: errorStr;
if (isError) throw new BizError(ERRORENUM.参数错误, errorStr);
}
}
return param;
}
\ No newline at end of file
import moment = require("moment");
import { ERRORENUM } from "../config/errorEnum";
import { BizError } from "../util/bizError";
import { FILETYPE } from "../config/enum";
const md5 = require("md5");
export function getUserToken(loginId:string) {
return md5(`${loginId}_${Math.ceil(Math.random()*1000)}${new Date().valueOf()}`);
}
export function getMySqlMs(time?) {
time = time || new Date().valueOf();
// time += (8*3600*1000);
return moment(time).format("YYYY-MM-DD HH:mm:ss");
}
export function getClientMs(time) {
if (!time) return new Date().valueOf();
return new Date(time).valueOf();
}
export function getPartyMemberId(param) {
return md5(`${param}-${new Date().valueOf()}-${Math.ceil(Math.random() * 10000)}`);
}
export function getDefPwd(phone:string) {
return md5(`${phone.slice(5, 11)}`);
}
export function getFileType(fileName) {
let fileType = 0;
fileName.forEach(info => {
let repList = info.split(".");
let type = repList[repList.length-1];
if (!type) throw new BizError(ERRORENUM.文件不存在, `文件名 ${info}`);
let typeNum = 0;
switch(type) {
case 'pdf': typeNum = FILETYPE.pdf; break;
case 'doc':
case 'docx': typeNum = FILETYPE.word; break;
case 'jpg':
case 'png': typeNum = FILETYPE.图片; break;
};
if (typeNum) {
if (!fileType) fileType = typeNum;
else if (fileType != typeNum) fileType = FILETYPE.多类型;
}
});
return fileType;
}
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?) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
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 reject(err);
if (r && r.statusCode != 200) return reject(new Error('httpError:'+r.statusCode));
resolve(body);
});
})
}
export function post(url, query, reqBody, 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: reqBody,
query:{}
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
resolve(body);
}
else {
// reject(error)
}
});
})
}
export function postForm(url, query, 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
}, function(error, response, res) {
if (!error) {
resolve(res);
}
else {
reject(error)
}
});
})
}
//对象判空
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