This commit is contained in:
cjb 2025-05-04 10:59:16 +08:00
parent 57f316dcac
commit 035cc138eb
22 changed files with 1178 additions and 106 deletions

View File

@ -10,3 +10,6 @@ VITE_APP_BASE_API = 'http://192.168.5.213:9100/gateway'
#VITE_APP_BASE_API = 'http://192.168.7.152:9100/gateway'
#VITE_APP_BASE_API = '/dev-api'
#VITE_APP_BASE_API = 'https://api.evo-techina.com'

View File

@ -46,12 +46,14 @@
"screenfull": "^6.0.2",
"splitpanes": "^3.1.5",
"tiny-svg": "^4.0.0",
"video.js": "^8.22.0",
"vue": "~3.3.4",
"vue-cropper": "^1.1.1",
"vue-demi": "^0.14.7",
"vue-jsonp": "^2.0.0",
"vue-qqmap": "^1.1.1",
"vue-router": "^4.2.4",
"vue-video-player": "^6.0.0",
"zeebe-bpmn-moddle": "^1.1.0"
},
"devDependencies": {

View File

@ -107,6 +107,9 @@ importers:
tiny-svg:
specifier: ^4.0.0
version: 4.1.2
video.js:
specifier: ^8.22.0
version: 8.22.0
vue:
specifier: ~3.3.4
version: 3.3.13(typescript@5.0.4)
@ -125,6 +128,9 @@ importers:
vue-router:
specifier: ^4.2.4
version: 4.4.5(vue@3.3.13(typescript@5.0.4))
vue-video-player:
specifier: ^6.0.0
version: 6.0.0(@types/video.js@7.3.58)(video.js@8.22.0)(vue@3.3.13(typescript@5.0.4))
zeebe-bpmn-moddle:
specifier: ^1.1.0
version: 1.6.0
@ -216,7 +222,7 @@ packages:
engines: {node: '>=6.9.0'}
'@babel/runtime@7.25.6':
resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==}
resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==, tarball: https://registry.npmmirror.com/@babel/runtime/-/runtime-7.25.6.tgz}
engines: {node: '>=6.9.0'}
'@babel/types@7.25.6':
@ -593,6 +599,9 @@ packages:
'@types/tough-cookie@4.0.5':
resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
'@types/video.js@7.3.58':
resolution: {integrity: sha512-1CQjuSrgbv1/dhmcfQ83eVyYbvGyqhTvb2Opxr0QCV+iJ4J6/J+XWQ3Om59WiwCd1MN3rDUHasx5XRrpUtewYQ==, tarball: https://registry.npmmirror.com/@types/video.js/-/video.js-7.3.58.tgz}
'@types/web-bluetooth@0.0.16':
resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
@ -677,6 +686,26 @@ packages:
peerDependencies:
'@uppy/core': ^2.3.3
'@videojs-player/vue@1.0.0':
resolution: {integrity: sha512-WonTezRfKu3fYdQLt/ta+nuKH6gMZUv8l40Jke/j4Lae7IqeO/+lLAmBnh3ni88bwR+vkFXIlZ2Ci7VKInIYJg==, tarball: https://registry.npmmirror.com/@videojs-player/vue/-/vue-1.0.0.tgz}
peerDependencies:
'@types/video.js': 7.x
video.js: 7.x
vue: 3.x
'@videojs/http-streaming@3.17.0':
resolution: {integrity: sha512-Ch1P3tvvIEezeZXyK11UfWgp4cWKX4vIhZ30baN/lRinqdbakZ5hiAI3pGjRy3d+q/Epyc8Csz5xMdKNNGYpcw==, tarball: https://registry.npmmirror.com/@videojs/http-streaming/-/http-streaming-3.17.0.tgz}
engines: {node: '>=8', npm: '>=5'}
peerDependencies:
video.js: ^8.19.0
'@videojs/vhs-utils@4.1.1':
resolution: {integrity: sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA==, tarball: https://registry.npmmirror.com/@videojs/vhs-utils/-/vhs-utils-4.1.1.tgz}
engines: {node: '>=8', npm: '>=5'}
'@videojs/xhr@2.7.0':
resolution: {integrity: sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==, tarball: https://registry.npmmirror.com/@videojs/xhr/-/xhr-2.7.0.tgz}
'@vitejs/plugin-vue@3.2.0':
resolution: {integrity: sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==}
engines: {node: ^14.18.0 || >=16.0.0}
@ -932,6 +961,10 @@ packages:
slate: ^0.72.0
snabbdom: ^3.1.0
'@xmldom/xmldom@0.8.10':
resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==, tarball: https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz}
engines: {node: '>=10.0.0'}
abab@2.0.6:
resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
deprecated: Use your platform's native atob() and btoa() methods instead
@ -953,6 +986,9 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
aes-decrypter@4.0.2:
resolution: {integrity: sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==, tarball: https://registry.npmmirror.com/aes-decrypter/-/aes-decrypter-4.0.2.tgz}
agent-base@6.0.2:
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
engines: {node: '>= 6.0.0'}
@ -1398,6 +1434,9 @@ packages:
dom-serializer@1.4.1:
resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
dom-walk@0.1.2:
resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==, tarball: https://registry.npmmirror.com/dom-walk/-/dom-walk-0.1.2.tgz}
dom7@3.0.0:
resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==}
@ -1899,6 +1938,9 @@ packages:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
deprecated: Glob versions prior to v9 are no longer supported
global@4.4.0:
resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==, tarball: https://registry.npmmirror.com/global/-/global-4.4.0.tgz}
globals@13.24.0:
resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
engines: {node: '>=8'}
@ -2125,6 +2167,9 @@ packages:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
is-function@1.0.2:
resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==, tarball: https://registry.npmmirror.com/is-function/-/is-function-1.0.2.tgz}
is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
@ -2356,6 +2401,9 @@ packages:
resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==}
engines: {node: '>=12'}
m3u8-parser@7.2.0:
resolution: {integrity: sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ==, tarball: https://registry.npmmirror.com/m3u8-parser/-/m3u8-parser-7.2.0.tgz}
magic-string@0.30.11:
resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
@ -2420,6 +2468,9 @@ packages:
min-dash@4.2.1:
resolution: {integrity: sha512-to+unsToePnm7cUeR9TrMzFlETHd/UXmU+ELTRfWZj5XGT41KF6X3L233o3E/GdEs3sk2Tbw/lOLD1avmWkg8A==}
min-document@2.19.0:
resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==, tarball: https://registry.npmmirror.com/min-document/-/min-document-2.19.0.tgz}
min-dom@4.2.1:
resolution: {integrity: sha512-TMoL8SEEIhUWYgkj7XMSgxmwSyGI+4fP2KFFGnN3FbHfbGHVdsLYSz8LoIsgPhz4dWRmLvxWWSMgzZMJW5sZuA==}
@ -2442,12 +2493,21 @@ packages:
moddle@6.2.3:
resolution: {integrity: sha512-bLVN+ZHL3aKnhxc19XtjUfvdJsS3EsiEJC7bT6YPD11qYmTzvsxrGgyYz1Ouof7TZuGw0lDJ1OLmEnxcpQWk3Q==}
mpd-parser@1.3.1:
resolution: {integrity: sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==, tarball: https://registry.npmmirror.com/mpd-parser/-/mpd-parser-1.3.1.tgz}
hasBin: true
ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
mux.js@7.1.0:
resolution: {integrity: sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA==, tarball: https://registry.npmmirror.com/mux.js/-/mux.js-7.1.0.tgz}
engines: {node: '>=8', npm: '>=5'}
hasBin: true
namespace-emitter@2.0.1:
resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==}
@ -2638,6 +2698,10 @@ packages:
typescript:
optional: true
pkcs7@1.0.4:
resolution: {integrity: sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==, tarball: https://registry.npmmirror.com/pkcs7/-/pkcs7-1.0.4.tgz}
hasBin: true
posix-character-classes@0.1.1:
resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==}
engines: {node: '>=0.10.0'}
@ -2700,6 +2764,10 @@ packages:
resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
engines: {node: '>=6'}
process@0.11.10:
resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, tarball: https://registry.npmmirror.com/process/-/process-0.11.10.tgz}
engines: {node: '>= 0.6.0'}
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
@ -2749,7 +2817,7 @@ packages:
engines: {node: '>= 6'}
regenerator-runtime@0.14.1:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, tarball: https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz}
regex-not@1.0.2:
resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
@ -3201,6 +3269,21 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
video.js@8.22.0:
resolution: {integrity: sha512-xge2kpjsvC0zgFJ1cqt+wTqsi21+huFswlonPFh7qiplypsb4FN/D2Rz6bWdG/S9eQaPHfWHsarmJL/7D3DHoA==, tarball: https://registry.npmmirror.com/video.js/-/video.js-8.22.0.tgz}
videojs-contrib-quality-levels@4.1.0:
resolution: {integrity: sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==, tarball: https://registry.npmmirror.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.1.0.tgz}
engines: {node: '>=16', npm: '>=8'}
peerDependencies:
video.js: ^8
videojs-font@4.2.0:
resolution: {integrity: sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ==, tarball: https://registry.npmmirror.com/videojs-font/-/videojs-font-4.2.0.tgz}
videojs-vtt.js@0.15.5:
resolution: {integrity: sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==, tarball: https://registry.npmmirror.com/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz}
vite-plugin-svg-icons@2.0.1:
resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==}
peerDependencies:
@ -3318,6 +3401,13 @@ packages:
peerDependencies:
typescript: '*'
vue-video-player@6.0.0:
resolution: {integrity: sha512-WP47OtefsjMEReRCIKIL3tRRgH/PyNm8ELjsbYgr/WWrYAj5Ih9Adzkzp+ylYOI/v57jJ4O7O4XkbXBCmsTqNw==, tarball: https://registry.npmmirror.com/vue-video-player/-/vue-video-player-6.0.0.tgz}
peerDependencies:
'@types/video.js': 7.x
video.js: 7.x
vue: 3.x
vue@2.7.16:
resolution: {integrity: sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==}
deprecated: Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.
@ -3796,6 +3886,8 @@ snapshots:
'@types/tough-cookie@4.0.5': {}
'@types/video.js@7.3.58': {}
'@types/web-bluetooth@0.0.16': {}
'@types/web-bluetooth@0.0.20': {}
@ -3915,6 +4007,34 @@ snapshots:
'@uppy/utils': 4.1.3
nanoid: 3.3.7
'@videojs-player/vue@1.0.0(@types/video.js@7.3.58)(video.js@8.22.0)(vue@3.3.13(typescript@5.0.4))':
dependencies:
'@types/video.js': 7.3.58
video.js: 8.22.0
vue: 3.3.13(typescript@5.0.4)
'@videojs/http-streaming@3.17.0(video.js@8.22.0)':
dependencies:
'@babel/runtime': 7.25.6
'@videojs/vhs-utils': 4.1.1
aes-decrypter: 4.0.2
global: 4.4.0
m3u8-parser: 7.2.0
mpd-parser: 1.3.1
mux.js: 7.1.0
video.js: 8.22.0
'@videojs/vhs-utils@4.1.1':
dependencies:
'@babel/runtime': 7.25.6
global: 4.4.0
'@videojs/xhr@2.7.0':
dependencies:
'@babel/runtime': 7.25.6
global: 4.4.0
is-function: 1.0.2
'@vitejs/plugin-vue@3.2.0(vite@4.5.5(@types/node@16.18.108)(less@4.2.0))(vue@3.3.13(typescript@5.0.4))':
dependencies:
vite: 4.5.5(@types/node@16.18.108)(less@4.2.0)
@ -4265,6 +4385,8 @@ snapshots:
slate: 0.72.8
snabbdom: 3.6.2
'@xmldom/xmldom@0.8.10': {}
abab@2.0.6: {}
acorn-globals@7.0.1:
@ -4282,6 +4404,13 @@ snapshots:
acorn@8.12.1: {}
aes-decrypter@4.0.2:
dependencies:
'@babel/runtime': 7.25.6
'@videojs/vhs-utils': 4.1.1
global: 4.4.0
pkcs7: 1.0.4
agent-base@6.0.2:
dependencies:
debug: 4.3.7
@ -4786,6 +4915,8 @@ snapshots:
domhandler: 4.3.1
entities: 2.2.0
dom-walk@0.1.2: {}
dom7@3.0.0:
dependencies:
ssr-window: 3.0.0
@ -5418,6 +5549,11 @@ snapshots:
once: 1.4.0
path-is-absolute: 1.0.1
global@4.4.0:
dependencies:
min-document: 2.19.0
process: 0.11.10
globals@13.24.0:
dependencies:
type-fest: 0.20.2
@ -5640,6 +5776,8 @@ snapshots:
is-extglob@2.1.1: {}
is-function@1.0.2: {}
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
@ -5876,6 +6014,12 @@ snapshots:
luxon@3.5.0: {}
m3u8-parser@7.2.0:
dependencies:
'@babel/runtime': 7.25.6
'@videojs/vhs-utils': 4.1.1
global: 4.4.0
magic-string@0.30.11:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
@ -5944,6 +6088,10 @@ snapshots:
min-dash@4.2.1: {}
min-document@2.19.0:
dependencies:
dom-walk: 0.1.2
min-dom@4.2.1:
dependencies:
component-event: 0.2.1
@ -5976,10 +6124,22 @@ snapshots:
dependencies:
min-dash: 4.2.1
mpd-parser@1.3.1:
dependencies:
'@babel/runtime': 7.25.6
'@videojs/vhs-utils': 4.1.1
'@xmldom/xmldom': 0.8.10
global: 4.4.0
ms@2.0.0: {}
ms@2.1.3: {}
mux.js@7.1.0:
dependencies:
'@babel/runtime': 7.25.6
global: 4.4.0
namespace-emitter@2.0.1: {}
nanoid@3.3.7: {}
@ -6158,6 +6318,10 @@ snapshots:
optionalDependencies:
typescript: 5.0.4
pkcs7@1.0.4:
dependencies:
'@babel/runtime': 7.25.6
posix-character-classes@0.1.1: {}
possible-typed-array-names@1.0.0: {}
@ -6219,6 +6383,8 @@ snapshots:
prismjs@1.29.0: {}
process@0.11.10: {}
proxy-from-env@1.1.0: {}
prr@1.0.1:
@ -6753,6 +6919,32 @@ snapshots:
vary@1.1.2: {}
video.js@8.22.0:
dependencies:
'@babel/runtime': 7.25.6
'@videojs/http-streaming': 3.17.0(video.js@8.22.0)
'@videojs/vhs-utils': 4.1.1
'@videojs/xhr': 2.7.0
aes-decrypter: 4.0.2
global: 4.4.0
m3u8-parser: 7.2.0
mpd-parser: 1.3.1
mux.js: 7.1.0
videojs-contrib-quality-levels: 4.1.0(video.js@8.22.0)
videojs-font: 4.2.0
videojs-vtt.js: 0.15.5
videojs-contrib-quality-levels@4.1.0(video.js@8.22.0):
dependencies:
global: 4.4.0
video.js: 8.22.0
videojs-font@4.2.0: {}
videojs-vtt.js@0.15.5:
dependencies:
global: 4.4.0
vite-plugin-svg-icons@2.0.1(vite@4.5.5(@types/node@16.18.108)(less@4.2.0)):
dependencies:
'@types/svgo': 2.6.4
@ -6852,6 +7044,13 @@ snapshots:
'@volar/vue-typescript': 0.38.9
typescript: 5.0.4
vue-video-player@6.0.0(@types/video.js@7.3.58)(video.js@8.22.0)(vue@3.3.13(typescript@5.0.4)):
dependencies:
'@types/video.js': 7.3.58
'@videojs-player/vue': 1.0.0(@types/video.js@7.3.58)(video.js@8.22.0)(vue@3.3.13(typescript@5.0.4))
video.js: 8.22.0
vue: 3.3.13(typescript@5.0.4)
vue@2.7.16:
dependencies:
'@vue/compiler-sfc': 2.7.16

View File

@ -91,5 +91,5 @@ export function checktoken() {
return server.requestT({
url: "/oauth2/login/checktoken",
method: "post"
});
},false);
}

View File

@ -49,3 +49,25 @@ export function update(data:Addobj) {
data
})
}
//审核
export function examine(data:any) {
return server.request({
url: '/cloud/wechat/user/alterState',
method: 'post',
data
})
}
//解绑公司
export function unbind(wuid:string,pcode:string) {
return server.request({
url: '/cloud/wechat/user/companyunbind',
method: 'post',
data:{
wuid,
pcode
}
})
}

View File

@ -59,4 +59,13 @@ export function delhdz(id:string) {
id
}
})
}
}
//分账
export function getyysfz(params:any) {
return server.request({
url: '/cloud/independent/account/list',
method: 'get',
params
})
}

