Commit 51b932d8 by lixinming

no message

parents
.idea
/out
/node_modules
/test
/public
/logs
/video
/files
*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
{
"name": "screen",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@alicloud/dybaseapi": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/@alicloud/dybaseapi/-/dybaseapi-1.0.0.tgz",
"integrity": "sha512-4KEDgqES7IL60T/TWGSkLQkN6BYeHEw8smnPgac2J2MTES5v1ieCWvbLSuUUWi5SAXi7cydKoD4HUOmX7xwM+A==",
"requires": {
"@alicloud/pop-core": "^1.3.3"
}
},
"@alicloud/dysmsapi-2017-05-25": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/@alicloud/dysmsapi-2017-05-25/-/dysmsapi-2017-05-25-1.0.1.tgz",
"integrity": "sha512-CVX/Yl9ntwkAOHAZa3j2Y/Io+SlbETw/ILv4UPIDCEIQm/N0EEcN2OXF8cWCUvHeu7OgnFWZKhdJY5GsbjWHDA==",
"requires": {
"@alicloud/pop-core": "^1.5.1"
}
},
"@alicloud/mns": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/@alicloud/mns/-/mns-1.0.0.tgz",
"integrity": "sha512-SUJYM8+x3iPy6thIy5Wa/5lw7+RodeDDIPcI3QQ3bZPNCSq+yEC3jMtfVlS3vxGPq+dGjAysI9RGeM7NByeHlw==",
"requires": {
"debug": "^2.6.3",
"httpx": "^2.1.1",
"kitx": "^1.2.0",
"xml2js": "^0.4.17"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
},
"@alicloud/pop-core": {
"version": "1.7.13",
"resolved": "https://registry.npmmirror.com/@alicloud/pop-core/-/pop-core-1.7.13.tgz",
"integrity": "sha512-agzr4DU+aAGW7/2mp2hP1JcNJkn/zBS0jUGQt5etIASN0MVq1tMdudVqvWbExUG0mUouo/n2VgdnjOHjswvrlA==",
"requires": {
"debug": "^3.1.0",
"httpx": "^2.1.2",
"json-bigint": "^1.0.0",
"kitx": "^1.2.1",
"xml2js": "^0.5.0"
},
"dependencies": {
"xml2js": {
"version": "0.5.0",
"resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.5.0.tgz",
"integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
"requires": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
}
}
}
},
"@alicloud/sms-sdk": {
"version": "1.1.6",
"resolved": "https://registry.npmmirror.com/@alicloud/sms-sdk/-/sms-sdk-1.1.6.tgz",
"integrity": "sha512-jW5ROjpAtOrNFkZSXb8geJWzkgJ9ggnPx+ve+72eatu78/vad2emdZjRx43/xPqqhA9djRoU3xHQt2xFODiaMQ==",
"requires": {
"@alicloud/dybaseapi": "^1.0.0",
"@alicloud/dysmsapi-2017-05-25": "^1.0.1",
"@alicloud/mns": "^1.0.0-beta6",
"babel-runtime": "^6.26.0"
}
},
"@babel/runtime": {
"version": "7.22.10",
"resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.22.10.tgz",
"integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==",
"requires": {
"regenerator-runtime": "^0.14.0"
},
"dependencies": {
"regenerator-runtime": {
"version": "0.14.0",
"resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
"integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
}
}
},
"@types/node": {
"version": "10.17.60",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-10.17.60.tgz",
"integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
},
"accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz",
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
"requires": {
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
}
},
"adler-32": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.2.0.tgz",
"integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"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==",
"requires": {
"debug": "4"
},
"dependencies": {
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
"asn1": {
"version": "0.2.6",
"resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz",
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
"requires": {
"safer-buffer": "~2.1.0"
}
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
},
"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=="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
},
"aws4": {
"version": "1.12.0",
"resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.12.0.tgz",
"integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
},
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
"requires": {
"tweetnacl": "^0.14.3"
}
},
"bignumber.js": {
"version": "9.1.1",
"resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.1.tgz",
"integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig=="
},
"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==",
"requires": {
"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"
},
"dependencies": {
"bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"qs": {
"version": "6.11.0",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"requires": {
"side-channel": "^1.0.4"
}
}
}
},
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
"bytes": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz",
"integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="
},
"call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"requires": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
}
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
},
"cfb": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
"integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
"requires": {
"adler-32": "~1.3.0",
"crc-32": "~1.2.0"
},
"dependencies": {
"adler-32": {
"version": "1.3.1",
"resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
"integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
}
}
},
"charenc": {
"version": "0.0.2",
"resolved": "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz",
"integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="
},
"codepage": {
"version": "1.15.0",
"resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
"integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz",
"integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
"requires": {
"mime-db": ">= 1.43.0 < 2"
}
},
"compression": {
"version": "1.7.4",
"resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz",
"integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
"requires": {
"accepts": "~1.3.5",
"bytes": "3.0.0",
"compressible": "~2.0.16",
"debug": "2.6.9",
"on-headers": "~1.0.2",
"safe-buffer": "5.1.2",
"vary": "~1.1.2"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
},
"content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"requires": {
"safe-buffer": "5.2.1"
},
"dependencies": {
"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=="
}
}
},
"content-type": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz",
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
},
"cookie": {
"version": "0.5.0",
"resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz",
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
"core-js": {
"version": "2.6.12",
"resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
},
"crc-32": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
"integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
},
"crypt": {
"version": "0.0.2",
"resolved": "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="
},
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
"requires": {
"assert-plus": "^1.0.0"
}
},
"date-format": {
"version": "4.0.14",
"resolved": "https://registry.npmmirror.com/date-format/-/date-format-4.0.14.tgz",
"integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg=="
},
"debug": {
"version": "3.2.7",
"resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"requires": {
"ms": "^2.1.1"
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
},
"destroy": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
},
"exit-on-epipe": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
"integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
},
"express": {
"version": "4.18.2",
"resolved": "https://registry.npmmirror.com/express/-/express-4.18.2.tgz",
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
"requires": {
"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"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"qs": {
"version": "6.11.0",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"requires": {
"side-channel": "^1.0.4"
}
},
"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=="
}
}
},
"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=="
},
"express-history-api-fallback": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz",
"integrity": "sha512-swxwm3aP8vrOOvlzOdZvHlSZtJGwHKaY94J6AkrAgCTmcbko3IRwbkhLv2wKV1WeZhjxX58aLMpP3atDBnKuZg=="
},
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
},
"finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"requires": {
"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"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
},
"flatted": {
"version": "3.2.7",
"resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz",
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ=="
},
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="
},
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
},
"formidable": {
"version": "1.2.6",
"resolved": "https://registry.npmmirror.com/formidable/-/formidable-1.2.6.tgz",
"integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ=="
},
"forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
},
"frac": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
},
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
},
"fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
},
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"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==",
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3"
}
},
"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=="
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
"requires": {
"assert-plus": "^1.0.0"
}
},
"graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
},
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="
},
"har-validator": {
"version": "5.1.5",
"resolved": "https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz",
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
"requires": {
"ajv": "^6.12.3",
"har-schema": "^2.0.0"
}
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"requires": {
"function-bind": "^1.1.1"
}
},
"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=="
},
"has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
},
"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==",
"requires": {
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
}
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"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==",
"requires": {
"agent-base": "6",
"debug": "4"
},
"dependencies": {
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"httpx": {
"version": "2.2.7",
"resolved": "https://registry.npmmirror.com/httpx/-/httpx-2.2.7.tgz",
"integrity": "sha512-Wjh2JOAah0pdczfqL8NC5378G7jMt0Zcpn8U+yyxAiejjlagzSTQgJHuVvka2VNPQlKfoGehYRc79WKq9E4gDw==",
"requires": {
"@types/node": "^14",
"debug": "^4.1.1"
},
"dependencies": {
"@types/node": {
"version": "14.18.54",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-14.18.54.tgz",
"integrity": "sha512-uq7O52wvo2Lggsx1x21tKZgqkJpvwCseBBPtX/nKQfpVlEsLOb11zZ1CRsWUKvJF0+lzuA9jwvA7Pr2Wt7i3xw=="
},
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
},
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
},
"is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
},
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
},
"json-bigint": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz",
"integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
"requires": {
"bignumber.js": "^9.0.0"
}
},
"json-schema": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz",
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
},
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"requires": {
"graceful-fs": "^4.1.6"
}
},
"jsprim": {
"version": "1.4.2",
"resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-1.4.2.tgz",
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.4.0",
"verror": "1.10.0"
}
},
"kitx": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/kitx/-/kitx-1.3.0.tgz",
"integrity": "sha512-fhBqFlXd0GkKTB+8ayLfpzPUw+LHxZlPAukPNBD1Om7JMeInT+/PxCAf1yLagvD+VKoyWhXtJR68xQkX/a0wOQ=="
},
"log4js": {
"version": "6.9.1",
"resolved": "https://registry.npmmirror.com/log4js/-/log4js-6.9.1.tgz",
"integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==",
"requires": {
"date-format": "^4.0.14",
"debug": "^4.3.4",
"flatted": "^3.2.7",
"rfdc": "^1.3.0",
"streamroller": "^3.1.5"
},
"dependencies": {
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"md5": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
"integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
"requires": {
"charenc": "0.0.2",
"crypt": "0.0.2",
"is-buffer": "~1.1.6"
}
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
},
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz",
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"requires": {
"mime-db": "1.52.0"
}
},
"moment": {
"version": "2.29.4",
"resolved": "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
},
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
},
"node-fetch": {
"version": "2.6.12",
"resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.12.tgz",
"integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
"requires": {
"whatwg-url": "^5.0.0"
}
},
"node-xlsx": {
"version": "0.16.2",
"resolved": "https://registry.npmmirror.com/node-xlsx/-/node-xlsx-0.16.2.tgz",
"integrity": "sha512-ZT3Y4Zg2BFC2UWdp9B/6x3GqrFL0Bf0cXKy9IyhcwlKbcDAf5GuPAPSqrWFQK68NIpfTNA1Kr/NNjpwYxUgHTA==",
"requires": {
"@babel/runtime": "^7.14.6",
"buffer-from": "^1.1.1",
"xlsx": "^0.17.0"
}
},
"nodemailer": {
"version": "6.9.4",
"resolved": "https://registry.npmmirror.com/nodemailer/-/nodemailer-6.9.4.tgz",
"integrity": "sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA=="
},
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"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=="
},
"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==",
"requires": {
"ee-first": "1.1.1"
}
},
"on-headers": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
},
"opentype.js": {
"version": "0.7.3",
"resolved": "https://registry.npmmirror.com/opentype.js/-/opentype.js-0.7.3.tgz",
"integrity": "sha512-Veui5vl2bLonFJ/SjX/WRWJT3SncgiZNnKUyahmXCc2sa1xXW15u3R/3TN5+JFiP7RsjK5ER4HA5eWaEmV9deA==",
"requires": {
"tiny-inflate": "^1.0.2"
}
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
},
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
},
"printj": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/printj/-/printj-1.1.2.tgz",
"integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
},
"proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"requires": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
}
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
},
"psl": {
"version": "1.9.0",
"resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz",
"integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
},
"punycode": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz",
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
},
"qs": {
"version": "6.11.2",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.2.tgz",
"integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
"requires": {
"side-channel": "^1.0.4"
}
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
"raw-body": {
"version": "2.5.1",
"resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz",
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"requires": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"dependencies": {
"bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
}
}
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
"har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"dependencies": {
"qs": {
"version": "6.5.3",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz",
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
}
}
},
"rfdc": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz",
"integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"send": {
"version": "0.18.0",
"resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"requires": {
"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"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
},
"dependencies": {
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
}
}
},
"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==",
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
}
},
"setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
"side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"requires": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
}
},
"ssf": {
"version": "0.11.2",
"resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
"integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
"requires": {
"frac": "~1.1.2"
}
},
"sshpk": {
"version": "1.17.0",
"resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.17.0.tgz",
"integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
}
},
"statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
},
"streamroller": {
"version": "3.1.5",
"resolved": "https://registry.npmmirror.com/streamroller/-/streamroller-3.1.5.tgz",
"integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==",
"requires": {
"date-format": "^4.0.14",
"debug": "^4.3.4",
"fs-extra": "^8.1.0"
},
"dependencies": {
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"svg-captcha": {
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/svg-captcha/-/svg-captcha-1.4.0.tgz",
"integrity": "sha512-/fkkhavXPE57zRRCjNqAP3txRCSncpMx3NnNZL7iEoyAtYwUjPhJxW6FQTQPG5UPEmCrbFoXS10C3YdJlW7PDg==",
"requires": {
"opentype.js": "^0.7.3"
}
},
"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==",
"requires": {
"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"
},
"dependencies": {
"form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz",
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
}
}
},
"tiny-inflate": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
"integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
},
"toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
},
"tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz",
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"requires": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
}
},
"tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"tslib": {
"version": "1.13.0",
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.13.0.tgz",
"integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
},
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"requires": {
"safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
},
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"requires": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
}
},
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
},
"uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"requires": {
"punycode": "^2.1.0"
}
},
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
},
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
},
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz",
"integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
"whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"requires": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
}
},
"wmf": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
"integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
},
"word": {
"version": "0.3.0",
"resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
"integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
},
"ws": {
"version": "5.2.3",
"resolved": "https://registry.npmmirror.com/ws/-/ws-5.2.3.tgz",
"integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==",
"requires": {
"async-limiter": "~1.0.0"
}
},
"xlsx": {
"version": "0.17.5",
"resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.17.5.tgz",
"integrity": "sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==",
"requires": {
"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"
}
},
"xml2js": {
"version": "0.4.23",
"resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.4.23.tgz",
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
"requires": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
}
},
"xmlbuilder": {
"version": "11.0.1",
"resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
}
}
}
{
"name": "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",
"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",
"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"
},
"devDependencies": {},
"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"
}
}
<config>
<port>40003</port>
<db>
<url>http://127.0.0.1:40002</url>
<sign>xxx90909082fsdahfjosadjfpoiwausjorip2hjklrhn1ioud0u124rx0qwejfokasjfolksaujfoas</sign>
</db>
<imgUrl>http://123.207.147.179:40003/</imgUrl>
<fileIP>http://218.78.62.29:40004</fileIP>
</config>
\ No newline at end of file
/**
* ABI_智慧党建管理分析平台——党建分析
*/
import moment = require("moment");
import { OPERATIONALDATATYPE, TABLENAME } from "../../config/dbEnum";
import * as enums from "../../config/enum";
import { selectData } from "../../middleware/databaseSuccess";
/**
* 党建分析——左屏
* @returns {baseData:基本情况, ratio:男女占比, qualifications:学历情况, ageDistribution:年龄分布, partyExpenses:党费管理}
*/
export async function getLeftScreen() {
let baseData = {title:"基本情况", list:[]};
baseData.list.push(
{key:"支部", value:await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.支部表, {}, null)},
{key:"正式党员", value:await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党员基础信息表, {etId:enums.ENTRYTYPE.正式党员}, null)},
{key:"预备党员", value:await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党员基础信息表, {etId:enums.ENTRYTYPE.预备党员}, null)}
);
let male = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党员基础信息表, {sex:enums.SEX.}, null);
let female = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党员基础信息表, {sex:enums.SEX.}, null);
let ratio = {title:"男女占比", list:[{key:"男", value:male},{key:"女", value:female}]};
let qualifications = {title:"学历情况", list:[]};
for(let key in enums.DEGREE) {
let anyKey:any = key;
if (isNaN(anyKey)) {
let keyStr = key;
let levelOfEducation = enums.DEGREE[key];
let count = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党员基础信息表, {levelOfEducation}, null);
qualifications.list.push({key:keyStr, value:count});
}
}
let ageDistribution = {title:"年龄分布", list:[]};
let ageDistributionMap = {
小于29: 0,
大于30小于39: 0,
大于40小于49: 0,
大于50: 0,
}
let 小于29 = {"birthDate": {"%gt%": moment().add(-29, 'y').format("YYYY-MM-DD HH:mm:ss")}};
ageDistributionMap.小于29 = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党员基础信息表, 小于29, ["birthDate"]);
let 大于30小于39 = {"birthDate": {"%between%": [moment().add(-39, 'y').format("YYYY-MM-DD HH:mm:ss"), moment().add(-30, 'y').format("YYYY-MM-DD HH:mm:ss")]}};
ageDistributionMap.大于30小于39 = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党员基础信息表, 大于30小于39, ["birthDate"]);
let 大于40小于49 = {"birthDate": {"%between%": [moment().add(-49, 'y').format("YYYY-MM-DD HH:mm:ss"), moment().add(-40, 'y').format("YYYY-MM-DD HH:mm:ss")]}};
ageDistributionMap.大于40小于49 = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党员基础信息表, 大于40小于49, ["birthDate"]);
let 大于50 = {"birthDate": {"%lt%": moment().add(-50, 'y').format("YYYY-MM-DD HH:mm:ss")}};
ageDistributionMap.大于50 = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党员基础信息表, 大于50, ["birthDate"]);
for (let key in ageDistributionMap) {
ageDistribution.list.push({key, value: ageDistributionMap[key]});
}
let partyExpenses = {title:"党费管理", list: []};
let stTime = moment(new Date().valueOf()).startOf("month").format("YYYY-MM-DD HH:mm:ss");
let etTime = moment(new Date().valueOf()).endOf('month').format("YYYY-MM-DD HH:mm:ss");
let monthParam = {payType:enums.PAYTYPE.已缴纳, payTime:{"%between%":[stTime, etTime]}};
let monthPayment = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党费管理表, monthParam, ["payAmount"]);
let payAmount = 0;
monthPayment.forEach( item => {
payAmount += item.payAmount;
})
partyExpenses["monthPayment"] = payAmount;
let paymentCount = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党员基础信息表, {}, null);
let paidCount = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党费管理表, {payType:enums.PAYTYPE.已缴纳}, null);
partyExpenses["paymentRatio"] = Math.round((paidCount / paymentCount)*100)/100;
for(let key in enums.BRANCHNAME) {
let anyKey:any = key;
if (isNaN(anyKey)) {
let keyStr = key;
let bId = enums.BRANCHNAME[key];
let param = {
bId,
payType: enums.PAYTYPE.已缴纳,
payTime: {"%between%":[stTime, etTime]}
}
let branchPayment = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党费管理表, param, ["payAmount"]);
let branchPayAmount = 0;
branchPayment.forEach( item => {
branchPayAmount += item.payAmount;
})
partyExpenses.list.push({key:keyStr, value:branchPayAmount});
}
}
return {baseData, ratio, qualifications, ageDistribution, partyExpenses};
}
/**
* 党建分析——中屏
* @param year
* @returns {partyQualityList:党建质量雷达图, branchPartyQuality:各支部党建质量评分, buildingDynamic:党建动态}
*/
export async function getMidScreen(year:string) {
let clomun = ["primaryIndicators", "completionProgress"];
let partyQuality = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党建质量三级指标, {dataYear:year}, clomun);
let indicatorsMap = {};
partyQuality.forEach( info => {
let {primaryIndicators, completionProgress} = info; //一级指标、完成进度
if (!indicatorsMap[primaryIndicators]) indicatorsMap[primaryIndicators] = {count:0, completionProgress:0};
indicatorsMap[primaryIndicators].completionProgress += completionProgress;
indicatorsMap[primaryIndicators].count += 1;
});
let partyQualityList = {title:"党建质量雷达图", list:[]};//list:[{key:一级指标名称,value:一级指标数量:0}]
for (let key in indicatorsMap) {
let {count, completionProgress} = indicatorsMap[key];
let keyStr = enums.PRIMARYINDICATORS[key];
partyQualityList.list.push({
key:keyStr,
value:Math.round((completionProgress / count)*100)/100
}
);
}
let branchPartyQuality = {title:"各支部党建质量评分", list:[]};
for(let key in enums.BRANCHNAME) {
let anyKey:any = key;
if (isNaN(anyKey)) {
let keyStr = key;
let bId = enums.BRANCHNAME[key];
let branchPartyQualityInfo = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党建质量三级指标, {bId}, ["currentScore"]);
let branchScore = 0;
branchPartyQualityInfo.forEach( item => {
branchScore += item.currentScore;
})
branchPartyQuality.list.push({key:keyStr, value:branchScore});
}
}
let buildingDynamic = {title:"党建动态", list:[]};
buildingDynamic.list = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党建动态表, {}, ["theme"])
return {partyQualityList, branchPartyQuality, buildingDynamic};
}
/**
* 党建分析——右屏
* @returns {activity:组织生活, basicSystem:, totalIntegral, partyVanguard}
*/
export async function getRightScreen() {
let activity = {title:"组织生活", activityCount:0, list:[]}
activity.activityCount = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.组织生活表, {}, null); //组织生活总数
for(let key in enums.BRANCHNAME) {
let anyKey:any = key;
if (isNaN(anyKey)) {
let keyStr = key;
let bId = enums.BRANCHNAME[key];
let count = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.组织生活表, {bId}, null);
activity.list.push({key:keyStr, value:count});
}
}
let basicSystem = {title:"基本制度", list:[]};
basicSystem.list = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.支部制度表, {}, ["systemTitle"]);
let totalIntegral = {title:"学习强国", monthTotalScore:0, list:[]};
let totalScore = 0;
for(let key in enums.BRANCHNAME) {
let anyKey:any = key;
if (isNaN(anyKey)) {
let keyStr = key;
let bId = enums.BRANCHNAME[key];
let totalIntegralInfo = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.学习强国, {bId}, ["totalIntegral"]);
let changeScore = 0;
totalIntegralInfo.forEach(item => {
changeScore += item.totalIntegral;
totalScore += item.totalIntegral;
})
totalIntegral.list.push({key:keyStr, value:changeScore});
}
}
totalIntegral.monthTotalScore = totalScore;
let partyVanguard = {title:"党建先锋", list:[]};
let partyVanguardInfo = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党建先锋表, {}, ["honorName", "grantTime"]);
partyVanguardInfo.forEach( item => {
let grantTime = moment(item.grantTime).format("YYYY-MM-DD");
partyVanguard.list.push({honorName:item.honorName, grantTime});
})
return {activity, basicSystem, totalIntegral, partyVanguard};
}
/**
* ABI_智慧党建管理分析平台——党建目标
*/
import { OPERATIONALDATATYPE, TABLENAME } from "../../config/dbEnum";
import { PRIMARYINDICATORS, SECONDARYINDICATORS } from "../../config/enum";
import { selectData } from "../../middleware/databaseSuccess";
import { changeEnumValue } from "../../util/verificationEnum";
export async function getTargetData() {
let clomun = ["tlId", "primaryIndicators", "secondaryIndicators", "thirdLevelContent", "thirdLevelScore", "currentScore", "completionProgress"];
let partyQualityData = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党建质量三级指标, {}, clomun);
//todo优化一下 循环方式反了,参考partyBuilding 中的getMidScreen的写法
let partyQualityList = [];
for (let key in PRIMARYINDICATORS) {
let primaryIndicatorsData = {};
let anyKey:any = key;
if (isNaN(anyKey)) {
const EnumValue = parseInt(PRIMARYINDICATORS[key])
primaryIndicatorsData = {key: anyKey, list: {}};
partyQualityData.forEach( info => {
let {primaryIndicators, secondaryIndicators, thirdLevelContent, thirdLevelScore, currentScore, completionProgress} = info; //一级指标、总分、三级指标得分、完成进度
if (primaryIndicators == EnumValue) {
let secondary = changeEnumValue(SECONDARYINDICATORS, secondaryIndicators);
if(!primaryIndicatorsData["list"][secondary]) primaryIndicatorsData["list"][secondary] = []
primaryIndicatorsData["list"][secondary].push({
completionProgress
});
}
})
partyQualityList.push(primaryIndicatorsData);
}
}
let partyQuality = [];
partyQualityList.forEach( item => {
let {key, list} = item;
let secondLevel = [];
for (let second in list) {
let completionProgress = 0;
list[second].forEach( completion => {
completionProgress += completion.completionProgress;
})
completionProgress = completionProgress/list[second].length;
secondLevel.push({key:second, completionProgress})
}
partyQuality.push({key, dataList:secondLevel});
})
return partyQuality;
}
/**
* 首页基础数据
*/
import { changeEnumValue } from "../util/verificationEnum";
import * as configEnum from "../config/enum";
import * as clientConfigEnum from "../config/clientEnum";
import { extractData } from "../util/piecemeal";
import * as splitResultConfig from "../config/splitResultConfig";
import { selectData } from "../middleware/databaseSuccess";
import { OPERATIONALDATATYPE, TABLENAME } from "../config/dbEnum";
import moment = require("moment");
/**
* 主页基础数据
* @param bId 支部id
* @returns 支部名称:branch:"牙防所第一支部"
* @returns 党员总数:partyMemberNum:0
* @returns 党建质量总数:massSum:0
* @returns 党建质量指数:massIndex:0
* @returns 党内职务人员列表:partyPositions:[{"key":"支部书记", "list":["张三","李四"]}, {"key":"支部副书记", "list":["暂无数据"]}, ......]
*/
export async function homeData(bId:number) {
let branch = changeEnumValue(configEnum.BRANCHNAME, bId); //支部名称
let param = { bId };
let partyQualityScore = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党建质量三级指标, param, ["thirdLevelScore", "currentScore"]);
let massIndex = 0;//得分
let massCount = 0;//总分
partyQualityScore.forEach( score => {
massCount += score.thirdLevelScore;
massIndex += score.currentScore;
});
let partyPositionsMap = {}; // = []; //党内职务人员 [{key, list:["", ""]}]
for (let key in clientConfigEnum.PARTYPOSITIONS) {
let anyKey:any = key;
if (isNaN(anyKey)) { //枚举key key = string
partyPositionsMap[anyKey] = {key:anyKey, list:[]}
}
}
let selectAllColumn = ["bId", "partyPositionsName", "name"];
let allMemberList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党员基础信息表, param, selectAllColumn);
let partyMemberNum = 0;//本支部人员总数
allMemberList.forEach(item => {
let { partyPositionsName, name} = item;
const ItemBId = item.bId;
if (ItemBId == bId) {
partyMemberNum += 1;
let partyPositionsList = getPartyPositionsList(JSON.parse(partyPositionsName));
partyPositionsList.forEach(positions => {
partyPositionsMap[positions].list.push(name);
});
}
});
let partyPositions = []; //党内职务人员 [{key, list:["", ""]}]
for (let key in partyPositionsMap ) {
let dataItem = partyPositionsMap[key];
if (!dataItem.list.length) dataItem.list.push("暂无数据");
partyPositions.push(dataItem)
}
return { branch, partyMemberNum, massSum:massCount, massIndex, partyPositions };
}
/**
* 职务人员数组数据转换
* @param numberList [100,101]
* @returns strList:["支部书记", "支部副书记" ]
*/
function getPartyPositionsList(numberList) {
let strList = [];
numberList.forEach(enumNum => {
let value = changeEnumValue(clientConfigEnum.PARTYPOSITIONS, enumNum);
if (value) strList.push(value);
});
return strList;
}
/**
* 查询党建资讯列表
* @param bId 支部id
* @returns 资讯列表:dataList:[返回字段参考splitResultConfig文件中的partyInformamtionConfig配置]
*/
export async function activitiesData(bId:number) {
let param = { bId };
let partyInformationList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.专题活动表, param, ["taId", "theme", "dataMonth"]);
let partyBuildingDynamicDataList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党建动态表, param, ["pbId", "theme", "dataMonth"]);
let dataList = [];
partyInformationList.forEach( info => {
let changeData:any = extractData(splitResultConfig.partyInformationConfig, info);
changeData.dataMonth = new Date(info.dataMonth).valueOf();
changeData.pbType = configEnum.PBTYPE.党建资讯;
dataList.push(changeData);
})
partyBuildingDynamicDataList.forEach (info => {
let changeData:any = extractData(splitResultConfig.buildingDynamiconfig, info);
changeData.dataMonth = new Date(info.dataMonth).valueOf();
changeData.pbType = configEnum.PBTYPE.党建动态;
dataList.push(changeData);
})
dataList.sort( (a, b) => { return b["dataMonth"] - a["dataMonth"]; })
dataList.forEach( info => {
info.dataMonth = moment(info.dataMonth).format('YYYY-MM-DD');
})
return dataList;
}
/**
* 支部制度
*/
import { OPERATIONALDATATYPE, TABLENAME } from "../config/dbEnum";
import { UPTYPE } from "../config/enum";
import { ERRORENUM } from "../config/errorEnum";
import { systemConfig } from "../config/systemConfig";
import { selectData } from "../middleware/databaseSuccess";
import { getFileUrl } from "../middleware/getUrl";
import { BizError } from "../util/bizError";
/**
* 支部制度列表
* @param bId 支部id
* @param systemTitle 制度主题 可模糊查询
* @returns branchSystemList:[{"bsId":1, "systemTitle":"制度标题"}, ......]
*/
export async function branchSystemList(bId:number, systemTitle:string) {
let param = { bId:{"%like%": bId} };
if(systemTitle) param["systemTitle"] = {"%like%": systemTitle};
let branchSystemList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.支部制度表, param, ["bsId", "systemTitle"]);
branchSystemList = branchSystemList || [];
return branchSystemList;
}
/**
* 制度细则
* @param bsId 支部制度id
* @returns branchSystemInfo:{"bsId":1, "systemTitle":"制度标题", "fileName":["制度文件1", ......]}
*/
export async function branchSystemDetsils(bsId:number, token:string, userid:string) {
let clomun = ["bsId", "systemTitle", "fileName"];
let branchSystemInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.支部制度表, {bsId}, clomun);
if(!branchSystemInfo || !branchSystemInfo.bsId) throw new BizError(ERRORENUM.库中不存在对应数据, `制度细则中不存在id=${bsId}的数据`);
let fileNameList = getFileUrl(branchSystemInfo.fileName, token, UPTYPE.支部制度, userid);
branchSystemInfo.fileName = fileNameList;
return branchSystemInfo;
}
/**
* 党员学习 memberLearning
* 学习进度 rateLearning
* 学习排行 learningPower
*/
import { OPERATIONALDATATYPE, TABLENAME } from "../config/dbEnum";
import { operationalData, selectData, selectManyTableData } from "../middleware/databaseSuccess";
import moment = require("moment");
import * as verificationEnumTools from "../util/verificationEnum";
import * as configEnum from "../config/enum";
import { systemConfig } from "../config/systemConfig";
import { getFileUrl } from "../middleware/getUrl";
import { BizError } from "../util/bizError";
import { ERRORENUM } from "../config/errorEnum";
/**
* 获取党员课程学习列表
* @param pmId 登录的党员id
* @param courseEntryType 学习类型 视频/文字
* @param courseTypeName 课程类型
* @param contentTitle 课程标题
* @returns rateLearningList:[{"contentTitle":"学习课题名称", "fileName":["视频地址", ......], "rateOfLearning":0, "learningCompleted":0}]
*/
export async function memberLearningList(pmId:string, courseEntryType:number, courseTypeName:number, contentTitle:string, token:string, userid:string) {
let rateColumn = ["rlId", "mlId", "rateOfLearning", "learningCompleted", "textSchedule"];
let rateLearningInfo = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.学习进度表, {pmId}, rateColumn);
let rateLearningList = [];
let rateLearningMap = {};
rateLearningInfo.forEach(info => {
let {rlId, mlId, rateOfLearning, learningCompleted, textSchedule} = info;
rateLearningMap[mlId] = {rlId, rateOfLearning, learningCompleted, textSchedule};
});
let param = {courseEntryType};
if(courseTypeName) param["courseTypeName"] = courseTypeName;
if(contentTitle) param["contentTitle"] = {"%like%": contentTitle};
let clomun = ["mlId", "contentTitle", "fileName", "coverImage", "videoDuration", "courseEntryType"];
let memberLearningInfo = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党员学习表, param, clomun);
for(let i = 0; i < memberLearningInfo.length; i++) {
let memberInfo = memberLearningInfo[i];
let {mlId, contentTitle, fileName, coverImage, videoDuration} = memberInfo;
let learningInfo = rateLearningMap[mlId];
if (!learningInfo) { //如果对应学习课程没有进度数据,创建一条对应进度为0的数据
let addInfo = {
pmId,
mlId,
rateOfLearning:0,
learningCompleted: 1,
courseEntryType:'[]'
}
await operationalData(OPERATIONALDATATYPE.增加, TABLENAME.学习进度表, addInfo, {});
learningInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.学习进度表, {pmId, mlId}, rateColumn);
console.log(learningInfo);
}
let alanysisFileName;
let successFileList = [];//已完成
if (courseEntryType == 2) {
alanysisFileName = getFileUrl(fileName, token, configEnum.UPTYPE.党员学习 , userid);
successFileList = learningInfo.textSchedule ? JSON.parse(learningInfo.textSchedule) : [];
} else {
alanysisFileName = JSON.parse(fileName);
}
//todo 这里 fileName不再是一个字符串 而是一个对象{}
rateLearningList.push({
rlId: learningInfo.rlId,
contentTitle,
fileName: alanysisFileName,
rateOfLearning: learningInfo.rateOfLearning,
learningCompleted: learningInfo.learningCompleted,
coverImage,
videoDuration,
successFileList
})
}
return rateLearningList;
}
/**
* 学习排行
* 该用户支部的排名
* 展示数据最新月份的每日积分总和
* @param bId 支部id 参数存在返回数据最新月份登录账号支部的学习排行,参数不存在返回数据最新月份所有支部的学习排行
* @returns learningPowerList:[{"pmId":"党员id", "name":"党员名称", "bId":"所属支部", "dayIntegral":得分, "dataTime":"数据月份", "ranking":排名}]
* @returns oneselfRanking:{"pmId":"党员id", "name":"党员名称", "bId":"所属支部", "dayIntegral":得分, "dataTime":"数据月份", "ranking":排名}
*/
export async function branchRanking(pmId, bId?) {
let orderParam = {"%orderDesc%": "dataTime", "%limit%": 1};
let monthData = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.学习强国, orderParam, ["dataTime"]);
if (!monthData || !monthData.dataTime) return [];
let dataTime = monthData.dataTime;
let stTime = moment(dataTime).startOf("month").format("YYYY-MM-DD HH:mm:ss");
let etTime = moment(dataTime).endOf('month').format("YYYY-MM-DD HH:mm:ss");
let param = {
dataTime:{"%between%": [stTime, etTime]}
};
if (bId) param["bId"] = {"%like%": bId};
let clomun = ["pmId", "bId", "dayIntegral", "dataTime"];
let includeConf = {"partyMember":["name"]}
let learningPowerData = await selectManyTableData(OPERATIONALDATATYPE.多表联查, TABLENAME.学习强国, param, clomun, includeConf);
let partyMemberNameData = {}; //{成员名称:{pmId, bId, score, dataTime} }
learningPowerData.forEach( info => {
let {pmId, partyMember, bId, dayIntegral, dataTime} = info;
if (!partyMemberNameData[partyMember.name]) {
partyMemberNameData[partyMember.name] = {
pmId,
name:partyMember.name,
bId:verificationEnumTools.changeEnumValue(configEnum.BRANCHNAME, bId),
dayIntegral:0,
dataTime: moment(dataTime).format("YYYY-MM"),
};
}
partyMemberNameData[partyMember.name].dayIntegral += dayIntegral;
});
let learningPowerList = Object.values(partyMemberNameData);
learningPowerList.sort( (a:any, b:any) => {
return b.dayIntegral - a.dayIntegral;
});
let oneselfRanking = {};
for ( let i = 0; i < learningPowerList.length; i++) {
learningPowerList[i]["ranking"] = i + 1; //排名
if(learningPowerList[i]["pmId"] == pmId) {
oneselfRanking = learningPowerList[i];
}
}
return {learningPowerList, oneselfRanking};
}
/**
* 修改学习进度
* @param rlId 学习进度id
* @param rateOfLearning 学习进度
*/
export async function updateRateOfLearning(rlId:number, rateOfLearning:number) {
let learningCompleted = 1;
if (rateOfLearning == 100) learningCompleted = 2
let learningInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.学习进度表, {rlId}, ["rateOfLearning"]);
if (learningInfo.rateOfLearning < rateOfLearning) {
let row = await operationalData(OPERATIONALDATATYPE.修改, TABLENAME.学习进度表, {rateOfLearning, learningCompleted}, {rlId});
console.log(row);
}
return {isSuccess:true};
}
export async function updateDocRateOfLearning(rlId:number, fileName:string) {
let rateLearningInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.学习进度表, {rlId}, ["pmId", "rlId", "textSchedule"]);
if (!rateLearningInfo || !rateLearningInfo.rlId) throw new BizError(ERRORENUM.目标数据不存在, `更新学习进度:rlid:${rlId}`);
let {pmId} = rateLearningInfo;
let learningInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.学习进度表, {pmId}, ["pmId", "mlId"]);
if (!learningInfo || !learningInfo.pmId) throw new BizError(ERRORENUM.目标数据不存在, `更新学习进度:pmId:${pmId}`);
let mlInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.党员学习表, {mlId:learningInfo.mlId}, ["courseEntryType"]);
if (mlInfo.courseEntryType != 2) throw new BizError(ERRORENUM.该进度不是文字学习, `${pmId}`);
let textSchedule = !rateLearningInfo.textSchedule ? [] : JSON.parse( rateLearningInfo.textSchedule);
let isUpdate = false;
if (textSchedule.indexOf(fileName) == -1) {
isUpdate = true;
textSchedule.push(fileName);
}
if (isUpdate) {
let row = await operationalData(OPERATIONALDATATYPE.修改, TABLENAME.学习进度表, {textSchedule:JSON.stringify(textSchedule)}, {rlId});
console.log();
}
return {isSuccess:true};
}
/**
* 组织生活
*/
import moment = require("moment");
import { OPERATIONALDATATYPE, TABLENAME } from "../config/dbEnum";
import { ERRORENUM } from "../config/errorEnum";
import { selectData } from "../middleware/databaseSuccess";
import { BizError } from "../util/bizError";
import { extractData } from "../util/piecemeal";
import * as splitResultConfig from "../config/splitResultConfig";
import * as verificationEnumTools from "../util/verificationEnum";
import * as configEnum from "../config/enum";
import { getFileUrl } from "../middleware/getUrl";
/**
* 获取组织生活列表
* @param bId 支部id
* @param theme 活动名称 模糊查询
* @param themeType 活动类型
* @param dataMonth 活动月份
* @returns organizationalLifeList[{"oId":1, "theme":"活动主题", "themeType":"活动类型", "dataMonth":"活动月份"}]
*/
export async function organizationalLifeList(bId:number, theme:string, themeType:number, dataMonth:string) {
let param = { bId };
if (theme) param["theme"] = {"%like%": theme};
if (themeType) param["themeType"] = themeType;
if (dataMonth) {
let stTime = moment(dataMonth).startOf("month").format("YYYY-MM-DD HH:mm:ss");
let etTime = moment(dataMonth).endOf('month').format("YYYY-MM-DD HH:mm:ss");
param["dataMonth"] = {"%between%": [stTime, etTime]}; //`DATE_FORMAT(dataMonth, '%Y-%m') = DATE_FORMAT(${dataMonth}, '%Y-%m')`;
}
let clomun = ["oId", "theme", "themeType", "dataMonth"];
let organizationalLifeDataList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.组织生活表, param, clomun);
let organizationalLifeList = [];
organizationalLifeDataList.forEach( info => {
let changeData:any = extractData(splitResultConfig.organlzationalLifeConfig, info, "YYYY-MM-DD");
changeData.themeType = verificationEnumTools.changeEnumValue(configEnum.THEMETYPE, info.themeType);
organizationalLifeList.push(changeData);
})
return organizationalLifeList;
}
/**
* 获取组织生活详情
* @param oId 组织生活id
* @returns orgLifeInfo:{"oId":1, "theme":"活动主题", "themeType":"活动类型", "fileName":["活动文件名称", ......]}
*/
export async function organlzationalLifeListDetsils(oId:number, token:string, userid:string) {
let clomun = ["oId", "theme", "themeType", "dataMonth", "fileName"];
let orgLifeInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.组织生活表, {oId}, clomun);
if(!orgLifeInfo || !orgLifeInfo.oId) throw new BizError(ERRORENUM.未找到数据, `库中找不到id为${oId}的组织生活详情`);
orgLifeInfo.themeType = verificationEnumTools.changeEnumValue(configEnum.THEMETYPE, orgLifeInfo.themeType);
orgLifeInfo.dataMonth = moment(orgLifeInfo.dataMonth).format("YYYY-MM-DD");
orgLifeInfo.fileName = getFileUrl(orgLifeInfo.fileName, token, configEnum.UPTYPE.组织生活, userid);
return orgLifeInfo;
}
/**
* 党建动态 partyBuildingDynamic
*/
import { OPERATIONALDATATYPE, TABLENAME } from "../config/dbEnum";
import { selectData } from "../middleware/databaseSuccess";
import { extractData } from "../util/piecemeal";
import * as splitResultConfig from "../config/splitResultConfig";
import moment = require("moment");
import { PBTYPE, UPTYPE } from "../config/enum";
import { systemConfig } from "../config/systemConfig";
import { getFileUrl } from "../middleware/getUrl";
/**
* 获取党建动态列表
* @param bId
* @param theme 主题
* @param activityYear 年份
* @param activityMonth 月份
* @returns partyBuildingDynamicList:[{"pbId":1, "theme":"党建动态主题", "dataMonth":"数据月份"}, ......]
*/
export async function partyBuildingDynamicList(bId:number, theme:string, activityYear:string, activityMonth:string) {
let timeStr = new Date(`${activityYear}-${activityMonth}`).valueOf();
let stTime = moment(timeStr).startOf("month").format("YYYY-MM-DD HH:mm:ss");
let etTime = moment(timeStr).endOf('month').format("YYYY-MM-DD HH:mm:ss");
let param = {
bId,
dataMonth: {"%between%": [stTime, etTime]}
}
if(theme) param["theme"] = {"%like%":theme};
let partyBuildingDynamicList = [];
let partyInformationList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.专题活动表, param, ["taId", "theme", "dataMonth"]);
for (let i = 0; i < partyInformationList.length; i++) {
let info = partyInformationList[i];
let changeData:any = extractData(splitResultConfig.thematicActivitiesConfig, info, "YYYY-MM-DD");
changeData.pbType = PBTYPE.党建资讯;
partyBuildingDynamicList.push(changeData);
}
let buildingDynamicDataList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党建动态表, param, ["pbId", "theme", "dataMonth"]);
for (let i = 0; i < buildingDynamicDataList.length; i++) {
let info = buildingDynamicDataList[i];
let changeData:any = extractData(splitResultConfig.partyBuildingDynamicConfig, info, "YYYY-MM-DD");
changeData.pbType = PBTYPE.党建动态;
partyBuildingDynamicList.push(changeData);
}
return partyBuildingDynamicList;
}
/**
* 获取党建动态详情
* @param pbId
* @returns partyBuildingDynamicInfo:{ "theme":"党建动态主题", "dataMonth":"数据月份", "fileName":["党建动态文件名称", ......] }
*/
export async function partyBuildingDynamicDetsils(pbId:number, pbType:number, token:string, userid:string) {
let clomun = ["theme", "dataMonth", "fileName"];
let partyBuildingDynamicInfo:any = {};
if (pbType == PBTYPE.党建资讯) partyBuildingDynamicInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.专题活动表, {taId: pbId}, clomun);
if (pbType == PBTYPE.党建动态) partyBuildingDynamicInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.党建动态表, {pbId}, clomun);
partyBuildingDynamicInfo.dataMonth = moment(partyBuildingDynamicInfo.dataMonth).format("YYYY-MM-DD");
let fileNameList = getFileUrl(partyBuildingDynamicInfo.fileName, token, UPTYPE.党建动态, userid);
partyBuildingDynamicInfo.fileName = fileNameList;
return partyBuildingDynamicInfo;
}
/**
* 党费管理
*/
import * as configEnum from "../config/enum";
import { selectData } from "../middleware/databaseSuccess";
import { OPERATIONALDATATYPE, TABLENAME } from "../config/dbEnum";
import moment = require("moment");
import { changeEnumValue } from "../util/verificationEnum";
/**
* 获取党费管理数据
* @param bId 支部id
* @param name 党员名称
* @param payType 缴纳状态
* @param payableYear 缴纳时间-年份
* @param payableMonth 缴纳时间-月份
* @returns 基础数据:"baseData": {"partyCount":党员总数, "paid":已缴纳人数, "unpaid":未缴纳人数}
* @returns 党费列表:"partyExpensesList": [{"name":"党员名称","payType":"缴纳状态","pmId":"党员id","payTime":"缴纳时间","partyPositionsName":"党内职务","departmentName":"所属科室","partyJoiningTime":"党龄"}, ......]
*/
export async function partyExpensesData(bId, name, payType, payableYear, payableMonth) {
let timeStr = new Date(`${payableYear}-${payableMonth}`).valueOf();
let stTime = moment(timeStr).startOf("month").format("YYYY-MM-DD HH:mm:ss");
let etTime = moment(timeStr).endOf('month').format("YYYY-MM-DD HH:mm:ss");
let param = {
bId,
payableMonth: {"%between%": [stTime, etTime]}
}
if(payType) param["payType"] = payType;
let clomun = ["pmId", "payType", "payTime"];
let partyExpensesDataList = await selectData(OPERATIONALDATATYPE.查询多个 , TABLENAME.党费管理表, param, clomun);
let expMap = {};//党费缴纳记录
partyExpensesDataList.forEach(info => {
let {pmId, payType, payTime} = info;
expMap[pmId] = {payType, payTime};
});
let partyExpensesList = [];
let memberParam = { etId: 1, bId: {"%like%": bId} };
if(name) memberParam["name"] = {"%like%": name};
let memberClomun = ["pmId", "etId", "name", "partyPositionsName", "departmentName", "partyJoiningTime"];
let partyMenberDataList = await selectData(OPERATIONALDATATYPE.查询多个 , TABLENAME.党员基础信息表, memberParam, memberClomun);
partyMenberDataList.forEach(info => {
let {name, etId, pmId, partyPositionsName, departmentName, partyJoiningTime} = info;
let expInfo = expMap[pmId];
if (expInfo) {
let payTime = "";
if(expInfo.payTime) payTime = moment(expInfo.payTime).format("YYYY-MM-DD");
let partyPositions = "";
switch(etId) {
case configEnum.ENTRYTYPE.正式党员:
partyPositions = changeEnumValue(configEnum.PARTYPOSITIONS, JSON.parse(partyPositionsName));
if (!partyPositions || partyPositions=='undefined') partyPositions = "党员";
break;
default: partyPositions = changeEnumValue(configEnum.ENTRYTYPE, etId);
}
partyExpensesList.push({
name,
payType:changeEnumValue(configEnum.PAYTYPE, expInfo.payType),
pmId,
payTime,
partyPositionsName: partyPositions, //党内职务
departmentName: changeEnumValue(configEnum.DEDPARTMENT, JSON.parse(departmentName)), //所属科室
partyJoiningTime: `${new Date().getFullYear() - parseInt(partyJoiningTime)}年` //党龄
});
}
});
let baseExpenses = await selectData(OPERATIONALDATATYPE.查询多个 , TABLENAME.党费管理表, {bId, payableMonth: {"%between%": [stTime, etTime]}}, clomun);
let baseExpMap = {};//党费缴纳记录
baseExpenses.forEach(info => {
let {pmId, payType, payTime} = info;
baseExpMap[pmId] = {payType, payTime};
});
let baseMember = await selectData(OPERATIONALDATATYPE.查询多个 , TABLENAME.党员基础信息表, {etId: 1, bId: {"%like%": bId}}, memberClomun);
let baseData = { //基础数据
partyCount:baseMember.length,//党员总数,
paid:0, // 已缴纳
unpaid:0 // 未缴纳
};
baseMember.forEach(info => {
let expInfo = baseExpMap[info.pmId];
if (!expInfo) expInfo = {payType:configEnum.PAYTYPE.未缴纳, payTime:timeStr}; //对应党员没有缴纳信息,返回一条该月未缴纳数据
if (expInfo.payType == configEnum.PAYTYPE.未缴纳) baseData.unpaid += 1;
if (expInfo.payType == configEnum.PAYTYPE.已缴纳) baseData.paid += 1;
});
return {baseData, partyExpensesList};
}
/**
* 党员基础信息
*/
import * as configEnum from "../config/enum";
import * as clientEnum from "../config/clientEnum";
import * as verificationEnumTools from "../util/verificationEnum";
import { extractData } from "../util/piecemeal";
import * as splitResultConfig from "../config/splitResultConfig";
import moment = require("moment");
import { OPERATIONALDATATYPE, TABLENAME } from "../config/dbEnum";
import { selectData, selectManyTableData } from "../middleware/databaseSuccess";
/**
* 获取党员名册
* @param branchId 支部id
* @returns 返回格式 {nameList:[返回字段参考splitResultConfig文件中的partyMemberConfig配置], partyMemberCount:{目前党员人数}}
*/
export async function partyMemberNameList(bId:number, name:string) {
let branchName = verificationEnumTools.changeEnumValue(configEnum.BRANCHNAME, bId);
let partyMemberNum = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党员基础信息表, {bId:{"%like%":bId}}, []); //党员总数
let partyMemberCount = {
key: branchName + "目前党员人数",
value: partyMemberNum || 0
};
let param = {bId:{"%like%":bId}}
if (name) param["name"] = {"%like%":name};
let clomun = ["pmId", "name", "etId", "partyPositionsName", "partyJoiningTime", "departmentName"];
let partyMemberList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党员基础信息表, param, clomun);
let nameList = [];
/**截取返回字段 */
partyMemberList.forEach( info => {
let changeData:any = extractData(splitResultConfig.partyMemberConfig, info);
switch (changeData.etId) {
case configEnum.ENTRYTYPE.正式党员:
changeData.color = "#C62A23";
let partyPositions = JSON.parse(info.partyPositionsName);
changeData.partyPositionsName = verificationEnumTools.changeEnumValue(configEnum.PARTYPOSITIONS, partyPositions);
if (!changeData.partyPositionsName || changeData.partyPositionsName == "undefined") changeData.partyPositionsName = "党员";
break;
case configEnum.ENTRYTYPE.入党积极分子:
changeData.color = "#3549B0";
changeData.partyPositionsName = verificationEnumTools.changeEnumValue(configEnum.ENTRYTYPE, info.etId);
break;
case configEnum.ENTRYTYPE.预备党员:
changeData.color = "#E4B386";
changeData.partyPositionsName = verificationEnumTools.changeEnumValue(configEnum.ENTRYTYPE, info.etId);
break;
}
let time = moment(new Date()).format("YYYY");
let partyJoiningTime = time;
if (info.partyJoiningTime) partyJoiningTime = moment(info.partyJoiningTime).format("YYYY")
changeData.partyStanding = parseInt(time) - parseInt(partyJoiningTime) + "年";
let departmentName = JSON.parse(changeData.departmentName);
changeData.departmentName = verificationEnumTools.changeEnumValue(configEnum.DEDPARTMENT, departmentName);
nameList.push(changeData);
})
return {nameList, partyMemberCount};
}
/**
* 党员详情
* @param pmId 党员id
* @returns changeData:{返回字段参考splitResultConfig文件中的partyMemberDetailsConfig配置} 根据党员id返回党员详细信息
*/
export async function partyMemberDetails(bId:number, pmId:string) {
let clomun = ["bId", "pmId", "etId", "name", "sex", "birthDate", "phone", "levelOfEducation", "bId", "partyPositionsName", "partyJoiningTime", "administrativePositionName",
"departmentName", "askForTime", "listedAsActivistsTime", "liaison", "talkTime", "partyState"]
let partyMemberList = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.党员基础信息表, {pmId}, clomun);
let changeData:any = {};
/**截取返回字段 */
switch (partyMemberList.etId) {
case configEnum.ENTRYTYPE.正式党员:
changeData = extractData(splitResultConfig.partyMemberDetailsConfig, partyMemberList, "YYYY-MM-DD");
changeData.color = "#C62A23";
if(partyMemberList.partyPositionsName) changeData.partyPositionsName = verificationEnumTools.changeEnumValue(configEnum.PARTYPOSITIONS, JSON.parse(partyMemberList.partyPositionsName));
if(!changeData.partyPositionsName || changeData.partyPositionsName == "undefined") changeData.partyPositionsName = "党员";
break;
case configEnum.ENTRYTYPE.入党积极分子:
changeData = extractData(splitResultConfig.activistDetailsConfig, partyMemberList, "YYYY-MM-DD");
changeData.color = "#3549B0";
changeData.partyPositionsName = verificationEnumTools.changeEnumValue(configEnum.ENTRYTYPE, partyMemberList.etId);
break;
case configEnum.ENTRYTYPE.预备党员:
changeData = extractData(splitResultConfig.prepareDetailsConfig, partyMemberList, "YYYY-MM-DD");
changeData.color = "#E4B386";
changeData.partyPositionsName = verificationEnumTools.changeEnumValue(configEnum.ENTRYTYPE, partyMemberList.etId);
changeData.branchName = verificationEnumTools.changeEnumValue(configEnum.BRANCHNAME, partyMemberList.bId);
break;
}
changeData.departmentName = verificationEnumTools.changeEnumValue(configEnum.DEDPARTMENT, JSON.parse(partyMemberList.departmentName));
changeData.sex = verificationEnumTools.changeEnumValue(configEnum.SEX, partyMemberList.sex);
changeData.administrativePositionName = verificationEnumTools.changeEnumValue(configEnum.ADMINISTRATIVEPOSITION, partyMemberList.administrativePositionName);
changeData.partyState = verificationEnumTools.changeEnumValue(configEnum.PARTYSTATE, partyMemberList.partyState);
changeData.levelOfEducation = verificationEnumTools.changeEnumValue(configEnum.DEGREE, partyMemberList.levelOfEducation);
changeData.study = await getStudent(bId, pmId); //学习相关数据
let time = moment(new Date()).format("YYYY");
let partyJoiningTime = time;
if (changeData.partyJoiningTime) partyJoiningTime = moment(partyMemberList.partyJoiningTime).format("YYYY")
changeData.partyStanding = parseInt(time) - parseInt(partyJoiningTime) + "年";
return changeData;
}
/**
* 党员学习数据
* @param bId 支部
* @param pmId 党员
* @returns studentData:[{key:"学习排名", value:0},{key:"学习课时", value:0},{key:"学习进度", value:0}]
*/
export async function getStudent(bId:number, pmId:string) {
let orderParam = {"%orderDesc%": "dataTime", "%limit%": 1};
let monthData = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.学习强国, orderParam, ["dataTime"]);
if (!monthData || !monthData.dataTime) return [];
let dataTime = monthData.dataTime;
let stTime = moment(dataTime).startOf("month").format("YYYY-MM-DD HH:mm:ss");
let etTime = moment(dataTime).endOf('month').format("YYYY-MM-DD HH:mm:ss");
let param = {
dataTime:{"%between%": [stTime, etTime]}
};
if (bId) param["bId"] = {"%like%": bId};
let clomun = ["pmId", "bId", "dayIntegral", "dataTime"];
let includeConf = {"partyMember":["name"]}
let learningPowerData = await selectManyTableData(OPERATIONALDATATYPE.多表联查, TABLENAME.学习强国, param, clomun, includeConf);
let partyMemberNameData = {};
learningPowerData.forEach( info => {
let {pmId, partyMember, bId, dayIntegral, dataTime} = info;
if (!partyMemberNameData[partyMember.name]) {
partyMemberNameData[partyMember.name] = {
pmId,
name:partyMember.name,
bId:verificationEnumTools.changeEnumValue(configEnum.BRANCHNAME, bId),
dayIntegral:0,
dataTime: moment(dataTime).format("YYYY-MM"),
};
}
partyMemberNameData[partyMember.name].dayIntegral += dayIntegral;
});
let learningPowerList = Object.values(partyMemberNameData);
learningPowerList.sort( (a:any, b:any) => {
return b.dayIntegral - a.dayIntegral;
});
for ( let i = 0; i < learningPowerList.length; i++) {
learningPowerList[i]["ranking"] = i + 1;
}
let studentData:any = [{key: "学习排名", value: 0}];
let rateLearningData = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.学习进度表, {pmId}, ["mlId", "pmId", "rateOfLearning", "learningCompleted"]);
let memberLearningData = {rateOfLearning:0};
for (let i = 0; i < rateLearningData.length; i++) {
let rateLearning = rateLearningData[i];
let { rateOfLearning } = rateLearning;
memberLearningData.rateOfLearning += rateOfLearning;
}
let learningHours = rateLearningData.length || 0;
let rateOfLearning = memberLearningData.rateOfLearning / rateLearningData.length || 0;
studentData.push(
{key:"学习课时", value: learningHours},
{key:"学习进度", value: Math.round(rateOfLearning)}
);
return studentData;
}
/**
* 党建质量指数
*/
import * as configEnum from "../config/enum";
import { selectData } from "../middleware/databaseSuccess";
import { OPERATIONALDATATYPE, TABLENAME } from "../config/dbEnum";
import * as verificationEnumTools from "../util/verificationEnum";
import moment = require("moment");
/**
* 党建质量指数列表
* @param bId 支部id
* @returns [{"dataList":{"key":"一级指标名称","list":{"totalScore":0,"completionProgress":}}}]
*/
export async function partyQualityList(bId:number) {
let dataYear = moment(new Date().valueOf()).format("YYYY");
let clomun = ["tlId", "primaryIndicators", "secondaryIndicators", "thirdLevelContent", "thirdLevelScore", "currentScore", "completionProgress"];
let partyQualityData = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党建质量三级指标, {bId:{"%like%": bId}, dataYear}, clomun);
let partyQualityList = [];
for (let key in configEnum.PRIMARYINDICATORS) {
let primaryIndicatorsData = {};
let anyKey:any = key;
if (isNaN(anyKey)) {
const EnumValue = parseInt(configEnum.PRIMARYINDICATORS[key])
primaryIndicatorsData["dataList"] = {key: anyKey, list: []};
primaryIndicatorsData["detail"] = {};
partyQualityData.forEach( info => {
let schedule = "进行中";
let {tlId, primaryIndicators, secondaryIndicators, thirdLevelContent, thirdLevelScore, currentScore, completionProgress} = info; //一级指标、总分、三级指标得分、完成进度
if (completionProgress == 100) schedule = "已完成"
if (primaryIndicators == EnumValue) {
primaryIndicatorsData["dataList"]["list"].push({
primaryIndicators,
thirdLevelScore,
currentScore,
completionProgress,
schedule
});
let secondary = verificationEnumTools.changeEnumValue(configEnum.SECONDARYINDICATORS, secondaryIndicators);
if(!primaryIndicatorsData["detail"][secondary]) primaryIndicatorsData["detail"][secondary] = {schedule, dataList: []};
if (thirdLevelScore != currentScore) primaryIndicatorsData["detail"][secondary]["schedule"] = "进行中";
primaryIndicatorsData["detail"][secondary]["dataList"].push({
thirdLevelContent,
thirdLevelScore,
});
}
})
partyQualityList.push(primaryIndicatorsData);
}
}
let partyQuality = [];
partyQualityList.forEach( item => {
let {dataList, detail} = item;
let {key, list} = dataList;
let count = list.length;
let changeDataList = {};
let changeData:any = {totalScore:0, completionProgress:0, currentScore:0};
list.forEach( info => {
let {thirdLevelScore, currentScore, completionProgress, schedule} = info;
changeData.schedule = schedule;
changeData.totalScore += thirdLevelScore;
changeData.completionProgress += completionProgress;
changeData.currentScore += currentScore;
})
let completion = changeData.completionProgress/count;
if (completion == 100) changeData.schedule = "已完成";
changeData.completionProgress = Math.round(completion)+ "%"
changeDataList["key"] = key;
changeDataList["list"] = changeData;
partyQuality.push({dataList:changeDataList, detail});
})
return partyQuality;
}
/**
* 党建先锋
*/
import { OPERATIONALDATATYPE, TABLENAME } from "../config/dbEnum";
import { selectData } from "../middleware/databaseSuccess";
import { extractData } from "../util/piecemeal";
import * as splitResultConfig from "../config/splitResultConfig";
import * as configEnum from "../config/enum";
import * as verificationEnumTools from "../util/verificationEnum";
import moment = require("moment");
/**
* 获取党建先锋列表
* @param bId 弃用支部id,数据表删除该字段
* @param honorName
* @returns
*/
export async function partyVanguardList(bId:number, honorName:string) {
let param = {
isUse: 1,
};
if(honorName) param["honorName"] = {"%like%":honorName};
let clomun = ["pvId", "honorName", "honorType", "grantingRange", "grantingUnit", "grantTime"];
let partyVanguardData = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.党建先锋表, param, clomun);
let partyVanguardList = [];
partyVanguardData.forEach( async info => {
let changeData:any = extractData(splitResultConfig.partyVanguardConfig, info);
changeData.honorType = verificationEnumTools.changeEnumValue(configEnum.HONORTYPE, info.honorType);
changeData.grantingRange = verificationEnumTools.changeEnumValue(configEnum.GRANTINGRANGE, info.grantingRange);
changeData.grantTime = moment(info.grantTime).format("YYYY-MM-DD");
partyVanguardList.push(changeData);
});
return partyVanguardList;
}
/**
* 获取党建先锋荣誉详情
* @param pvId
* @returns
*/
export async function partyVanguardDetsils(pvId:number) {
let param = {pvId};
let clomun = ["honorName", "honorType", "grantingRange", "grantingUnit", "grantTime"];
let partyVanguardData = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.党建先锋表, param, clomun);
partyVanguardData.honorType = verificationEnumTools.changeEnumValue(configEnum.HONORTYPE, partyVanguardData.honorType);
partyVanguardData.grantingRange = verificationEnumTools.changeEnumValue(configEnum.GRANTINGRANGE, partyVanguardData.grantingRange);
partyVanguardData.grantTime = moment(partyVanguardData.grantTime).format("YYYY-MM-DD");
return partyVanguardData;
}
/**
* 党员入口登录
*/
import { ERRORENUM } from '../config/errorEnum';
import { BizError } from '../util/bizError';
import * as sysTools from "../tools/system";
import { operationalData, selectData } from '../middleware/databaseSuccess';
import { OPERATIONALDATATYPE, TABLENAME } from '../config/dbEnum';
const moment = require("moment");
export async function login(loginId:string, pwd:string) {
let clomun = ["pmId", "loginId", "pwd", "token", "bId"];
let loginInfo:any = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.党员基础信息表, {loginId}, clomun);
if (!loginInfo) throw new BizError(ERRORENUM.账号不存在, `${loginId}账号非党员账号`);
if (loginInfo.pwd != pwd) throw new BizError(ERRORENUM.密码错误);
const Token = sysTools.getToken(loginId);
let updateLogin = {
token: Token,
tokenMs: moment(new Date()).format("YYYY-MM-DD HH:mm:ss")
}
await operationalData(OPERATIONALDATATYPE.修改, TABLENAME.党员基础信息表, updateLogin, {loginId});
return {
userid: loginInfo.pmId,
token: Token,
bId: loginInfo.bId,
};
}
/**
* 修改密码
* 未使用
* @param uscc 信用代码
* @param pwd 原密码 md5之后的
* @param newPwd 新密码 未md5
* @param confirmPwd 确认新密码 未md5
* @returns {isSuccess:true}
*/
export async function changePassword(loginId:string, pwd:string, newPwd:string, confirmPwd:string ) {
if (newPwd != confirmPwd) throw new BizError(ERRORENUM.密码不一致);
if (newPwd.search(/^[A-Za-z0-9]{6,18}$/) < 0) throw new BizError(ERRORENUM.密码只能由618位字符和数字组成);
let partyMemberInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.党员基础信息表, {loginId}, ["pmId", "loginId", "pwd"]);
if (!partyMemberInfo) throw new BizError(ERRORENUM.未找到数据);
/**由于pwd是md5之后的 所以这里md5一次即可 */
let checkPwd = sysTools.getPwdMd5(partyMemberInfo.loginId, pwd);
if (partyMemberInfo.pwd != checkPwd) throw new BizError(ERRORENUM.密码错误);
/**考虑到如果前端把新密码也md5 就不可以验证是不是符合规则 所以前端传的是明文
* 我们初始化密码的时候 有两次加密 第一次是密码md5 然后再和loginId 进行md5
* 于是这里也要如此操作
*/
partyMemberInfo.pwd = sysTools.getPwdMd5(loginId, sysTools.md5PwdStr(newPwd));
await partyMemberInfo.save();
return {isSuccess:true};
}
/**
* 党员基础信息
*/
/**党内职务icon */
export enum PARTYPOSITIONSICON {
党员 = 1,
入党积极分子,
预备党员,
党总支书记 = 4,
党总支副书记,
党总支宣传委员,
党总支统战委员,
党总支纪检委员,
支部书记 = 100,
支部副书记,
纪检委员,
统战委员,
组织委员,
宣传委员,
}
/**
* 组织生活活动类型
*/
export enum TYPE {
全部活动 = 1,
正在进行,
即将开展,
已经开展,
}
/**
* 名册录入类型
*/
export enum ENTRYTYPE {
正式党员录入 = 1,
入党积极分子录入,
入党申请录入
}
/**
* 党内职务 partyPositions
*/
export enum PARTYPOSITIONS {
支部书记 = 100,
支部副书记,
纪检委员,
统战委员,
组织委员,
宣传委员,
}
\ No newline at end of file
/**
* 请求数据中心类型
*/
export enum OPERATIONALDATATYPE {
增加 = '/yfs/dataserver/mysql/table/add',
修改 = '/yfs/dataserver/mysql/table/update',
删除 = '/yfs/dataserver/mysql/table/delete',
查询单个 = '/yfs/dataserver/mysql/table/find/one',
查询多个 = '/yfs/dataserver/mysql/table/find/many',
分页查询 = '/yfs/dataserver/mysql/table/find/manytopage',
查询数据量 = '/yfs/dataserver/mysql/table/find/count',
多表联查 = '/yfs/dataserver/mysql/table/find/aggragate',
多表分页 = '/yfs/dataserver/mysql/table/find/aggragatetopage',
多表查询单个 = '/yfs/dataserver/mysql/table/find/aggragateone'
}
export enum TABLENAME {
支部表='branch',
后台用户表='adminUser',
党员基础信息表='partyMember',
行政职务表='administrativePosition',
党内职务表='partyPositions',
所属科室表='department',
支部制度表='branchSystem',
组织生活表='organizationalLife',
专题活动表='thematicActivities',
党建动态表='partyBuildingDynamic',
党费管理表='partyExpenses',
党建先锋表='partyVanguard',
党员学习表='memberLearning',
学习进度表='rateLearning',
课程类型='courseType',
学习强国='learningPower',
党建质量三级指标='thirdLevel',
}
\ No newline at end of file
/**
* 校验表单参数配置
* 使用场景: 验证客户端请求参数
* 限制: 1.使用端不同不能共用一份配置
* 2.需要搭配 util/verificationParam -> eccFormParam() 方法使用
* 说明: notMustHave = true 时说明该字段是非必填的;不配该字段说明是必填的
*/
/**
* 使用端: 小程序端_党员入口
* 场景: 创建组织生活活动表单
* 备注: 1.0
*/
export const CreateActivityConfig = {
partyActivityType:{type:"Number", notMustHave:true},//党建活动类型
activityStartTime:{type:"Number", notMustHave:true},//活动开始时间
activityEndTime:{type:"Number", notMustHave:true},//活动结束时间
activityAdd:{type:"String", notMustHave:true},//活动地点
activityHost:{type:"[String]", notMustHave:true},//活动主持人
activityNoteTaker:{type:"[String]", notMustHave:true},//活动记录人
leavePartyMember:{type:"[String]", notMustHave:true},//请假党员
participatingPartyMember:{type:"[String]", notMustHave:true},//参与党员
participationRecord:{type:"String", notMustHave:true},//活动记录
branchName:{type:"[Number]", notMustHave:true}, //支部名称
};
/**
* 文件------------------------
*/
/**上传文件类型 */
export enum FILETYPE {
word = 1,
pdf,
图片,
视频,
多类型,
其他
}
/**
* 党员基础信息表---------------------------
*/
/**名册录入类型 */
export enum ENTRYTYPE {
正式党员 = 1,
入党积极分子,
预备党员
}
/**性别 */
export enum SEX {
= 1,
}
/**文化程度 */
export enum DEGREE {
初中 = 1,
高中,
大专,
本科,
硕士,
博士
}
/**所属支部 */
export enum BRANCHNAME {
牙防所第一支部 = 1,
牙防所第二支部,
牙防所第三支部,
牙防所第四支部
}
/**行政职务 */
export enum ADMINISTRATIVEPOSITION {
职员 = 1,
办公室主任,
办公室副主任,
财务科副科长,
副所长,
口腔种植科主任,
副主任护师,
副主任医师,
工会主席,
口腔技术室主任 = 10,
护理部主任,
护师,
护士,
技师,
技士,
康健分所主任,
口腔颌面外科副主任,
口腔修复科副主任,
口腔正畸科主任,
口腔综合科副主任 = 20,
人事科科长,
项目管理工程师,
牙体牙髓科副主任,
牙周科主任,
医师,
医务科副科长,
预防口腔,
儿童口腔科主任,
执行所长,
主管护师 = 30,
主管技师,
主治医师,
}
/**党内职务 */
export enum PARTYPOSITIONS {
党总支书记 = 4,
党总支副书记,
党总支宣传委员,
党总支统战委员,
党总支纪检委员,
支部书记 = 100,
支部副书记,
纪检委员,
统战委员,
组织委员,
宣传委员,
}
/**所属科室 */
export enum DEDPARTMENT {
办公室 = 1,
财务科,
放射科,
工会,
技术室,
颌面外科,
护理,
护理部,
检验科,
康健分所,
科教科,
口腔颌面外科,
口腔科,
口腔修复科,
口腔正畸科,
口腔综合科,
人事科,
特需,
信息科,
修复科,
牙体牙髓科,
牙周科,
药房,
医务科,
预防科,
预防口腔,
儿童口腔科,
院部,
种植科,
正畸科,
综合科,
}
/**党员状态 */
export enum PARTYSTATE {
在党 = 1,
退党
}
/**
* 组织生活---------------------------
*/
/**主题类型 */
export enum THEMETYPE {
理论学习 = 1,
实践学习
}
/**
* 党费管理---------------------------
*/
/**缴纳状态 */
export enum PAYTYPE {
已缴纳 = 1,
未缴纳
}
/**
* 党建先锋---------------------------
*/
/**一级指标 */
export enum PRIMARYINDICATORS {
班子队伍健全 = 1,
教育管理党员规范,
党员先锋模范作用有力,
党风廉政行风建设有效,
医院文化建设到位,
特色亮点显著,
}
/**二级指标 */
export enum SECONDARYINDICATORS {
突出政治功能_dou确保政治站位 = 11,
组织架构完备_dou配强工作力量 = 12,
支部制度完善 = 13,
_zyh三会一课_yyh_dun主题党日活动规范落实 = 21,
党员发展_dun党籍管理_dun党费收缴_dun使用_dun管理规范 = 22,
教育培训及时到位 = 23,
日常亮身份_dun树形象 = 31,
各类先进评选 = 32,
参与行业党建_dun区域化党建 = 33,
履行党风廉政建设主体责任和监督责任 = 41,
医德医风和行风建设 = 42,
医院文化建设 = 51,
精神文明建设_dun统战和群团工作 = 52,
培育选树先进典型_dou打造医疗服务品牌 = 53,
常态化了解困难诉求_dou健全职工意见诉求机制 = 54,
开展党建课题研究_dou刊登发表党建论文 = 61,
社会影响大_dun特别典型 = 62,
积极开展党支部品牌创建 = 63,
}
/**荣誉类型 */
export enum HONORTYPE {
区级 = 1,
市级,
院级,
国家级,
}
/**授予范围 */
export enum GRANTINGRANGE {
个人 = 1,
团体,
单位,
}
/**
* 党员学习---------------------------
*/
/**课程类型 */
export enum COURSETYPE {
学习二十大 = 1,
党课,
四个意识,
四个自信,
}
export enum PBTYPE {
党建资讯 = 1,
党建动态,
}
export enum UPTYPE {
支部制度 = 1,
组织生活 = 2,
专题活动 = 3,
党建动态 = 4,
党员学习 = 5,
学习强国 = 6
}
export enum ERRORENUM {
身份验证失败 = 1,
非法登录,
身份验证过期,
参数错误,
地址数据不完整,
请完善信息,
该方法仅可进行数据操作,
数据操作失败,
数据查询失败,
数据联合查询失败,
该方法仅可进行查询操作,
该方法仅可进行联合查询操作,
分页请设置当前页数,
密码错误,
用户不存在,
该用户不是管理员,
目标用户不是正式党员,
管理员不可被删除,
权限不足,
目标数据不存在,
账号不存在,
密码不一致,
密码只能由618位字符和数字组成,
未找到数据,
库中不存在对应数据,
表单校验失败,
暂无对应数据,
该进度不是文字学习
}
export enum ERRORCODEENUM {
身份验证失败 = 401,
非法登录 = 402,
身份验证过期 = 403,
}
let bizErrorMsgMap = {};
for (let key in ERRORENUM) {
bizErrorMsgMap[ERRORENUM[key]] = key;
}
export function getBizMsg(param) {
return bizErrorMsgMap[param];
}
\ No newline at end of file
/**
* 拆分返回结果配置
* 使用场景:逻辑层中需要返回数据给客户端的地方
* 限制:使用端不同不能共用一份配置
*/
/**
* 使用端: 小程序_党员入口
* 场景: 首页党建资讯列表
*/
export const partyInformationConfig = {
taId:{key:"taId"},
theme:{key:"资讯标题"},
branchName:{key:"支部名称"},
dataMonth:{key:"资讯时间"},
pbType:{key:"资讯类型"},
};
/**
* 使用端: 小程序_党员入口
* 场景: 首页党建资讯列表
*/
export const buildingDynamiconfig = {
pbId:{key:"taId"},
theme:{key:"资讯标题"},
branchName:{key:"支部名称"},
dataMonth:{key:"资讯时间"},
pbType:{key:"资讯类型"},
};
/**
* 使用端: 小程序_党员入口
* 场景: 党员名称
* 备注: 党建名册的党员名册
*/
export const partyMemberConfig = {
pmId:{key:"pmId"},
name:{key:"姓名"},
etId:{key:"名册录入类型"},
partyPositionsName:{key:"党内职务"},
partyStanding:{key: "党龄"},
departmentName:{key:"所属科室"},
color:{key:"颜色"},
}
/**
* 使用端: 小程序_党员入口
* 场景: 党员详情
*/
export const partyMemberDetailsConfig = {
etId:{key:"名册录入类型"},
name:{key:"姓名"},
partyPositionsName:{key:"党内职务"},
partyStanding:{key: "党龄"},
departmentName:{key:"所属科室"},
study:{key:"学习情况"},
sex:{key:"性别"},
birthDate:{key:"出生年月", changeDate:true},
phone:{key:"手机号码"},
levelOfEducation:{key:"文化程度"},
partyJoiningTime:{key:"入党时间", changeDate:true},
administrativePositionName:{key:"行政职务"},
partyState:{key:"党员状态"},
color:{key:"颜色"},
}
/**
* 使用端: 小程序_党员入口
* 场景: 入党积极分子详情
*/
export const activistDetailsConfig = {
etId:{key:"名册录入类型"},
name:{key:"姓名"},
partyPositionsName:{key:"党内职务"},
departmentName:{key:"所属科室"},
study:{key:"学习情况"},
sex:{key:"性别"},
birthDate:{key:"出生年月", changeDate:true},
phone:{key:"手机号码"},
levelOfEducation:{key:"文化程度"},
askForTime:{key:"申请入党时间", changeDate:true},
listedAsActivistsTime:{key:"列为积极分子", changeDate:true},
liaison:{key:"联系人"},
administrativePositionName:{key:"行政职务"},
color:{key:"颜色"},
}
/**
* 使用端: 小程序_党员入口
* 场景: 预备党员详情
*/
export const prepareDetailsConfig = {
etId:{key:"名册录入类型"},
name:{key:"姓名"},
partyPositionsName:{key:"党内职务"},
departmentName:{key:"所属科室"},
study:{key:"学习情况"},
sex:{key:"性别"},
birthDate:{key:"出生年月", changeDate:true},
phone:{key:"手机号码"},
levelOfEducation:{key:"文化程度"},
branchName:{key:"所属支部"},
askForTime:{key:"申请入党时间", changeDate:true},
talkTime:{key:"谈话时间", changeDate:true},
administrativePositionName:{key:"行政职务"},
color:{key:"颜色"},
}
/**
* 使用端: 小程序_党员入口
* 场景: 党费管理
*/
export const partyExpensesConfig = {
pmId:{key:"pmId"},
payType:{key:"缴纳状态"},
payTime:{key:"缴费时间", changeDate:true},
name:{key:"姓名"},
partyPositionsName:{key:"党内职务"},
departmentName:{key:"所属科室"},
partyJoiningTime:{key:"入党时间", changeDate:true},
}
/**
* 使用端: 小程序_党员入口
* 场景: 党费管理
*/
export const expensesMenberConfig = {
name:{key:"姓名"},
partyPositionsName:{key:"党内职务"},
departmentName:{key:"所属科室"},
partyJoiningTime:{key:"入党时间", changeDate:true},
}
/**
* 使用端: 小程序_党员入口
* 场景: 党建先锋
*/
export const partyVanguardConfig = {
pvId:{key:"pvId"},
honorName:{key:"荣誉名称"},
honorType:{key:"荣誉类型"},
grantingRange:{key:"授予范围"},
grantingUnit:{key:"授予单位"},
grantTime:{key:"授予时间", changeDate:true}
}
/**
* 使用端: 小程序_党员入口
* 场景: 组织生活
*/
export const organlzationalLifeConfig = {
oId:{key:"oId"},
theme:{key:"活动标题"},
themeType:{key:"活动类型"},
dataMonth:{key:"活动月份", changeDate:true }
}
/**
* 使用端: 小程序_党员入口
* 场景: 党建资讯
*/
export const thematicActivitiesConfig = {
taId:{key:"pbId"},
theme:{key:"活动名称"},
dataMonth:{key:"数据月份", changeDate:true},
pbType:{key:"资讯类型"},
}
/**
* 使用端: 小程序_党员入口
* 场景: 党建动态
*/
export const partyBuildingDynamicConfig = {
pbId:{key:"pbId"},
theme:{key:"活动名称"},
dataMonth:{key:"数据月份", changeDate:true},
pbType:{key:"资讯类型"},
}
/**
* 使用端: 小程序_党员入口
* 场景: 本月积分排名
*/
export const learningPowerConfig = {
pmId:{key:"党员id"},
name:{key:"党员名称"},
bId:{key:"支部名称"},
dayIntegral:{key:"积分"},
dataTime:{key:"数据时间"}
}
/**
* 系统配置类
*
*/
export class ServerConfig {
/**系统配置 */
port:number;
dbPath:string;
dbSign:string;
imgUrl:string;
fileIP:string;
}
\ No newline at end of file
const path = require('path');
import * as fs from "fs";
import { BizError } from "../util/bizError";
import { analysisXml } from "../util/myXML";
import { ServerConfig } from "./systemClass";
const os = require('os');
/**被系统使用的配置 */
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) throw new BizError('xml中无配置');
else {
let { port, db, imgUrl, fileIP } = configInfo.config;
systemConfig.port = parseInt(port[0]);
/**数据读写服务 */
systemConfig.dbPath = db[0].url[0];
systemConfig.dbSign = db[0].sign[0];
/**图片地址 */
systemConfig.imgUrl = imgUrl[0];
/**文件服务地址 */
systemConfig.fileIP = fileIP[0];
}
console.log("config init success");
} catch(err) {
console.log('ERROR => 服务器配置解析错误 请检查根目录下 serverConfig.xml 文件是否正确');
console.log(err);
throw new BizError("服务器配置解析错误 请检查根目录下 serverConfig.xml 文件是否正确");
}
}
function analysisMongoConnectStr(path, port, dataBase, w, timeOutMs) {
return `mongodb://${path}:${port}/${dataBase}?w=${w}&wtimeoutMS=${timeOutMs}`
}
export function getEnum() {
}
\ No newline at end of file
import { initConfig, systemConfig} from "./config/systemConfig";
import { httpServer } from "./net/http_server";
import { initBasicData } from "./tools/dataInit";
import { md5PwdStr } from "./tools/system";
async function lanuch() {
/**初始化配置解析 */
await initConfig();
/**初始化底表数据 */
await initBasicData();
/**创建http服务 */
httpServer.createServer(systemConfig.port);
console.log('This indicates that the server is started successfully.');
await test();
}
lanuch();
function test() {
let pwd = md5PwdStr("admin");
console.log();
}
\ No newline at end of file
import { BizError } from "../util/bizError";
import { OPERATIONALDATATYPE, TABLENAME } from "../config/dbEnum";
import { ERRORENUM } from "../config/errorEnum";
import { post } from "../util/request";
import { systemConfig } from "../config/systemConfig";
/**
 * 操作数据库 新增  修改  删除
 * @param url url地址 根据枚举获取值
 * @param tableName 表名
 * @param data 数据
 * @param param 条件
 */
export async function operationalData(url:string, tableName:string, data, param) {
let header = {table:tableName, sign:systemConfig.dbSign};
let queray:any = {};
if (url == OPERATIONALDATATYPE.增加) {
queray.data = data;
} else if (url == OPERATIONALDATATYPE.修改) {
queray.data = data;
queray.param = param;
} else if (url == OPERATIONALDATATYPE.删除) {
queray.param = param;
} else {
throw new BizError(ERRORENUM.该方法仅可进行数据操作, '使用操作数据库的方法进行查询调用');
}
let result:any = await post(`${systemConfig.dbPath}${url}`, queray, header );
if (result.code != 200) throw new BizError(ERRORENUM.数据操作失败, result.code);
if (!result.data || !result.success) throw new BizError(ERRORENUM.数据操作失败, JSON.stringify(result.data));
return true;
}
/**
 * 查询
 * @param url url地址 根据枚举获取值
 * @param tableName 表名
 * @param param 条件
 * @param pageNumber 分页传入的页数  非分页可不传
 * @param pageSize 分页传入的单页大小  非分页可不传
 */
export async function selectData(url, tableName, param, column, pageNumber?, pageSize?) {
if (url != OPERATIONALDATATYPE.查询单个 && url != OPERATIONALDATATYPE.查询多个 && url != OPERATIONALDATATYPE.查询数据量 && url != OPERATIONALDATATYPE.分页查询) {
throw new BizError(ERRORENUM.该方法仅可进行数据操作, '该方法仅可进行查询操作');
}
let header = {table:tableName, sign:systemConfig.dbSign};
let queray:any = {param, column};
if (url == OPERATIONALDATATYPE.查询数据量) queray = {param};
if (url == OPERATIONALDATATYPE.分页查询) {
if (!pageNumber) throw new BizError(ERRORENUM.分页请设置当前页数, `pageNumber:${pageNumber};pageSize:${pageSize}`);
queray.pageNumber = pageNumber;
queray.pageSize = pageSize || 10;
}
let result:any = await post(`${systemConfig.dbPath}${url}`, queray, header );
if (result.code != 200) throw new BizError(ERRORENUM.数据操作失败, result.code);
if (!result.data || !result.success) throw new BizError(ERRORENUM.暂无对应数据, JSON.stringify(result.data));
return result.data.data;
}
/**
* 多表联查
* @param url url地址 根据枚举获取值
* @param tableName 表名
* @param param 参数
* @param column 返回的列
* @param includeConf {"表名":["",""]}
* @param pageNumber 分页传入的页数 非分页可不传
* @param pageSize 分页传入的单页大小 非分页可不传
* @returns
*/
export async function selectManyTableData(url, tableName, param, column, includeConf, pageNumber?, pageSize?) {
if (url != OPERATIONALDATATYPE.多表联查 && url != OPERATIONALDATATYPE.多表分页) {
throw new BizError(ERRORENUM.该方法仅可进行联合查询操作, '该方法仅可进行联合查询操作');
}
let header = {table:tableName, sign:systemConfig.dbSign};
let queray:any = {param, includeConf};
if (column && column.length) {
queray.column = column;
}
if (url == OPERATIONALDATATYPE.分页查询) {
if (!pageNumber) throw new BizError(ERRORENUM.分页请设置当前页数, `pageNumber:${pageNumber};pageSize:${pageSize}`);
queray.pageNumber = pageNumber;
queray.pageSize = pageSize || 10;
}
let result:any = await post(`${systemConfig.dbPath}${url}`, queray, header );
if (result.code != 200) throw new BizError(ERRORENUM.数据联合查询失败, result.code);
if (!result.data || !result.data.data) throw new BizError(ERRORENUM.数据联合查询失败, JSON.stringify(result.data));
return result.data.data;
}
export async function getDatabaseSuccess(url, data) {
let result;
if (data) {
if ( data.success === undefined || data.success === true ) {
result = data.data;
}
else {
result = data;
}
}else {
if (data.code == 5001) {
throw new BizError(`${url}: code: ${data.code}, msg: 请求头中没有sign或者sign不正确`);
} else if (data.code == 5002) {
throw new BizError(`${url}: code: ${data.code}, msg: 请求头中没有table字段`);
} else if (data.code == 5003) {
throw new BizError(`${url}: code: ${data.code}, msg: 请求头中传入的table不存在`);
}
}
return result;
}
\ No newline at end of file
var formidable = require("formidable");
const path = require('path');
export async function parseFormParam(req, res, next) {
var form = new formidable.IncomingForm();
form.uploadDir = path.join(__dirname.substring(0,__dirname.indexOf("out")), 'files');
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 { FILETYPE } from "../config/enum";
import { systemConfig } from "../config/systemConfig";
export enum urlEnum {
添加数据 = "/yfs/dataserver/table/add",
删除数据 = "/yfs/dataserver/table/delete",
修改单个数据 = "/yfs/dataserver/table/update/one",
修改多个数据 = "/yfs/dataserver/table/update/many",
查询单个数据 = "/yfs/dataserver/table/find/one",
查询多个数据 = "/yfs/dataserver/table/find/many",
分页查询 = "/yfs/dataserver/table/find/manytopage",
查询数据数量 = "/yfs/dataserver/table/find/count",
聚合查询 = "/yfs/dataserver/table/find/aggragate",
}
export function getUrl(url, urlName) {
return `${url}${urlName}`
}
/**
* 获取文件预览地址
* @param data
* @param token
* @param userid
* @returns
*/
export function getFileUrl(data, token, fileType, userid) {
let fileNameInfo = JSON.parse(data);
let fileNameList = [];
for(let i = 0; i < fileNameInfo.length; i++) {
fileNameList.push(`${systemConfig.fileIP}/yfs/files/${fileType}/${fileNameInfo[i]}?token=${token}&userid=${userid}`);
}
return fileNameList;
}
import { ERRORCODEENUM } from "../config/errorEnum";
/**
* 中间件 错误返回
* @param err
* @param req
* @param res
* @param next
*/
export function httpErrorHandler(err, req, res, next) {
console.log("in httpErrorHandler");
console.log(err);
//todo 自定义错误编码
if (err) {
if ( ERRORCODEENUM[err.message] ) {
res.success({success:false, msg:err.message, code:ERRORCODEENUM[err.message]});
next();
}
else {
res.success({success:false, msg:err.message, code:500});
next();
}
}
}
\ No newline at end of file
import { OPERATIONALDATATYPE, TABLENAME } from "../config/dbEnum";
import { ERRORCODEENUM, ERRORENUM } from "../config/errorEnum";
import { BizError } from "../util/bizError";
import { selectData } from "./databaseSuccess";
/**
* 中间件 校验小程序token
* @param req
* @param res
* @param next
* @returns
*/
export async function checkAppletToken(req, res, next) {
if (!req.headers) req.headers = {};
let ReqToken = req.headers.token;
let UserId = req.headers.userid;
if(!UserId || !ReqToken) return next(new BizError(ERRORENUM.非法登录));
let partyMemberInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.党员基础信息表, {pmId: UserId}, ["pmId", "bId", "loginId", "token"]);
if (!partyMemberInfo || !partyMemberInfo.pmId) return next(new BizError(ERRORENUM.身份验证失败));
if (!partyMemberInfo.token || partyMemberInfo.token != ReqToken) return next(new BizError(ERRORENUM.身份验证过期));
req.headers.userid = partyMemberInfo.pmId;
next();
}
export function watch(req, res, next) {
res.success = success.bind({res:res, req:req});
return next();
}
/**
* 中间件正确返回方法
* @param data
*/
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 { watch } from '../middleware/watch';
import { httpErrorHandler } from '../middleware/httpErrorHandler';
import * as path from "path";
import * as fallback from 'express-history-api-fallback';
export class httpServer {
static createServer(port:number) {
var httpServer = express();
httpServer.all('*', (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,request-origin,userid,token');
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');
next();
// if(req.method === 'OPTIONS'){
// res.statusCode = 200;
// res.end();
// }else{
// next();
// }
});
httpServer.use(express.static(path.join(__dirname, "../../img")) );
httpServer.use(express.static(path.join(__dirname, "../../files")) );
const root = path.join(__dirname, "../../public");
httpServer.use(express.static(root));
httpServer.use(fallback('index.html', { root }));
httpServer.use(bodyParser.json({limit:"1000kb"}));
httpServer.use(compression());
httpServer.use(watch);
routers.setRouter(httpServer);
httpServer.use(httpErrorHandler);
httpServer.listen(port);
console.log('server listen on port:'+port);
}
}
\ No newline at end of file
/**
* abi接口——党建分析
*/
import * as partyBuildingBiz from '../../biz/abi/partyBuilding';
import * as asyncHandler from 'express-async-handler';
import { eccReqParamater } from '../../util/verificationParam';
export function setRouter(httpServer) {
httpServer.post('/yfs/abi/partybuilding/leftscreen', asyncHandler(leftScreen));
httpServer.post('/yfs/abi/partybuilding/midscreen', asyncHandler(midScreen));
httpServer.post('/yfs/abi/partybuilding/rightscreen', asyncHandler(rightScreen));
}
async function leftScreen(req, res) {
let result = await partyBuildingBiz.getLeftScreen();
res.success(result);
}
async function midScreen(req, res) {
let {year} = eccReqParamater({year:'String'}, req.body);
let result = await partyBuildingBiz.getMidScreen(year);
res.success(result)
}
async function rightScreen(req, res) {
let result = await partyBuildingBiz.getRightScreen();
res.success(result);
}
\ No newline at end of file
/**
* abi接口——党建目标
*/
import * as targetBiz from '../../biz/abi/target';
import * as asyncHandler from 'express-async-handler';
export function setRouter(httpServer) {
httpServer.post('/yfs/abi/target/list', asyncHandler(targetData));
}
async function targetData(req, res) {
let result = await targetBiz.getTargetData();
res.success(result);
}
/**
* 小程序端 党员入口 党建首页路由
*/
import * as baseBiz from '../../biz/base';
import * as asyncHandler from 'express-async-handler';
import { eccReqParamater } from '../../util/verificationParam';
import { checkAppletToken } from '../../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/yfs/applet/partymember/home', checkAppletToken, asyncHandler(homeBase));
httpServer.post('/yfs/applet/partymember/activities', checkAppletToken, asyncHandler(activitiesBase));
}
/**
* 党建首页基础数据
* @param req
* @param res
*/
async function homeBase(req, res) {
//优化点 bId可以根据中间件验证token时获取,无需前端传递bId参数 其他接口也一样
let reqConf = {bId:'Number'};
let {bId} = eccReqParamater(reqConf, req.body);
let baseInfo = await baseBiz.homeData(bId);
res.success(baseInfo);
}
/**
* 党建首页党建资讯列表
* @param req
* @param res
*/
async function activitiesBase(req, res) {
let reqConf = {bId:'Number'};
let {bId} = eccReqParamater(reqConf, req.body);
let activitiesInfo = await baseBiz.activitiesData(bId);
res.success(activitiesInfo);
}
/**
* 小程序端 党员入口 支部制度
*/
import * as branchSystemBiz from '../../biz/branchSystem';
import * as asyncHandler from 'express-async-handler';
import { eccReqParamater } from '../../util/verificationParam';
import { checkAppletToken } from '../../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/yfs/applet/branchsystem/list', checkAppletToken, asyncHandler(getBranchSystem));
httpServer.post('/yfs/applet/branchsystem/detsils', checkAppletToken, asyncHandler(getBranchSystemDetsils));
}
/**
* 支部制度 制度列表
* @param req
* @param res
*/
async function getBranchSystem(req, res) {
let reqConf = {bId:'Number', systemTitle:'String'};
let {bId, systemTitle} = eccReqParamater(reqConf, req.body, ["systemTitle"]);
let result = await branchSystemBiz.branchSystemList(bId, systemTitle);
res.success(result);
}
/**
* 支部制度 制度细则
* @param req
* @param res
*/
async function getBranchSystemDetsils(req, res) {
let reqConf = {bsId: 'Number'};
let {bsId} = eccReqParamater(reqConf, req.body);
let token = req.headers.token;
let userid = req.headers.userid;
let result = await branchSystemBiz.branchSystemDetsils(bsId, token, userid);
res.success(result);
}
/**
* 小程序端 党员入口 党员学习
*/
import * as memberLearningBiz from '../../biz/memberLearning';
import * as asyncHandler from 'express-async-handler';
import { eccReqParamater } from '../../util/verificationParam';
import { checkAppletToken } from '../../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/yfs/applet/memberlearning/list', checkAppletToken, asyncHandler(getMemberLearning));
httpServer.post('/yfs/applet/memberlearning/branchranking', checkAppletToken, asyncHandler(getBranchRanking));
httpServer.post('/yfs/applet/memberlearning/monthranking', checkAppletToken, asyncHandler(getMonthRanking));
httpServer.post('/yfs/applet/memberlearning/updateschedule', checkAppletToken, asyncHandler(updateRateLearning));
httpServer.post('/yfs/applet/memberlearning/updatefileschedule', checkAppletToken, asyncHandler(updateFileRateLearning));
}
/**
* 党建先锋 视频课程与文字课程列表
* @param req
* @param res
*/
async function getMemberLearning(req, res) {
let pmId = req.headers.userid;
let reqConf = {courseEntryType:'Number', courseTypeName:'Number', contentTitle:'String'};
let {courseEntryType, courseTypeName, contentTitle} = eccReqParamater(reqConf, req.body);
let token = req.headers.token;
let userid = req.headers.userid;
let result = await memberLearningBiz.memberLearningList(pmId, courseEntryType, courseTypeName, contentTitle, token, userid);
res.success(result);
}
/**
* 学习强国 支部学习排行
* @param req
* @param res
*/
async function getBranchRanking(req, res) {
let pmId = req.headers.userid;
let {bId} = eccReqParamater({bId:'Number'}, req.body);
let result = await memberLearningBiz.branchRanking(pmId, bId);
res.success(result);
}
/**
* 学习强国 本月学习排行
* @param req
* @param res
*/
async function getMonthRanking(req, res) {
let pmId = req.headers.userid;
let result = await memberLearningBiz.branchRanking(pmId);
res.success(result);
}
/**
* 修改学习进度
* @param req
* @param res
*/
async function updateRateLearning(req, res) {
let reqConf = {rlId:'Number', rateOfLearning:'Number'};
let {rlId, rateOfLearning} = eccReqParamater(reqConf, req.body);
let result = await memberLearningBiz.updateRateOfLearning(rlId, rateOfLearning);
res.success(result);
}
/**
* 修改学习进度 文档学习
* @param req
* @param res
*/
async function updateFileRateLearning(req, res) {
let reqConf = {rlId:'Number', fileName:'String'};
let {rlId, fileName} = eccReqParamater(reqConf, req.body);
let result = await memberLearningBiz.updateDocRateOfLearning(rlId, fileName);
res.success(result);
}
/**
* 小程序端 党员入口 组织生活路由
*/
import * as organizationalLifeBiz from '../../biz/organizationalLife';
import * as asyncHandler from 'express-async-handler';
import { eccReqParamater } from '../../util/verificationParam';
import { checkAppletToken } from '../../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/yfs/applet/organizationallife/list', checkAppletToken, asyncHandler(organizationalLifeList));
httpServer.post('/yfs/applet/organizationallife/details', checkAppletToken, asyncHandler(detailsList));
}
/**
* 组织生活列表
* @param req
* @param res
*/
async function organizationalLifeList(req, res) {
let reqConf = {bId:'Number', theme:'String', themeType:'Number', dataMonth:'String'};
let {bId, theme, themeType, dataMonth} = eccReqParamater(reqConf, req.body, ["theme","themeType","dataMonth"]);
let result = await organizationalLifeBiz.organizationalLifeList(bId, theme, themeType, dataMonth);
res.success(result);
}
/**
* 组织生活详情
* @param req
* @param res
*/
async function detailsList(req, res) {
let reqConf = {oId: 'Number' };
let {oId} = eccReqParamater(reqConf, req.body);
let token = req.headers.token;
let userid = req.headers.userid;
let result = await organizationalLifeBiz.organlzationalLifeListDetsils(oId, token, userid);
res.success(result);
}
/**
* 小程序端 党员入口 党建动态路由
*/
import * as partyBuildingDynamicBiz from '../../biz/partyBuildingDynamic';
import * as asyncHandler from 'express-async-handler';
import { eccReqParamater } from '../../util/verificationParam';
import { checkAppletToken } from '../../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/yfs/applet/buildingdynamic/list', checkAppletToken, asyncHandler(partyBuildingDynamicList));
httpServer.post('/yfs/applet/buildingdynamic/details', checkAppletToken, asyncHandler(detailsList));
}
/**
* 党建动态列表
* @param req
* @param res
*/
async function partyBuildingDynamicList(req, res) {
let reqConf = {bId:'Number', theme:'String', activityYear:'String', activityMonth:'String'};
let {bId, theme, activityYear, activityMonth} = eccReqParamater(reqConf, req.body, ["theme","activityYear","activityMonth"]);
let result = await partyBuildingDynamicBiz.partyBuildingDynamicList(bId, theme, activityYear, activityMonth);
res.success(result);
}
/**
* 党建动态详情
* @param req
* @param res
*/
async function detailsList(req, res) {
let reqConf = {pbId: 'Number', pbType: 'Number'};
let {pbId, pbType} = eccReqParamater(reqConf, req.body);
let token = req.headers.token;
let userid = req.headers.userid;
let result = await partyBuildingDynamicBiz.partyBuildingDynamicDetsils(pbId, pbType, token, userid);
res.success(result);
}
/**
* 小程序端 党员入口 党费管理
*/
import * as partyExpensesBiz from '../../biz/partyExpenses';
import * as asyncHandler from 'express-async-handler';
import { eccReqParamater } from '../../util/verificationParam';
import { checkAppletToken } from '../../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/yfs/applet/partyexpenses/list', checkAppletToken, asyncHandler(getPartyExpenses));
}
/**
* 党费列表
* @param req
* @param res
*/
async function getPartyExpenses(req, res) {
let reqConf = {bId:'Number', name:'String', payType:'Number', payableYear:'String', payableMonth:'String'};
let {bId, name, payType, payableYear, payableMonth} = eccReqParamater(reqConf, req.body, ["name", "payType", "payableYear", "payableMonth"]);
let result = await partyExpensesBiz.partyExpensesData(bId, name, payType, payableYear, payableMonth);
res.success(result);
}
\ No newline at end of file
/**
* 小程序端 党员入口 党员基础信息
*/
import * as partyMemberBiz from '../../biz/partyMember';
import * as asyncHandler from 'express-async-handler';
import { eccReqParamater } from '../../util/verificationParam';
import { checkAppletToken } from '../../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/yfs/applet/partymember/partymembername', checkAppletToken, asyncHandler(getPartyMemberName));
httpServer.post('/yfs/applet/partymember/detsils', checkAppletToken, asyncHandler(partyDetsils));
}
/**
* 党员名册
* @param req
* @param res
*/
async function getPartyMemberName(req, res) {
let reqConf = {bId:'Number', name:'String'};
let {bId, name} = eccReqParamater(reqConf, req.body, ["name"]);
let result = await partyMemberBiz.partyMemberNameList(bId, name);
res.success(result);
}
/**
* 党员详情
* @param req
* @param res
*/
async function partyDetsils(req, res) {
let reqConf = {bId: 'Number', pmId: 'String'};
let {bId, pmId} = eccReqParamater(reqConf, req.body);
let result = await partyMemberBiz.partyMemberDetails(bId, pmId);
res.success(result);
}
/**
* 小程序端 党员入口 党建质量指数 三级指标
*/
import * as partyQualityBiz from '../../biz/partyQuality';
import * as asyncHandler from 'express-async-handler';
import { eccReqParamater } from '../../util/verificationParam';
import { checkAppletToken } from '../../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/yfs/applet/partyquality/list', checkAppletToken, asyncHandler(getPartyQuality));
// httpServer.post('/yfs/applet/partyquality/detsils', asyncHandler(getPartyVanguardDetsils));
}
/**
* 党建指标指数 三级指标列表
* @param req
* @param res
*/
async function getPartyQuality(req, res) {
let reqConf = {bId:'Number'};
let {bId} = eccReqParamater(reqConf, req.body);
let result = await partyQualityBiz.partyQualityList(bId);
res.success(result);
}
/**
* 党建先锋 获取荣誉详情
* @param req
* @param res
*/
// async function getPartyVanguardDetsils(req, res) {
// let reqConf = {pvId:'Number'};
// let {pvId} = eccReqParamater(reqConf, req.body);
// let result = await partyQualityBiz.partyVanguardDetsils(pvId);
// res.success(result);
// }
/**
* 小程序端 党员入口 党建先锋
*/
import * as partyVanguardBiz from '../../biz/partyVanguard';
import * as asyncHandler from 'express-async-handler';
import { eccReqParamater } from '../../util/verificationParam';
import { checkAppletToken } from '../../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/yfs/applet/partyvanguard/list', checkAppletToken, asyncHandler(getPartyVanguard));
httpServer.post('/yfs/applet/partyvanguard/detsils', checkAppletToken, asyncHandler(getPartyVanguardDetsils));
}
/**
* 党建先锋 荣誉列表
* @param req
* @param res
*/
async function getPartyVanguard(req, res) {
let reqConf = {bId:'Number', honorName:'String'};
let {bId, honorName} = eccReqParamater(reqConf, req.body, ["honorName"]);
let result = await partyVanguardBiz.partyVanguardList(bId, honorName);
res.success(result);
}
/**
* 党建先锋 获取荣誉详情
* @param req
* @param res
*/
async function getPartyVanguardDetsils(req, res) {
let reqConf = {pvId:'Number'};
let {pvId} = eccReqParamater(reqConf, req.body);
let result = await partyVanguardBiz.partyVanguardDetsils(pvId);
res.success(result);
}
/**
* 小程序端 党员入口 用户基础功能路由
*/
import * as userBiz from '../../biz/user';
import * as asyncHandler from 'express-async-handler';
import { eccReqParamater } from '../../util/verificationParam';
import { checkAppletToken } from '../../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/yfs/applet/partymember/login', asyncHandler(login));
httpServer.post('/yfs/applet/partymember/changePwd', checkAppletToken, asyncHandler(changePwd));
}
/**
* 党员入口登录
* @param req
* @param res
*/
async function login(req, res) {
let reqConf = {loginId:'String', pwd:'String'};
let {loginId, pwd} = eccReqParamater(reqConf, req.body);
let userInfo = await userBiz.login(loginId, pwd);
res.success(userInfo);
}
/**
* 修改密码
* @param req
* @param res
*/
async function changePwd(req, res) {
let reqConf = {confirmPwd:'String', newPwd:'String', pwd:'String' };
let {confirmPwd, newPwd, pwd} = eccReqParamater(reqConf, req.body);
const Uscc = req.headers.uscc;
let result = await userBiz.changePassword(Uscc, pwd, newPwd, confirmPwd);
res.success(result);
}
\ No newline at end of file
/**
* 公共资源路由
*/
import * as asyncHandler from 'express-async-handler';
import * as configEnum from "../config/enum";
import * as clientConfigEnum from "../config/clientEnum";
import moment = require('moment');
export function setRouter(httpServer) {
httpServer.post('/yfs/applet/public/partypositions', asyncHandler(partyPositions));
httpServer.post('/yfs/applet/public/type', asyncHandler(type));
httpServer.post('/yfs/applet/public/entrytype', asyncHandler(entryType));
httpServer.post('/yfs/applet/public/sex', asyncHandler(sexType));
httpServer.post('/yfs/applet/public/degree', asyncHandler(degreeType));
httpServer.post('/yfs/applet/public/administrativeposition', asyncHandler(administrativePosition));
httpServer.post('/yfs/applet/public/department', asyncHandler(department));
httpServer.post('/yfs/applet/public/degreetype', asyncHandler(degreeType));
httpServer.post('/yfs/applet/public/honortype', asyncHandler(honorType));
httpServer.post('/yfs/applet/public/themetype', asyncHandler(themeType));
httpServer.post('/yfs/applet/public/paytype', asyncHandler(payType));
httpServer.post('/yfs/applet/public/paytime', asyncHandler(getPayTime));
httpServer.post('/yfs/applet/public/coursetype', asyncHandler(courseType));
}
/**
* 党内职务
* @param req
* @param res
*/
function partyPositions(req, res) {
let dataList = getEnumList(configEnum.PARTYPOSITIONS);
res.success(dataList);
}
/**
* 组织生活活动类型
* @param req
* @param res
*/
function type(req, res) {
let dataList = getEnumList(clientConfigEnum.TYPE);
res.success(dataList);
}
/**
* 组织生活主题类型
* @param req
* @param res
*/
function themeType(req, res) {
let dataList = getEnumList(configEnum.THEMETYPE);
dataList.unshift({key:"全部活动", value: 0});
res.success(dataList);
}
/**
* 名册录入类型
* @param req
* @param res
*/
function entryType(req, res) {
let dataList = getEnumList(clientConfigEnum.ENTRYTYPE);
res.success(dataList);
}
/**
* 性别类型
* @param req
* @param res
*/
function sexType(req, res) {
let dataList = getEnumList(configEnum.SEX);
res.success(dataList);
}
/**
* 文化程度类型
* @param req
* @param res
*/
function degreeType(req, res) {
let dataList = getEnumList(configEnum.DEGREE);
res.success(dataList);
}
/**
* 行政职务类型
* @param req
* @param res
*/
function administrativePosition(req, res) {
let dataList = getEnumList(configEnum.ADMINISTRATIVEPOSITION);
res.success(dataList);
}
/**
* 所属科室类型
* @param req
* @param res
*/
function department(req, res) {
let dataList = getEnumList(configEnum.DEDPARTMENT);
res.success(dataList);
}
/**
* 荣誉类型
* @param req
* @param res
*/
function honorType(req, res) {
let dataList = getEnumList(configEnum.HONORTYPE);
res.success(dataList);
}
/**
* 缴纳状态
* @param req
* @param res
*/
function payType(req, res) {
let dataList = getEnumList(configEnum.PAYTYPE);
dataList.unshift({key:"全部", value: 0});
res.success(dataList);
}
/**
* 课程类型
* @param req
* @param res
*/
function courseType(req, res) {
let dataList = getEnumList(configEnum.COURSETYPE);
res.success(dataList);
}
/**
* 下拉年份月份
* @param req
* @param res
*/
async function getPayTime(req, res) {
let result = await payTime();
res.success(result);
}
function getEnumList(enumData) {
let dataList= [];
for (let key in enumData) {
let anyKey:any = key;
if (isNaN(anyKey)) {
let keyStr = key;
dataList.push({key:keyStr, value:enumData[key]});
}
}
return dataList;
}
/**
* 缴纳时间
*/
export function payTime() {
let smallYear = 2018; //数据开始年份
let nowYear = parseInt(moment(new Date()).format("YYYY")); //当前年份
let yearList = [];
let monthList = [];
let nowMonth = parseInt(moment(new Date()).format("MM"));
let yearmonth = [];
for(let i = 1; i <= nowMonth; i++) {
yearmonth.push(i);
}
monthList.push(yearmonth);
for(let i = nowYear; i >= smallYear; i--) {
yearList.push(i);
let yearmonth = [];
for(let m = 1; m <= 12; m++){
yearmonth.push(m);
}
monthList.push(yearmonth);
}
return {yearList, monthList};
}
\ No newline at end of file
/**
* 总路由入口
*/
import * as appletUserRouters from '../routers/applet/user';
import * as appletBaseRouters from '../routers/applet/base';
import * as appletPartyMemberRouters from '../routers/applet/partyMember';
import * as appletBranchSystemRouters from '../routers/applet/branchSystem';
import * as appletOrganizationalLifeRouters from '../routers/applet/organizationalLife';
import * as appletPartyVanguardRouters from '../routers/applet/partyVanguard';
import * as appletPartyExpensesRouters from '../routers/applet/partyExpenses';
import * as appletPartyQualityRouters from '../routers/applet/partyQuality';
import * as partyBuildingDynamicRouters from '../routers/applet/partyBuildingDynamic';
import * as memberLearningRouters from '../routers/applet/memberLearning';
import * as publicRouters from '../routers/public';
import * as abiPartyBuildingRouters from './abi/partyBuilding';
import * as abiTargetRouters from './abi/target';
export function setRouter(httpServer){
/**小程序端 党员入口 */
appletUserRouters.setRouter(httpServer);
appletBaseRouters.setRouter(httpServer);
appletPartyMemberRouters.setRouter(httpServer);
appletBranchSystemRouters.setRouter(httpServer);
appletOrganizationalLifeRouters.setRouter(httpServer);
appletPartyVanguardRouters.setRouter(httpServer);
appletPartyExpensesRouters.setRouter(httpServer);
appletPartyQualityRouters.setRouter(httpServer);
partyBuildingDynamicRouters.setRouter(httpServer);
memberLearningRouters.setRouter(httpServer);
/**小程序端 公共资源 */
publicRouters.setRouter(httpServer);
/**ABI */
abiPartyBuildingRouters.setRouter(httpServer);
abiTargetRouters.setRouter(httpServer);
}
\ No newline at end of file
import { OPERATIONALDATATYPE, TABLENAME } from "../config/dbEnum";
import { operationalData, selectData } from "../middleware/databaseSuccess";
import * as enums from "../config/enum";
import { getPwdMd5, md5PwdStr } from "./system";
import moment = require("moment");
const xlsx = require('node-xlsx');
const path = require('path');
const md5 = require("md5");
const PartyPositionsChangeConfig = {
"党总支书记": enums.PARTYPOSITIONS.党总支书记,
"党总支副书记": enums.PARTYPOSITIONS.党总支副书记,
"党总支宣传委员": enums.PARTYPOSITIONS.党总支宣传委员,
"党总支统战委员": enums.PARTYPOSITIONS.党总支统战委员,
"党总支纪检委员": enums.PARTYPOSITIONS.党总支纪检委员,
"支部书记": enums.PARTYPOSITIONS.支部书记,
"支部副书记": enums.PARTYPOSITIONS.支部副书记,
"纪检委员": enums.PARTYPOSITIONS.纪检委员,
"统战委员": enums.PARTYPOSITIONS.统战委员,
"组织委员": enums.PARTYPOSITIONS.组织委员,
"宣传委员": enums.PARTYPOSITIONS.宣传委员,
}
const BranchNameChangeConfig = {
"牙防所第一支部": enums.BRANCHNAME.牙防所第一支部,
"牙防所第二支部": enums.BRANCHNAME.牙防所第二支部,
"牙防所第三支部": enums.BRANCHNAME.牙防所第三支部,
"牙防所第四支部": enums.BRANCHNAME.牙防所第四支部,
}
const DepartmentConfig = {
"办公室": enums.DEDPARTMENT.办公室,
"财务科": enums.DEDPARTMENT.财务科,
"放射科": enums.DEDPARTMENT.放射科,
"工会": enums.DEDPARTMENT.工会,
"技术室": enums.DEDPARTMENT.技术室,
"颌面外科": enums.DEDPARTMENT.颌面外科,
"护理": enums.DEDPARTMENT.护理,
"护理部": enums.DEDPARTMENT.护理部,
"检验科": enums.DEDPARTMENT.检验科,
"康健分所": enums.DEDPARTMENT.康健分所,
"科教科": enums.DEDPARTMENT.科教科,
"口腔颌面外科": enums.DEDPARTMENT.口腔颌面外科,
"口腔科": enums.DEDPARTMENT.口腔科,
"口腔修复科": enums.DEDPARTMENT.口腔修复科,
"口腔正畸科": enums.DEDPARTMENT.口腔正畸科,
"口腔综合科": enums.DEDPARTMENT.口腔综合科,
"人事科": enums.DEDPARTMENT.人事科,
"特需": enums.DEDPARTMENT.特需,
"信息科": enums.DEDPARTMENT.信息科,
"修复科": enums.DEDPARTMENT.修复科,
"牙体牙髓科": enums.DEDPARTMENT.牙体牙髓科,
"牙周科": enums.DEDPARTMENT.牙周科,
"药房": enums.DEDPARTMENT.药房,
"医务科": enums.DEDPARTMENT.医务科,
"预防科": enums.DEDPARTMENT.预防科,
"预防口腔": enums.DEDPARTMENT.预防口腔,
"儿童口腔科": enums.DEDPARTMENT.儿童口腔科,
"院部": enums.DEDPARTMENT.院部,
"种植科": enums.DEDPARTMENT.种植科,
"正畸科": enums.DEDPARTMENT.正畸科,
"综合科": enums.DEDPARTMENT.综合科,
}
export async function initBasicData() {
await initPartyMember();
await initLearningPower();
await initPartyExpenses();
await ininThirdLevel();
// await initOrganizationalLife();
// await initPartyVanguard();
// await initBranchSystem();
// await initInforMation();
}
/**
* 党员基础信息初始化
*/
async function initPartyMember() {
let count = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党员基础信息表, {}, []); //党员总数
if (count > 5) {
console.log("***** 党员基础信息数据 无需初始化 *****");
return;
}
let {sheetMap} = getExcel(path.join(__dirname.substring(0, __dirname.indexOf("out")), "res", "牙防所基础数据收集.xlsx"));
let dataList = sheetMap["党员信息"];
let titleMap = {
"0": "name", //姓名
"1": "sex", //性别
"2": "birthDate", //出生时间
"3": "phone", //手机号码
"4": "levelOfEducation", //文化程度
"5": "partyJoiningTime", //入党时间
"6": "administrativePositionName", //行政职务
"7": "remarks", //备注
"8": "etId", //名册录入类型
"9": "partyPositionsName", //党内职务
"10": "listedAsActivistsTime", //列为积极份子时间(入党积极份子填写)
"11": "askForTime", //申请入党时间(入党申请填写)
"12": "talkTime", //谈话时间(入党申请填写)
"13": "bId", //支部名称
"14": "departmentName", //所属科室
"15": "partyState", //党员状态
}
let utc = new Date();
let addList = [];
dataList.forEach( (subList, index) => {
if (!index) return; //跳过表头
let addDataInfo:any = {
pmId: null,
etId: null,
name: null,
sex: null,
birthDate: null,
phone: null,
levelOfEducation: null,
bId: null,
partyJoiningTime: null,
administrativePositionName: null,
partyPositionsName: null,
departmentName: null,
askForTime: null,
listedAsActivistsTime: null,
liaison: null,
talkTime: null,
partyState: null,
isAdmin: false,
loginId: null,
pwd: null,
}
for (let i = 0; i <= 15; i++) {
let item = subList[i];
let key = titleMap[i];
let value = item;
if (i == 1) {
value = enums.SEX[item] || 0;
}
if (i == 2 && item) {
value = moment(item).format("YYYY-MM-DD");
}
if (i ==3) {
let itemStr = `${item}`;
if(!addDataInfo.pmId) addDataInfo.pmId = md5PwdStr(itemStr.slice(itemStr.length-6));
if(!addDataInfo.pwd) addDataInfo.pwd = md5PwdStr(itemStr.slice(itemStr.length-6));
else addDataInfo.pwd = md5PwdStr(addDataInfo.pwd);
addDataInfo.loginId = itemStr;
}
if (i == 4) {
value = enums.DEGREE[item] || 1;
}
if (i == 5 && item) {
value = moment(item).format("YYYY-MM-DD");
}
if (i == 6) {
value = enums.ADMINISTRATIVEPOSITION[item] || 0;
}
if (i == 8) {
value = enums.ENTRYTYPE[item] || 1;
}
if (i == 9) {
value = [];
if (item) {
let oldList = item.split(',');
oldList.forEach(oldStr => {
let valueNum = PartyPositionsChangeConfig[oldStr.trim()];
if (valueNum) value.push(valueNum);
});
};
value = JSON.stringify(value);
}
if (i == 10 && item) {
value = moment(item).format("YYYY-MM-DD");
}
if (i == 11 && item) {
value = moment(item).format("YYYY-MM-DD");
}
if (i == 12 && item) {
value = moment(item).format("YYYY-MM-DD");
}
if (i == 13) {
value = enums.BRANCHNAME[item] || 1;
}
if (i == 14) {
value = [];
if (item) {
let oldList = item.split(',');
oldList.forEach(oldStr => {
let valueNum = DepartmentConfig[oldStr.trim()];
if (valueNum) value.push(valueNum);
});
};
value = JSON.stringify(value);
}
if (i == 15) {
value = enums.PARTYSTATE[item] || 0;
}
addDataInfo[key] = value;
}
addList.push(addDataInfo);
})
// await createPartyMember(addList);
let rows = await operationalData(OPERATIONALDATATYPE.增加, TABLENAME.党员基础信息表, addList, {}); //党员总数
console.log(rows);
console.log("---> 党员基础信息 初始化成功");
}
/**
* 学习强国初始化
*/
async function initLearningPower() {
// let count = await groupFindPartyVanguardCount({});
let count = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.学习强国, {}, []); //党员总数
if (count >= 1) {
console.log("***** 学习强国数据 无需初始化 *****");
return;
}
let {sheetMap} = getExcel(path.join(__dirname.substring(0, __dirname.indexOf("out")), "res", "学习强国时长排名.xlsx"));
let id = 1;
for (let sheepKey in sheetMap) {
let dataList = sheetMap[sheepKey];
let titleMap = {
"0": "partyMemberName", //姓名
"1": "bId", //支部
"2": "dayIntegral", //当日积分
"3": "totalIntegral", //总积分
};
let addList = [];
for(let index = 1; index < dataList.length; index++) {
let subList = dataList[index];
let addDataInfo:any = {
lpId: id,
pmId: null,
bId: null,
dayIntegral: null,
totalIntegral: null,
dataYear: null,
dataMonth: null,
dataDay: null,
dataTime: null
}
for (let i = 0; i <= 3; i++) {
let item = subList[i];
let key = titleMap[i];
let value = item;
if (i == 0) {
// console.log(item);
let partyMemberDate = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.党员基础信息表, {name:item}, ["pmId"]); //党员总数
if (!partyMemberDate) continue;
addDataInfo["pmId"] = partyMemberDate.pmId;
value = item;
}
if (i == 1) {
value = enums.BRANCHNAME[item] || 1;
}
if (value || value == 0) addDataInfo[key] = value;
}
addDataInfo["dataYear"] = 2023;
addDataInfo["dataMonth"] = moment("2023." + sheepKey).month() + 1;
addDataInfo["dataDay"] = moment("2023." + sheepKey).date();
addDataInfo["dataTime"] = moment("2023." + sheepKey).format("YYYY-MM-DD HH:mm:ss");
if (addDataInfo.pmId) addList.push(addDataInfo);
id++;
}
let rows = await operationalData(OPERATIONALDATATYPE.增加, TABLENAME.学习强国, addList, {});
console.log(rows);
console.log(sheepKey + "---> 学习强国信息 初始化成功");
}
}
/**
* 组织生活初始化
*/
async function initOrganizationalLife() {
// let count = await groupFindActivityCount({});
let count = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.组织生活表, {}, []);
if (count >= 1) {
console.log("***** 组织生活数据 无需初始化 *****");
return;
}
let {sheetMap} = getExcel(path.join(__dirname.substring(0, __dirname.indexOf("out")), "res", "牙防所基础数据收集.xlsx"));
let dataList = sheetMap["组织生活"];
let titleMap = {
"0": "themeType", //活动类型
"1": "dataMonth", //活动时间
"2": "theme", //活动主题
"3": "bId", //支部名称
"4": "fileName", //活动文件
"5": "fileType", //文件类型
};
let addList = [];
dataList.forEach( (subList, index) => {
if (!index) return; //跳过表头
let addDataInfo:any = {
oId: index,
theme: null,
themeType: null,
dataMonth: null,
bId: null,
fileName: null,
fileType: null,
uploadTime: moment(new Date()).format("YYYY-MM-DD HH:mm:ss")
}
for (let i = 0; i <= 5; i++) {
let item =subList[i];
let key = titleMap[i];
let value = item;
if (i == 0 && item) {
value = enums.THEMETYPE[item] || 1;
}
if (i == 1 && item) {
value = moment(item).format("YYYY-MM-DD HH:mm:ss");
}
if (i == 3 && item) {
value = [];
if (item) {
let oldList = item.split(',');
oldList.forEach(oldStr => {
let valueNum = BranchNameChangeConfig[oldStr.trim()];
if (valueNum) value.push(valueNum);
});
};
}
if (i == 5) {
value = enums.FILETYPE[item] || 1;
}
if (value) addDataInfo[key] = value;
}
addList.push(addDataInfo);
})
// await createActivity(addList);
let rows = await operationalData(OPERATIONALDATATYPE.增加, TABLENAME.组织生活表, addList, {});
console.log(rows);
console.log("---> 组织生活信息 初始化成功");
}
/**
* 支部制度初始化
*/
async function initBranchSystem() {
// let count = await groupFindBranchSystemCount({});
let count = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.支部制度表, {}, []);
if (count >= 1) {
console.log("***** 支部制度数据 无需初始化 *****");
return;
}
let {sheetMap} = getExcel(path.join(__dirname.substring(0, __dirname.indexOf("out")), "res", "牙防所基础数据收集.xlsx"));
let dataList = sheetMap["支部制度"];
let titleMap = {
"0": "systemTitle", //制度标题
"1": "periodOfValidity", //制度有效期
"2": "releaseTime", //发布时间
"3": "systemContent", //制度内容
"4": "branchName", //支部名称
};
let addList = [];
dataList.forEach( (subList, index) => {
if (!index) return; //跳过表头
let addDataInfo:any = {
bsId: index,
systemTile: null,
bId: null,
releaseTime: null,
isNse: null,
fileName: null,
fileType: null,
uploadTime: null
}
for (let i = 0; i <= 4; i++) {
let item =subList[i];
let key = titleMap[i];
let value = item;
if (i == 1 && item) {
value = new Date(item).valueOf();
}
if (i == 2 && item) {
value = new Date(item).valueOf();
}
if (i == 4) {
value = [];
if (item) {
let oldList = item.split(',');
oldList.forEach(oldStr => {
let valueNum = BranchNameChangeConfig[oldStr.trim()];
if (valueNum) value.push(valueNum);
});
};
}
if (value) addDataInfo[key] = value;
}
addList.push(addDataInfo);
})
// await createBranchSystem(addList);
let rows = await operationalData(OPERATIONALDATATYPE.增加, TABLENAME.支部制度表, addList, {});
console.log(rows);
console.log("---> 支部制度信息 初始化成功");
}
/**
* 党费初始化
*/
async function initPartyExpenses() {
// let count = await groupFindBranchSystemCount({});
let count = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党费管理表, {}, []);
if (count >= 1) {
console.log("***** 党费管理数据 无需初始化 *****");
return;
}
let partyMenberDataList = await selectData(OPERATIONALDATATYPE.查询多个 , TABLENAME.党员基础信息表, {etId:1}, null);
let addList = [];
partyMenberDataList.forEach(info => {
let {pmId, bId} = info;
addList.push({
pmId,
bId,
payType: 2,
payTime: null,
payableMonth: "2023-10-01 00:00:00",
payAmount: null,
});
});
// await createBranchSystem(addList);
let rows = await operationalData(OPERATIONALDATATYPE.增加, TABLENAME.党费管理表, addList, {});
console.log(rows);
console.log("---> 党费信息 初始化成功");
}
/**
* 党建质量 三级指标初始化
*/
async function ininThirdLevel() {
let count = await selectData(OPERATIONALDATATYPE.查询数据量, TABLENAME.党建质量三级指标, {}, []);
if (count >= 1) {
console.log("***** 三级指标数据 无需初始化 *****");
return;
}
let {sheetMap} = getExcel(path.join(__dirname.substring(0, __dirname.indexOf("out")), "res", "三级指标初始化表.xlsx"));
let dataList = sheetMap["三级指标"];
let titleMap = {
"0": "bId",
"1": "primaryIndicators",
"2": "secondaryIndicators",
"3": "thirdLevelContent",
"4": "thirdLevelScore",
"5": "currentScore",
"6": "completionProgress",
"7": "weight",
"8": "dataYear",
"9": "lock",
};
let addList = [];
dataList.forEach( (subList, index) => {
if (!index) return; //跳过表头
let addDataInfo:any = {
bId: null,
primaryIndicators: null,
secondaryIndicators: null,
thirdLevelContent: null,
thirdLevelScore: null,
currentScore: 0,
completionProgress: 0,
weight: null,
dataYear: null,
lock: 0
}
for (let i = 0; i <= 9; i++) {
let item =subList[i];
let key = titleMap[i];
let value = item;
if (value) addDataInfo[key] = value;
}
addList.push(addDataInfo);
})
// await createBranchSystem(addList);
let rows = await operationalData(OPERATIONALDATATYPE.增加, TABLENAME.党建质量三级指标, addList, {});
console.log(rows);
console.log("---> 三级指标信息 初始化成功");
}
// /**
// * 党建资讯
// */
// async function initInforMation() {
// let count = await groupFindpartyInformationCount({});
// if (count >= 1) {
// console.log("***** 党建资讯数据 无需初始化 *****");
// return;
// }
// let {sheetMap} = getExcel(path.join(__dirname.substring(0, __dirname.indexOf("out")), "res", "牙防所基础数据收集.xlsx"));
// let dataList = sheetMap["党建资讯"];
// let titleMap = {
// "0": "informationType", //党建资讯类型
// "1": "title", //资讯列表
// "2": "informationTime", //资讯时间
// "3": "detailedInformation", //资讯详细
// "4": "img", //图片
// "5": "branchName", //支部名称
// };
// let addList = [];
// dataList.forEach( (subList, index) => {
// if (!index) return; //跳过表头
// let addDataInfo:any = {
// firstLoginIsChangePwd:false,
// }
// for (let i = 0; i <= 5; i++) {
// let item =subList[i];
// let key = titleMap[i];
// let value = item;
// if (i == 0) {
// value = enums.INFORMATION[item] || 0;
// }
// if (i == 2 && item) {
// value = new Date(item).valueOf();
// }
// if (i == 5) {
// value = [];
// if (item) {
// let oldList = item.split(',');
// oldList.forEach(oldStr => {
// let valueNum = BranchNameChangeConfig[oldStr.trim()];
// if (valueNum) value.push(valueNum);
// });
// };
// }
// if (value) addDataInfo[key] = value;
// }
// addList.push(addDataInfo);
// })
// await createPartyInformation(addList);
// console.log("---> 党建资讯信息 初始化成功");
// }
/**
* 获取单个excel文件数据
* @param filePath
* @returns
*/
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}
}
/**
* 系统中使用的工具
* 包括 任务生成规则
* 包括 key生成规则
* 包括 草稿箱id生成规则
* 包括 密码加密规则
*/
import moment = require("moment");
const md5 = require("md5");
/**
* 生成任务id
* @param uscc 企业标识
* @returns
*/
export function getTaskId(uscc:string) {
return `${uscc}${getTimeKey()}`;
}
/**
* 根据时间生成任务id
* @param uscc 企业标识
* @param timeMs 时间戳
* @returns
*/
export function getTaskIdByTime(uscc:string, timeMs:number) {
return `${uscc}${new Date(timeMs).getFullYear()}${new Date(timeMs).getMonth() + 1 }`;
}
/**
* 获取当前日期的key
* @param timeMs 指定时间,如果不传
* @returns
*/
export function getTimeKey(timeMs?) {
if (timeMs) return parseInt(`${new Date(timeMs).getFullYear()}${new Date(timeMs).getMonth() + 1 }`);
return parseInt(`${new Date().getFullYear()}${new Date().getMonth() + 1 }`);
}
/**
* 获取上一个月日期的key
* @param timeMs 指定时间,如果不传
* @returns
*/
export function getLastMonthTimeKey() {
let time = moment().subtract(1, 'months').valueOf();
return parseInt(`${new Date(time).getFullYear()}${new Date(time).getMonth() + 1 }`);
}
/**
* 获取上一月的日期的key
* @returns
*/
export function getLastTimeKey() {
return moment().subtract(1,'months').format('YYYYM');
}
/**
* 生成草稿箱Id
* @param uscc
* @returns
*/
export function getDraftId(uscc:string) {
return md5(`${uscc}${new Date().valueOf()}${Math.ceil(Math.random()*1000)}`);
}
/**
* 密码加密
* @param uscc 信用代码
* @param pwd 密码
* @returns md5后的密码
*/
export function getPwdMd5(uscc:string, pwd:string) {
return md5(uscc+pwd);
}
/**
* md5加密
* @param pwd
* @returns pwd 加密后密码
*/
export function md5PwdStr(pwd:string) {
return md5(pwd);
}
/**
* 获取token
* @param loginId 统一信用代码
*/
export function getToken(loginId:string) {
return md5(`${loginId}${new Date().valueOf()}${Math.ceil(Math.random() *100)}`);
}
/**
* 校验uscc是否合法
* @param uscc
* @returns true/false
*/
export function eccUscc(uscc:string) {
let isSuccess = false;
if (uscc.search(/^[A-Za-z0-9]{16}$/) > -1) isSuccess = true;
else if (uscc.search(/^[A-Za-z0-9]{18}$/) > -1) isSuccess = true;
return isSuccess;
}
/**
* 获取绑定id
* @param uscc 孵化器统一信用代码
* @param bindUscc 被绑定的孵化器统一信用代码
* @returns
*/
export function getBindId(uscc:string, bindUscc:string) {
return md5(`${uscc}${bindUscc}${Math.ceil(Math.random() *100)}`);
}
/**
* 获取今天开始时刻的时间戳 0时0分
* @returns
*/
export function getTodayMs() {
let t =`${ moment().format("YYYY-MM-DD")} 00:00:00`;
return new Date(t).valueOf();
}
/**
* 获取这个月的开始时刻的时间戳 0时0分
* @returns
*/
export function getThisMonthMs() {
let t =`${ moment().format("YYYY-MM")}-01 00:00:00`;
return new Date(t).valueOf();
}
/**
* 获取code的id
* @param uscc 发送人的uscc
* @param todaySendCount 今日发送次数
* @returns ''
*/
export function getSMSCodeId(uscc:string, todaySendCount:number) {
return md5(`${uscc}${todaySendCount}${new Date().valueOf()}`);
}
/**
* 获取一个随机6位数的验证码
* @returns
*/
export function getSMSCode() {
let code = ``;
for (let i =0; i < 6; i++) {
code += Math.floor(Math.random() * 10)
}
return code;
}
\ No newline at end of file
const xlsx = require('node-xlsx');
const path = require('path');
/**
* onceSheetBecomeOfblockData 将excel文件的指定sheet解析成数据块数据
* @param fileName 文件名称
* @param sheetName 表名称
* @returns [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
export function onceSheetBecomeOfblockData(fileName, sheetName) {
let {sheetMap} = getExcel( path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", fileName ));
return sheetMap;
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
/**
* 异常类
* 需要和log4js共同使用
*/
import { getBizMsg } 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);
}
}
/**
* 日志类
* 包括错误日志 普通日志
* 日志存放在根目录的logs内
*/
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}`);
}
/**
* 解析xml
*/
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 moment = require("moment");
/**
* 匹配新旧对象变化
* 将newObj 与 oldObj 比对,将newObj中发生变化的key返回
* 使用前需要校验对象中的内容
* @param newObj 新对象
* @param oldObj 旧对象
* @returns [key] 发生变化的key
*/
export function checkChange(newObj, oldObj) {
let changeKeyList = [];
for (let newKey in newObj) {
if (`${newObj[newKey]}` != `${oldObj[newKey]}`) changeKeyList.push(newKey);
}
return changeKeyList;
}
/**
* 根据conf截取data中的数据
* @param conf
* @param data
* @param isAdmin 是否是管理后台
* @returns
*/
export function extractData(conf, data, timeFormat?) {
let result = {};
for (let key in conf) {
let confInfo = conf[key];
if (confInfo.changeDate) {
if (timeFormat) result[key] = data[key] ? moment(data[key]).format(timeFormat) : '-';
else result[key] = data[key] || 0;
}else {
result[key] = data[key];
if (typeof result[key] == 'string' && !result[key]) result[key] = '';
}
}
return result;
}
/**
* 请求工具
*/
import * as request from 'request';
import { BizError } from './bizError';
/**
* 请求接口(get)
* @param url 路由
* @param query 请求参数
* @param headers 请求头
* @returns
*/
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, 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) {
if (!error && response.statusCode == 200) {
resolve(body);
}
else {
reject(error)
}
});
})
}
export function postForm(url, body, 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:body
}, function(error, response, res) {
if (!error) {
resolve(res);
}
else {
reject(error)
}
});
})
}
/**
* 校验枚举工具
*
*/
import { ERRORENUM } from "../config/errorEnum";
import { BizError } from "./bizError";
/**
* 校验value是否符合传入的枚举
* @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' || typeof value == 'string' ) {
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
}
let str = "";
value.forEach((item, index) => {
let subStr = enumConf[item];
/**特化处理 */
if(/_dou/.test(subStr)) subStr = subStr.replace(/_dou/, ",");
if(/_zyh/.test(subStr)) subStr = subStr.replace(/_zyh/, "“");
if(/_yyh/.test(subStr)) subStr = subStr.replace(/_yyh/, "”");
if(/_dun/.test(subStr)) subStr = subStr.replace(/_dun/, "、");
if(/_ju/.test(subStr)) subStr = subStr.replace(/_ju/, "。");
str += subStr;
if (index == value.length-1) str+="";
else str += ","
});
return str;
}
/**
* 校验参数工具
*
*/
import { ERRORENUM } from "../config/errorEnum";
import { BizError } from "./bizError";
/**
* 通过config校验表单参数param
* 包括类型 String, Number, Boolean, [Number], [Object]
* 参数是必填
* 方法会校验表单中存在的多余字段
* todo 后续优化配置
* @param name 被调用的方法名
* @param config 校验配置
* @param param 需要校验的参数
* @returns true 无需关注返回
*/
/**
* 通过config校验表单参数param
* 包括类型 String, Number, Boolean, [Number], [Object]
* 参数是必填
* 方法会校验表单中存在的多余字段
* todo 后续优化配置
* @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.参数错误, `多余${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.参数错误, `缺失${key}字段`);
} else {
switch(type) {
case 'Number':
if ( type.toLowerCase() != valueType ) {
isError = true;
} else {
if ((""+param[key]).indexOf('.') > -1) {
param[key] = parseInt(`${param[key] *100}`)/100;
}
}
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 '[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}应该是${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 '[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;
}
{
"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