View File

@ -0,0 +1,22 @@
import server from '@/utils/request'
//获取设备
export function getdevice() {
return server.request({
url: '/cloud/dh/device/list',
method: 'get'
},false)
}
//获取直播地址
export function getlive(deviceId:string,channelId:string) {
return server.request({
url: '/cloud/dh/device/live',
method: 'post',
data:{
deviceId,
channelId
}
},false)
}

View File

@ -11,7 +11,7 @@ interface Query{
status?:String //状态1-启用0-禁用
}
export function getlist(params:Query) {
export function getyyslist(params:Query) {
return server.request({
url: '/resource/proxyoperater/list',
method: 'get',

View File

@ -40,7 +40,7 @@ export function delrole(rid:String) {
}
//查询
export function getlist(userId:String) {
export function getjslist(userId:String) {
return server.request({
url: '/resource/role/list',
method: 'get',

View File

@ -86,4 +86,17 @@ export function adduserrole(data:Addrole) {
method: 'post',
data
})
}
//运营商用户分配换电站
interface Fpsta{
uid:String,
stationIds:String
}
export function dispstation(data:Fpsta) {
return server.request({
url: '/resource/user/adduserstation',
method: 'post',
data
})
}

View File

@ -16,10 +16,15 @@ import myIcons from "@/components/SvgIcon/myIcon";
// import formCreate from "@form-create/element-ui";
// import fcDesigner from "@form-create/designer";
import VueVideoPlayer from 'vue-video-player'
// 引入video.js样式
import 'video.js/dist/video-js.css'
const app = createApp(App);
app.use(createPinia());
app.use(router);
app.use(VueVideoPlayer)
// element plus Icons
for (const [name, comp] of Object.entries(ElementPlusIconsVue)) {
app.component(name, comp);

View File

@ -59,7 +59,8 @@ const store = defineStore({
avatar,
roles:data.roleList,
name:data.uname,
nickName:data.nickName
nickName:data.nickName,
type:data.type
})
localStorage.setItem('Infor',infor)

View File

@ -95,8 +95,8 @@
</el-table-column>
<el-table-column label="订单类型" min-width="80" align="center" prop="sourceFrom" :show-overflow-tooltip="true">
<template #default="scope">
<div v-if="scope.row.status == 1">换电</div>
<div v-else-if="scope.row.status == 2">充电</div>
<div v-if="scope.row.orderType == 1">换电</div>
<div v-else-if="scope.row.orderType == 2">充电</div>
</template>
</el-table-column>
<el-table-column label="车牌号" min-width="120" align="center" prop="plateNum" :show-overflow-tooltip="true" />

View File

@ -691,7 +691,7 @@
getqrcode
} from '@/api/swapstation/hdz'
import {
getlist
getyyslist
} from '@/api/systemSet/operator'
import {
getArea
@ -739,8 +739,8 @@
//
let yunList = ref<any>([])
getlist({
pageSize:20,
getyyslist({
pageSize:200,
pageNo:1
}).then(rps => {
if(rps.data){

View File

@ -0,0 +1,110 @@
<template>
<el-row>
<el-col :span="4" style="position: relative;height:calc(100vh - 170px);border: 4px solid #fff;background: #fff;">
<!--@check="treecheck"-->
<!--show-checkbox-->
<div style="position: absolute;width: 100%;top:0;left: 0;height:calc(100vh - 170px);overflow-y: scroll;">
<el-tree
v-if="menuTree.length>0"
ref="menutree"
style="width: 100%;"
:data="menuTree"
default-expand-all
@node-click="treeNode"
node-key="pkId"
highlight-current
:props="{
children: 'childList',
label: 'name'
}"
/>
<div v-else style="display: flex;align-items: center;justify-content: center;width: 100%;height:calc(100vh - 140px);color: #ccc;">数据加载中...</div>
</div>
</el-col>
<el-col :span="20">
<div v-if="init" style="display: flex;align-items: center;justify-content: center;width: 100%;height:calc(100vh - 140px);font-size: 28px;color: #ccc;">请点击设备查看监控</div>
<video-player
v-else
:key="datestr"
ref="videoPlayer"
:playsinline="false"
:options="playerOptions"
/>
<!-- <div v-else>视频加载中...</div> -->
</el-col>
</el-row>
</template>
<script lang="ts" setup>
import {
getdevice,
getlive
} from '@/api/swapstation/video'
import {
getRouters
} from '@/api/menu'
import { ref,reactive } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
//
let menuTree = ref<any>([])
let livesrc = ref('')
// getRouters().then(rps => {
// menuTree.value = rps.data
// })
getdevice().then((rps:any) => {
menuTree.value = rps.data.data
})
let showVideo = ref(false)
let init = ref(true)
let datestr = ref<any>('')
function treeNode(v:any) {
if(!v.childList || v.childList.length == 0){
init.value = false
showVideo.value = false
getlive(v.deviceId,v.channelId).then((rps:any) => {
datestr.value = new Date().getTime()
playerOptions.sources.splice(0)
playerOptions.sources.push({
type:'application/x-mpegURL',
src:rps.data.data
})
showVideo.value = true
console.log(rps.data.data)
})
}
}
function treecheck() {}
let playerOptions =reactive({
autoplay: true,
controls: true,
liveui: true,
language: 'zh-CN', //
aspectRatio: '16:9', //
fluid: true, //
sources: [{
type: 'application/x-mpegURL',
src: ''
}],
techOrder: ['html5'],
html5: {
hls: {
withCredentials: false,
lowLatencyMode: true,
liveSyncDuration: 3
}
}
//poster: '/path/to/poster.jpg'
})
</script>

View File

@ -221,7 +221,7 @@
</template>
<script setup lang="ts" name="UserPage">
import {
getlist,
getyyslist,
addyunys,
updateyys,
delyys
@ -260,7 +260,7 @@
function getyys() {
yysList.value.splice(0)
getlist(queryParams).then(rps => {
getyyslist(queryParams).then(rps => {
if(rps.data){
total.value = (rps.data as any).total
let list = (rps.data as any).records

View File

@ -164,7 +164,7 @@
<script lang="ts" setup>
import {
getlist,
getjslist,
addrole,
updaterole,
delrole,
@ -186,7 +186,7 @@
let dictlist = ref<any>([])
function querytype() {
dictlist.value.splice(0)
getlist('').then(rps => {
getjslist('').then(rps => {
dictlist.value = rps.data
})
}

View File

@ -0,0 +1,197 @@
<template>
<el-dialog
v-model="showpop"
title="分配换电站"
width="800px"
append-to-body
:close-on-click-modal="false"
@close="cancel"
>
<el-table
ref="tableRef"
style="margin-top: 20px;"
:data="hdzList"
border
stripe
max-height="800px"
@select="selectClick"
@selection-change="selChange"
>
<!--:selectable="selectable"-->
<el-table-column type="selection" width="55" />
<el-table-column label="站点名称" min-width="200" align="center" prop="name" :show-overflow-tooltip="true" />
<el-table-column label="站点编码" min-width="300" align="center" prop="code" :show-overflow-tooltip="true" />
<!-- <el-table-column label="运营商" min-width="200" align="center" prop="proxyId" :show-overflow-tooltip="true" /> -->
<el-table-column label="状态" min-width="100" align="center" prop="status" :show-overflow-tooltip="true">
<template #default="scope">
<div v-if="scope.row.status == 1">正常营业</div>
<div v-else-if="scope.row.status == 2">正常停运</div>
<div v-else-if="scope.row.status == 3">故障停运</div>
<div v-else-if="scope.row.status == 4">指令停运</div>
<div v-else-if="scope.row.status == 9">其它</div>
</template>
</el-table-column>
<!-- <el-table-column label="地址" min-width="400" align="center" prop="address" :show-overflow-tooltip="true" />
<el-table-column label="注册日期" min-width="120" align="center" prop="registerDate" :show-overflow-tooltip="true" />
<el-table-column label="联系人" min-width="200" align="center" prop="contacts" :show-overflow-tooltip="true" />
<el-table-column label="联系电话" min-width="140" align="center" prop="phone" />
<el-table-column label="激活日期" min-width="160" align="center" prop="activeDate" :show-overflow-tooltip="true" />
<el-table-column label="营业时间" min-width="120" align="center" prop="openAllDay" :show-overflow-tooltip="true">
<template #default="scope">
<div v-if="scope.row.openAllDay == 1">全天</div>
<div v-else>{{scope.row.runStartTime}} {{scope.row.runEndTime}}</div>
</template>
</el-table-column>
<el-table-column label="通道数" min-width="100" align="center" prop="tdQuantity" />
<el-table-column label="机器人数量" min-width="100" align="center" prop="jqrQuantity" />
<el-table-column label="充电机数量" min-width="160" align="center" prop="cdjQuantity" :show-overflow-tooltip="true" />
<el-table-column label="电池仓数量" min-width="100" align="center" prop="dccQuantity" :show-overflow-tooltip="true" />
<el-table-column label="电池数量" min-width="100" align="center" prop="dcQuantity" /> -->
</el-table>
<div v-if="total > 10" style="display: flex;justify-content: right;padding-top: 20px;">
<el-pagination
v-model:current-page="queryParams.pageNo"
v-model:page-size="queryParams.pageSize"
:page-sizes="[10, 20, 30, 40]"
background
size="small"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="handleSizeChange"
@current-change="fphdz"
/>
</div>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="fphdzhand"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ref,reactive,watch,nextTick } from 'vue'
import {
gethdzlist
} from '@/api/swapstation/hdz'
import {
dispstation
} from '@/api/systemSet/user'
import { ElMessage} from 'element-plus'
const props = withDefaults(defineProps<{
show?:boolean,
uid?:string,
code?:string
}>(), {
show:false,
uid:'',
code:''
})
const emit = defineEmits<{
cancel: [v?:boolean]
}>()
let showpop = ref(props.show)
watch(() => props.show,(v) => {
showpop.value = v
})
//
let fphdzpop = ref(false)
let hdzList = ref([])
let total = ref(0)
//let selectable = (row:any) => ![1].includes(row.pkId)
let queryParams = reactive({
pageSize:20, //
pageNo:1, //
proxyId:'', //ID
name:'', //
code:'', //
status:1, //1-2-3-4-9-
type:'', //ID
})
const tableRef = ref()
function fphdz() {
hdzList.value.splice(0)
gethdzlist(queryParams).then(rps => {
if(rps.data){
total.value = (rps.data as any).total
let list = (rps.data as any).records
hdzList.value = list?list:[]
// ID
if(props.code){
nextTick(() => {
let hdzcode = props.code.split(',')
hdzcode.forEach(n => {
const rows = hdzList.value.find((item:any) => item.code == n)
if (rows) {
tableRef.value?.toggleRowSelection(rows, true)
}
})
})
}
}
})
}
function handleSizeChange(val:number) {
queryParams.pageSize = val
fphdz()
}
function selectClick() {}
function cancel() {
showpop.value = false
emit('cancel',showpop.value)
}
let xzarr = ref<any>([])
function selChange(v:any) {
xzarr.value = v
}
function fphdzhand() {
if(xzarr.value.length > 0){
dispstation({
uid:props.uid,
stationIds:xzarr.value.map((n:any)=>n.pkId).join(',')
}).then(() => {
ElMessage({
type: 'success',
message: '分配成功'
})
setTimeout(() => {
cancel()
},2000)
})
}else{
ElMessage({
type: 'warning',
message: '请选择换电站'
})
}
}
fphdz()
</script>
<style>
</style>

View File

@ -52,8 +52,14 @@
:data="userList"
border
stripe
highlight-current-row
>
<el-table-column label="账号" align="center" prop="uname" :show-overflow-tooltip="true" />
<el-table-column label="账号" align="center" prop="uname" :show-overflow-tooltip="true">
<template #default="scope">
<div v-if="scope.row.readonly != 1" @click="showpop(2,scope.row)" style="display: inline-block;color:#16599d;border-bottom: 1px solid #417ebb;cursor:pointer">{{scope.row.uname}}</div>
<div v-else>{{scope.row.uname}}</div>
</template>
</el-table-column>
<el-table-column label="账号类型" align="center" prop="type">
<template #default="scope">
<div v-if="scope.row.type == 1">开发者</div>
@ -61,10 +67,13 @@
<div v-else="scope.row.type == 3">企业用户</div>
</template>
</el-table-column>
<el-table-column label="所属运营商或企业用户" align="center" width="240" prop="businessName" :show-overflow-tooltip="true" />
<el-table-column label="关联方代码" align="center" width="140" prop="typeRelateCode" :show-overflow-tooltip="true" />
<el-table-column label="姓名" align="center" prop="name" :show-overflow-tooltip="true" />
<el-table-column label="手机号" align="center" width="120" prop="phone" :show-overflow-tooltip="true" />
<el-table-column label="邮箱" align="center" width="200" prop="email" :show-overflow-tooltip="true" />
<!-- <el-table-column label="所属企业用户" align="center" width="200" prop="typeRelateCode" :show-overflow-tooltip="true" /> -->
<!-- <el-table-column label="性别" align="center" prop="sex">
<template #default="scope">
<div v-if="scope.row.sex == 1"></div>
@ -83,10 +92,11 @@
<span>{{ dayjs(scope.row.createTime).format("YYYY-MM-DD HH:mm:ss") }}</span>
</template>
</el-table-column> -->
<el-table-column label="操作" align="center" width="260">
<el-table-column label="操作" align="left" width="260">
<template #default="scope">
<el-button link v-if="scope.row.readonly != 1" type="primary" icon="Edit" @click="showpop(2,scope.row)">修改</el-button>
<!-- <el-button link v-if="scope.row.readonly != 1" type="primary" icon="Edit" @click="showpop(2,scope.row)">修改</el-button> -->
<el-button link v-if="scope.row.readonly != 1" type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)">分配角色</el-button>
<el-button link v-if="scope.row.readonly != 1 && scope.row.type == 2" type="primary" icon="Monitor" @click="feiphdz(scope.row)">分配站</el-button>
<el-button link v-if="scope.row.readonly != 1" type="danger" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
@ -111,25 +121,22 @@
<el-dialog
v-model="openpop"
:title="usertit"
width="800px"
width="500px"
append-to-body
:close-on-click-modal="false"
>
<el-form ref="userRef" :model="userform" :rules="rules" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="账号" prop="uname">
<el-input v-model="userform.uname" placeholder="请输入账号" maxlength="20" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="账号类型" prop="type">
<el-col :span="24">
<el-form-item v-if="userType == 1" label="账号类型" prop="type">
<el-radio-group v-model="userform.type">
<el-radio value="1">开发者</el-radio>
<el-radio value="2">运营商</el-radio>
<el-radio value="3">企业用户</el-radio>
</el-radio-group>
</el-form-item>
<!-- <el-form-item label="" prop="status">
<el-select v-model="userform.type" placeholder="请选择运营商" style="width: 160px;">
<el-option value="1" label="正常营业" />
@ -140,7 +147,30 @@
</el-select>
</el-form-item> -->
</el-col>
<el-col :span="12">
<el-col v-if="userform.type == '2'" :span="24">
<el-form-item label="运营商" prop="businessCode">
<el-select v-model="userform.businessCode" placeholder="请选择运营商">
<el-option v-for="n in yunList" :label="n.poname" :value="n.pocode" />
</el-select>
</el-form-item>
</el-col>
<el-col v-if="userform.type == '3'" :span="24">
<el-form-item label="企业用户" prop="businessCode1">
<el-select v-model="userform.businessCode1" placeholder="请选择企业用户">
<el-option v-for="n in qyuserList" :label="n.cname" :value="n.ccode" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="账号" prop="uname">
<el-input v-model="userform.uname" placeholder="请输入账号" maxlength="20" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="用户密码" prop="password">
<el-input
v-model="userform.password"
@ -151,7 +181,7 @@
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="24">
<el-form-item label="状态" prop="status">
<el-radio-group v-model="userform.status">
<el-radio value="1">启用</el-radio>
@ -159,18 +189,18 @@
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="24">
<el-form-item label="关联方代码" prop="typeRelateCode">
<el-input v-model="userform.typeRelateCode" placeholder="请输入关联方代码" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="24">
<el-form-item label="姓名" prop="name">
<el-input v-model="userform.name" placeholder="请输入姓名" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="24">
<el-form-item label="邮箱" prop="email">
<el-input v-model="userform.email" placeholder="请输入邮箱" maxlength="50" />
</el-form-item>
@ -183,7 +213,7 @@
</el-radio-group>
</el-form-item>
</el-col> -->
<el-col :span="12">
<el-col :span="24">
<el-form-item label="内置账号" prop="readonly">
<el-radio-group v-model="userform.readonly">
<el-radio value="1"></el-radio>
@ -229,12 +259,13 @@
plain
@click="fenpeirole">分配角色</el-button>
<el-table
ref="multipleTableRef"
ref="taskTableRef"
style="margin-top: 20px;"
:data="rolelist"
border
stripe
@selection-change="handleSelectionChange"
@select="selectClick"
:header-cell-class-name="cellClass"
>
<el-table-column type="selection" width="55" />
<el-table-column label="角色名称" align="center" prop="name" />
@ -248,9 +279,20 @@
</el-table-column>
</el-table>
</el-drawer>
<!--分配换电站-->
<fphdz
v-if="hdzpop"
:show="hdzpop"
:uid="uid"
:code="hdzcode"
@update="handhdx"
@cancel="hdzpop = false"
/>
</div>
</template>
<script setup lang="ts" name="UserPage">
<script setup lang="ts">
import {
getuser,
adduser,
@ -258,10 +300,65 @@
deleteuser,
adduserrole
} from '@/api/systemSet/user'
import { getlist } from '@/api/systemSet/role'
import { ref,reactive } from 'vue'
import { getjslist } from '@/api/systemSet/role'
import {
getyyslist
} from '@/api/systemSet/operator'
import {
getlist
} from '@/api/operation/company'
import Fphdz from './fphdz.vue'
import { ref,reactive,nextTick } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
//
let Info:any = localStorage.getItem('Infor')
let userType = ref<any>('')
let roles = ''
if(Info){
Info = JSON.parse(Info)
userType.value = (Info as any).type
if((Info as any).roles && (Info as any).roles.length > 0){
roles = (Info as any).roles[0].rcode
}
}
let yunList = ref<any>([])
let qyuserList = ref<any>([])
if(userType.value == 1){
//
getyyslist({
pageSize:200,
pageNo:1
}).then(rps => {
if(rps.data){
let list = (rps.data as any).records
yunList.value = list?list:[]
}
})
//
getlist({
pageSize:200,
pageNo:1
}).then(rps => {
if(rps.data){
let list = (rps.data as any).records
qyuserList.value = list?list:[]
}
})
}
//
let queryParams = reactive({
uid:'',
@ -274,7 +371,6 @@
})
let total = ref(0)
let userList = ref([])
//
function handBtnqu() {
queryParams.pageNo = 1
@ -310,20 +406,22 @@
let openpop = ref(false)
let userRef = ref()
let usertit = ref('添加用户')
let userform = reactive({
let userform = reactive<any>({
pkId:'',
uname:'', //
type:'', //1-2-3-
password:'', //
status:'', //1-0-
status:'1', //1-0-
uid:'', //ID
typeRelateCode:'', //
name:'', //
email:'', //
phone:'', //
//sex:'', //
readonly:'', //
avatar:'' //
readonly:'2', //
avatar:'', //
businessCode:'', //code code
businessCode1:'' //code code
})
const rules = ref({
@ -348,6 +446,12 @@
trigger: "blur",
},
],
businessCode:[
{ required: true, message: "请选择运营商", trigger: "blur" },
],
businessCode1:[
{ required: true, message: "请选择企业用户", trigger: "blur" },
],
status:[
{ required: true, message: "请选择状态", trigger: "blur" },
],
@ -384,26 +488,39 @@
userform.email = row.email
userform.phone = row.phone
//userform.sex = row.sex+''
userform.readonly = row.readonly+''
userform.avatar = row.avatar
userform.readonly = row.readonly?row.readonly+'':'2'
if(userform.type == 1){
userform.businessCode = ''
}else if(userform.type == 2){
userform.businessCode = row.businessCode
}else if(userform.type == 3){
userform.businessCode1 = row.businessCode
}
//userform.avatar = row.avatar
}else{
userform.pkId = ''
userform.uid = ''
userform.uname = ''
userform.type = ''
userform.password = ''
userform.status = ''
userform.status = '1'
userform.typeRelateCode = ''
userform.name = ''
userform.email = ''
userform.phone = ''
//userform.sex = ''
userform.readonly = ''
userform.avatar = ''
userform.readonly = '2'
//userform.avatar = ''
userform.businessCode = ''
userform.businessCode1 = ''
}
}
function caozuohand() {
if(userform.type == 3){
userform.businessCode = userform.businessCode1
}
if(cztype.value == 1){
return adduser(userform)
}
@ -474,58 +591,26 @@
}else if(row.type == 2){
userInfor.value.type = '运营方'
}else{
userInfor.value.type = '户'
userInfor.value.type = '企业用户'
}
getlist('').then(rps => {
getjslist('').then(rps => {
rolelist.value = rps.data
})
//??
// rolelist.value = [
// {
// name:'',
// pkId:500,
// rcode:'SYSADMIN',
// readonly:1,
// status:1,
// type:1
// },
// {
// name:'',
// pkId:500,
// rcode:'SYSADMIN',
// readonly:1,
// status:1,
// type:1
// }
// ]
//??
// ID
nextTick(() => {
const rows = rolelist.value.find((item:any) => item.rcode == row.rcodes)
if (rows) {
taskTableRef.value?.toggleRowSelection(rows, true)
rolesave.value.push({rcode:row.rcodes})
}
})
// getrolelist('123').then(rps => {
// rolelist.value = [
// {
// name:'',
// pkId:500,
// rcode:'SYSADMIN',
// readonly:1,
// status:1,
// type:1
// },
// {
// name:'',
// pkId:500,
// rcode:'SYSADMIN',
// readonly:1,
// status:1,
// type:1
// }
// ]
// })
})
}
function handleSelectionChange(val:any) {
rolesave.value = val
}
// function handleSelectionChange(val:any) {
// rolesave.value = val
// }
function handleClose() {
drawer.value = false
@ -537,8 +622,8 @@
if(rolesave.value.length > 0){
adduserrole({
uid:userInfor.value.uid, //id
rcode:rolesave.value[0].rcode, //
pkId:rolesave.value[0].pkId
rcode:rolesave.value[0].rcode //
//pkId:rolesave.value[0].pkId
}).then(() => {
ElMessage({
type: 'success',
@ -552,9 +637,51 @@
})
}
}
//
const taskTableRef = ref()
const selectClick = (selection: any, row: any) => {
if(selection.length > 1) {
let del_row = selection.shift();
taskTableRef.value.toggleRowSelection(del_row, false); // 使selected true true
}
rolesave.value = selection
}
function cellClass(row: any) {
//
if (row.columnIndex === 0) {
return 'disabledCheck'
}
}
//
let hdzpop = ref(false)
let uid = ref('')
let hdzcode = ref('')
function feiphdz(row:any){
hdzpop.value = true
uid.value = row.uid
hdzcode.value = row.stationCodes
}
function handhdx() {
hdzpop.value = false
handleQuery()
}
</script>
<style scoped>
<style>
/* 隐藏全选按钮 */
.el-table .disabledCheck .cell .el-checkbox__inner {
display: none;
}
.el-divider--horizontal{
border-color:#5b98cd;
}
.el-divider--horizontal{
border-color:#5b98cd;
}

View File

@ -1253,6 +1253,14 @@
function handleClick() {}
</script>
<style>
.el-table .disabledCheck .cell .el-checkbox__inner {
display: none;
}
.el-divider--horizontal{
border-color:#5b98cd;
}
</style>
<style scoped>
.el-divider--horizontal{
border-color:#5b98cd;

View File

@ -0,0 +1,211 @@
<template>
<div>
<div v-if="search" class="app-container" style="margin-bottom: 12px;padding-bottom: 5px;border-radius: 10px;">
<el-form
ref="querform"
:model="queryParams"
:inline="true"
label-width="auto"
>
<!-- <el-form-item label="车辆类型" prop="typeCode">
<el-select v-model="queryParams.typeCode" style="width: 200px;" placeholder="请选择车辆类型">
<el-option v-for="n in cartypelist" :label="n.typeName" :value="n.typeCode" />
</el-select>
</el-form-item> -->
<el-form-item label="运营商" prop="proxyId">
<el-select v-model="queryParams.proxyId" placeholder="请选择运营商" style="width: 200px;">
<el-option v-for="n in yunList" :label="n.poname" :value="n.pkId" />
</el-select>
</el-form-item>
<el-form-item label="分账状态">
<el-select v-model="queryParams.status" placeholder="请选择分账状态" style="width: 200px;">
<el-option label="待分账" :value="0" />
<el-option label="已分账" :value="1" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handBtnqu">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="app-container" style="margin-bottom: 12px;border-radius: 10px;">
<!-- <div style="display: flex;justify-content: right;">
<el-tooltip class="item" effect="dark" :content="search? '隐藏搜索' : '显示搜索'" placement="top">
<el-button size="mini" circle icon="Search" @click="search = !search" />
</el-tooltip>
</div> -->
<el-table
style="width:100%;margin-top: 10px;"
:data="yysList"
border
stripe
:max-height="search?'600px':'680px'"
:summary-method="getSummaries"
show-summary
>
<el-table-column label="运营商" min-width="150" align="center" prop="proxyName" :show-overflow-tooltip="true" />
<el-table-column label="订单数量" min-width="150" align="left" prop="orderCount" :show-overflow-tooltip="true" />
<el-table-column label="分账总金额(元)" min-width="150" align="left" prop="accountTotalAmount" :show-overflow-tooltip="true">
<template #default="scope">
<div>{{scope.row.accountTotalAmount/100}}</div>
</template>
</el-table-column>
<el-table-column label="应分金额(元)" min-width="150" align="left" prop="orderTotalAmount" :show-overflow-tooltip="true">
<template #default="scope">
<div>{{scope.row.orderTotalAmount/100}}</div>
</template>
</el-table-column>
<el-table-column label="税点总金额(元)" min-width="150" align="left" prop="taxPointTotalAmount" :show-overflow-tooltip="true">
<template #default="scope">
<div>{{scope.row.taxPointTotalAmount/100}}</div>
</template>
</el-table-column>
<el-table-column label="手续费" min-width="150" align="left" prop="totalHandlingFee" :show-overflow-tooltip="true">
<template #default="scope">
<div>{{scope.row.totalHandlingFee/100}}</div>
</template>
</el-table-column>
<el-table-column label="实际分账金额(元)" min-width="150" align="left" prop="totalAmount" :show-overflow-tooltip="true">
<template #default="scope">
<div>{{scope.row.totalAmount/100}}</div>
</template>
</el-table-column>
<el-table-column label="分账开始时间" min-width="150" align="left" prop="independentAccountBegin" :show-overflow-tooltip="true" />
<el-table-column label="分账结束时间" min-width="150" align="left" prop="independentAccountEnd" :show-overflow-tooltip="true" />
<el-table-column label="分账状态" min-width="100" align="left" prop="status" :show-overflow-tooltip="true">
<template #default="scope">
<div v-if="scope.row.status == 0">待分账</div>
<div v-else-if="scope.row.status == 1" style="color: #237d00;">已分账</div>
</template>
</el-table-column>
</el-table>
<div v-if="total > 10" style="display: flex;justify-content: right;padding-top:20px;">
<el-pagination
v-model:current-page="queryParams.pageNo"
v-model:page-size="queryParams.pageSize"
:page-sizes="[10, 20, 30, 40]"
background
size="small"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="handleSizeChange"
@current-change="getyys"
/>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import {
getyysfz
} from '@/api/order/account'
import {
getyyslist
} from '@/api/systemSet/operator'
import { ref,reactive,watch,h} from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
let search = ref(true)
let queryParams = reactive({
pageNo:1,
pageSize:20,
proxyId:'', //
status:0 //
})
//
let yunList = ref<any>([])
getyyslist({
pageSize:200,
pageNo:1
}).then(rps => {
if(rps.data){
let list = (rps.data as any).records
yunList.value = list?list:[]
}
})
//
let total = ref(0)
let yysList = ref<any>([])
let sumtotal = ref<any>({})
function handBtnqu(){
queryParams.pageNo = 1
getyys()
}
function getyys() {
yysList.value.splice(0)
getyysfz(queryParams).then(rps => {
if(rps.data){
yysList.value = (rps.data as any).pageList.records
total.value = (rps.data as any).pageList.total
sumtotal.value = (rps.data as any).totalAmount
}
})
}
function handleSizeChange(val:number) {
queryParams.pageSize = val
getyys()
}
//
let querform = ref()
function resetQuery() {
querform.value?.resetFields()
}
const getSummaries = (param:any) => {
const { columns } = param
const sums:any = []
columns.forEach((column:any, i:any) => {
if (i === 0) {
sums[i] = h('div', { style: { fontSize:'18px' } }, [
'合 计',
])
}else if(i == 1) {
sums[i] = sumtotal.value.orderCount
}else if(i == 2){
sums[i] = sumtotal.value.accountTotalAmount/100
}else if(i == 3){
sums[i] = sumtotal.value.orderTotalAmount/100
}else if(i == 4){
sums[i] = sumtotal.value.taxPointTotalAmount/100
}else if(i == 5){
sums[i] = sumtotal.value.handlingFee/100
}else if(i == 6){
sums[i] = sumtotal.value.totalAmount/100
}else {
sums[i] = ''
}
})
return sums
}
getyys()
</script>
<style scoped>
/* 隐藏全选按钮 */
:deep(.el-table .disabledCheck .cell .el-checkbox__inner) {
display: none;
}
.el-divider--horizontal{
border-color:#5b98cd;
}
</style>

View File

@ -19,6 +19,19 @@
<el-form-item label="用户名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入名称" clearable style="width: 200px;" />
</el-form-item>
<el-form-item label="所属公司" prop="pname">
<el-input v-model="queryParams.pname" placeholder="请输入公司名称" clearable style="width: 200px;" />
</el-form-item>
<el-form-item label="审核状态" prop="state">
<el-select v-model="queryParams.state" placeholder="请选择审核状态" style="width: 200px;">
<el-option label="待审核" :value="1" />
<el-option label="通过" :value="2" />
<el-option label="拒绝" :value="3" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handBtnqu">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
@ -36,6 +49,7 @@
:data="yysList"
border
stripe
highlight-current-row
:max-height="search?'600px':'680px'"
>
<el-table-column type="index" min-width="50" align="center">
@ -71,12 +85,27 @@
<div v-else-if="scope.row.type == 2">公司</div>
</template>
</el-table-column>
<el-table-column label="操作" align="center" min-width="100" fixed="right">
<el-table-column label="所属公司" min-width="150" align="center" prop="name" :show-overflow-tooltip="true">
<template #default="scope">
<!-- <el-button link type="primary" icon="Edit" @click="showpop(2,scope.row)">修改</el-button> -->
<el-button v-if="scope.row.type == 1" link type="primary" icon="Connection" @click="showbdgs(scope.row.wuid)">绑定公司</el-button>
<div>{{scope.row.pname?scope.row.pname:''}}</div>
</template>
</el-table-column>
<el-table-column label="审核状态" min-width="100" align="center" prop="name" :show-overflow-tooltip="true">
<template #default="scope">
<div v-if="scope.row.state == 1">待审核</div>
<div v-else-if="scope.row.state == 2" style="color: #529b2e;">通过</div>
<div v-else-if="scope.row.state == 3" style="color: #b88230;">拒绝</div>
<div v-else></div>
</template>
</el-table-column>
<el-table-column label="操作" align="center" min-width="100" fixed="right">
<template #default="scope">
<el-button v-if="scope.row.state == 1" link type="primary" icon="Edit" @click="showshpop(scope.row.wuid)">审核</el-button>
<el-button v-else-if="scope.row.state == 2" link type="danger" icon="Paperclip" @click="jiebing(scope.row.wuid,scope.row.pcode)">解绑公司</el-button>
<el-button v-else link type="primary" icon="Connection" @click="showbdgs(scope.row.wuid)">绑定公司</el-button>
</template>
</el-table-column>
</el-table>
<div v-if="total > 10" style="display: flex;justify-content: right;padding-top:20px;">
<el-pagination
@ -178,13 +207,49 @@
</div>
</template>
</el-dialog>
<!--审核-->
<el-dialog
v-model="shenhepop"
title="审核"
width="500px"
append-to-body
:close-on-click-modal="false"
>
<el-form ref="shRef" :model="shenhdata" :rules="shrules" label-width="110px">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="审核意见" prop="state">
<el-radio-group v-model="shenhdata.state">
<el-radio :value="2">同意</el-radio>
<el-radio :value="3">拒绝</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col v-if="(shenhdata.state as any) == 3" :span="24">
<el-form-item label="拒绝原因" prop="reason">
<el-input v-model="shenhdata.reason" maxlength="200" placeholder="请输入拒绝原因" clearable />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="shehesave"> </el-button>
<el-button @click="cancelsh"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import {
getwxlist,
gulgs,
update
update,
examine,
unbind
} from '@/api/operation/wxuser'
import {
getlist
@ -201,7 +266,9 @@
pageSize:20, //
pageNo:1, //
phoneNumber:'', //
name:'' //
name:'', //
pname:'', //
state:'' //
// wuid:'', //id
// nickName:'', //
// gender:'', //1-2-
@ -263,7 +330,7 @@
function getsglist() {
gsList.value.splice(0)
getlist(queryParams).then(rps => {
getlist(gsqueryParams).then(rps => {
if(rps.data){
gsList.value = (rps.data as any).records
gstotal.value = (rps.data as any).total
@ -399,18 +466,94 @@
})
}
//
let shenhepop = ref(false)
let shenhdata = reactive({
wuid:'',
state:'', //1-2-3-
reason:'' //
})
const shrules = ref({
state:[
{ required: true, message: "请选择审核意见", trigger: "blur" }
]
})
let shRef = ref()
function showshpop(wuid:string) {
shenhdata.wuid = wuid
shenhdata.state = ''
shenhdata.reason = ''
shRef.value?.resetFields()
shenhepop.value = true
}
function shehesave(){
shRef.value?.validate((valid:Boolean) => {
if (valid) {
examine(shenhdata).then(() => {
shenhepop.value = false
ElMessage({
type: 'success',
message: '操作成功'
})
setTimeout(()=> {
openpop.value = false
getyys()
},600)
})
}
})
}
function cancelsh() {
shenhepop.value = false
}
//
function jiebing(wuid:string,pcode:string){
ElMessageBox.confirm(
`确定解绑`,
'温馨提示',
{
// confirmButtonText: '',
// cancelButtonText: 'Cancel',
type: 'warning',
}
).then(() => {
unbind(wuid,pcode).then(() => {
ElMessage({
type: 'success',
message: '解绑成功'
})
setTimeout(()=> {
getyys()
},600)
})
})
}
getyys()
</script>
<style scoped >
<style>
/* 隐藏全选按钮 */
:deep(.el-table .disabledCheck .cell .el-checkbox__inner) {
.el-table .disabledCheck .cell .el-checkbox__inner {
display: none;
}
.el-divider--horizontal{
border-color:#5b98cd;
}
/* .el-checkbox__inner{
display: none;
} */
</style>