提交 8ed1a74a 作者: 毛细亚

合并分支 '6.8' 到 'release'

6.8

查看合并请求 !17
.DS_Store
node_modules
/dist
/company_app
/company_app/
# local env files
......
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9"/><title>企微侧边栏</title><script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script><script defer="defer" src="static/js/runtime.2425ceee.js"></script><script defer="defer" src="static/js/chunk-elementUI.d0bcf3c3.js"></script><script defer="defer" src="static/js/chunk-libs.c6681081.js"></script><script defer="defer" src="static/js/app.e6abe9ca.js"></script><link href="static/css/chunk-elementUI.dd5abb38.css" rel="stylesheet"><link href="static/css/app.d9cea248.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but company_app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
\ No newline at end of file
......@@ -32,6 +32,8 @@
"vconsole": "^3.15.1",
"vue": "^2.6.14",
"vue-router": "^3.5.1",
"autoprefixer": "^10.4.0",
"tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.2.17",
"vuex": "^3.6.2"
},
"devDependencies": {
......
......@@ -14,6 +14,9 @@ importers:
'@wecom/jssdk':
specifier: ^2.3.1
version: 2.3.1
autoprefixer:
specifier: ^10.4.0
version: 10.4.21(postcss@7.0.39)
axios:
specifier: ^1.9.0
version: 1.9.0
......@@ -68,6 +71,9 @@ importers:
sass-loader:
specifier: ^16.0.5
version: 16.0.5(node-sass@4.14.1)(sass@1.89.0)(webpack@5.99.8)
tailwindcss:
specifier: npm:@tailwindcss/postcss7-compat@^2.2.17
version: '@tailwindcss/postcss7-compat@2.2.17'
vconsole:
specifier: ^3.15.1
version: 3.15.1
......@@ -840,6 +846,11 @@ packages:
'@stagewise/toolbar@0.4.8':
resolution: {integrity: sha512-0ByvC4hYdHHf3rK5M+xSR9mipHYr8naNn2OgDBtv4DE0SoSCr08KfQtZ6VpsBNbOW/Mh1Y4c/AoWcyCTOc2ocA==}
'@tailwindcss/postcss7-compat@2.2.17':
resolution: {integrity: sha512-3h2svqQAqYHxRZ1KjsJjZOVTQ04m29LjfrLjXyZZEJuvUuJN+BCIF9GI8vhE1s0plS0mogd6E6YLg6mu4Wv/Vw==}
engines: {node: '>=12.13.0'}
hasBin: true
'@trysound/sax@0.2.0':
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
......@@ -1158,10 +1169,22 @@ packages:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
acorn-node@1.8.2:
resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==}
acorn-walk@7.2.0:
resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
engines: {node: '>=0.4.0'}
acorn-walk@8.3.4:
resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
engines: {node: '>=0.4.0'}
acorn@7.4.1:
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
engines: {node: '>=0.4.0'}
hasBin: true
acorn@8.14.1:
resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
engines: {node: '>=0.4.0'}
......@@ -1265,6 +1288,9 @@ packages:
resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==}
deprecated: This package is no longer supported.
arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
......@@ -1350,6 +1376,10 @@ packages:
peerDependencies:
postcss: ^8.1.0
autoprefixer@9.8.8:
resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==}
hasBin: true
available-typed-arrays@1.0.7:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
......@@ -1558,6 +1588,10 @@ packages:
camel-case@4.1.2:
resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
camelcase-css@2.0.1:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
camelcase-keys@2.1.0:
resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==}
engines: {node: '>=0.10.0'}
......@@ -1697,6 +1731,13 @@ packages:
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
color-string@1.9.1:
resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
color@4.2.3:
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
engines: {node: '>=12.5.0'}
colord@2.9.3:
resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
......@@ -1995,6 +2036,9 @@ packages:
crypto-js@4.2.0:
resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
css-color-names@0.0.4:
resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==}
css-declaration-sorter@6.4.1:
resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==}
engines: {node: ^10 || ^12 || >=14}
......@@ -2060,6 +2104,9 @@ packages:
resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
engines: {node: '>=8.0.0'}
css-unit-converter@1.1.2:
resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==}
css-url-regex@1.1.0:
resolution: {integrity: sha512-hLKuvifwoKvwqpctblTp0BovBuOXzxof8JgkA8zeqxxL+vcynHQjtIqqlFfQI1gEAZAjbqKm9gFTa88fxTAX4g==}
......@@ -2243,6 +2290,9 @@ packages:
resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
engines: {node: '>=0.10.0'}
defined@1.0.1:
resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
......@@ -2276,6 +2326,14 @@ packages:
detect-node@2.1.0:
resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
detective@5.2.1:
resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==}
engines: {node: '>=0.8.0'}
hasBin: true
didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
digest-header@1.1.0:
resolution: {integrity: sha512-glXVh42vz40yZb9Cq2oMOt70FIoWiv+vxNvdKdU8CwjLad25qHM3trLxhl9bVjdr6WaslIXhWpn0NO8T/67Qjg==}
engines: {node: '>= 8.0.0'}
......@@ -2287,6 +2345,9 @@ packages:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
dns-packet@5.6.1:
resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==}
engines: {node: '>=6'}
......@@ -2749,6 +2810,10 @@ packages:
fs-constants@1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
fs-extra@10.1.0:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'}
fs-extra@9.1.0:
resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
engines: {node: '>=10'}
......@@ -2996,6 +3061,9 @@ packages:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
hex-color-regex@1.1.0:
resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==}
highlight.js@10.7.3:
resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
......@@ -3005,6 +3073,12 @@ packages:
hpack.js@2.1.6:
resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==}
hsl-regex@1.0.0:
resolution: {integrity: sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==}
hsla-regex@1.0.0:
resolution: {integrity: sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==}
html-entities@2.6.0:
resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
......@@ -3025,6 +3099,10 @@ packages:
resolution: {integrity: sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==}
engines: {node: '>=4'}
html-tags@3.3.1:
resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
engines: {node: '>=8'}
html-webpack-plugin@3.2.0:
resolution: {integrity: sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==}
engines: {node: '>=6.9'}
......@@ -3219,6 +3297,9 @@ packages:
is-arrayish@0.2.1:
resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
is-arrayish@0.3.2:
resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
is-async-function@2.1.1:
resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
engines: {node: '>= 0.4'}
......@@ -3245,6 +3326,9 @@ packages:
is-class-hotfix@0.0.6:
resolution: {integrity: sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==}
is-color-stop@1.1.0:
resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==}
is-core-module@2.16.1:
resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
engines: {node: '>= 0.4'}
......@@ -3647,6 +3731,9 @@ packages:
lodash.memoize@4.1.2:
resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
lodash.topath@4.5.2:
resolution: {integrity: sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==}
lodash.uniq@4.5.0:
resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
......@@ -3850,6 +3937,10 @@ packages:
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
hasBin: true
modern-normalize@1.1.0:
resolution: {integrity: sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==}
engines: {node: '>=6'}
module-alias@2.2.3:
resolution: {integrity: sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==}
......@@ -3916,6 +4007,9 @@ packages:
node-addon-api@7.1.1:
resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
node-emoji@1.11.0:
resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==}
node-fetch@2.7.0:
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
engines: {node: 4.x || >=6.0.0}
......@@ -3995,6 +4089,9 @@ packages:
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
num2fraction@1.2.2:
resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==}
number-is-nan@1.0.1:
resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==}
engines: {node: '>=0.10.0'}
......@@ -4010,6 +4107,10 @@ packages:
resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
engines: {node: '>=0.10.0'}
object-hash@2.2.0:
resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==}
engines: {node: '>= 6'}
object-inspect@1.13.4:
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
engines: {node: '>= 0.4'}
......@@ -4369,6 +4470,24 @@ packages:
peerDependencies:
postcss: ^8.2.15
postcss-functions@3.0.0:
resolution: {integrity: sha512-N5yWXWKA+uhpLQ9ZhBRl2bIAdM6oVJYpDojuI1nF2SzXBimJcdjFwiAouBVbO5VuOF3qA6BSFWFc3wXbbj72XQ==}
postcss-js@2.0.3:
resolution: {integrity: sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==}
postcss-load-config@3.1.4:
resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
engines: {node: '>= 10'}
peerDependencies:
postcss: '>=8.0.9'
ts-node: '>=9.0.0'
peerDependenciesMeta:
postcss:
optional: true
ts-node:
optional: true
postcss-loader@6.2.1:
resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==}
engines: {node: '>= 12.13.0'}
......@@ -4436,6 +4555,9 @@ packages:
peerDependencies:
postcss: ^8.1.0
postcss-nested@4.2.3:
resolution: {integrity: sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw==}
postcss-normalize-charset@5.1.0:
resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==}
engines: {node: ^10 || ^12 || >=14.0}
......@@ -4536,6 +4658,9 @@ packages:
peerDependencies:
postcss: ^8.2.15
postcss-value-parser@3.3.1:
resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==}
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
......@@ -4543,6 +4668,10 @@ packages:
resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==}
engines: {node: '>=0.12'}
postcss@6.0.23:
resolution: {integrity: sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==}
engines: {node: '>=4.0.0'}
postcss@7.0.39:
resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==}
engines: {node: '>=6.0.0'}
......@@ -4587,6 +4716,10 @@ packages:
pretty-error@4.0.0:
resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==}
pretty-hrtime@1.0.3:
resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==}
engines: {node: '>= 0.8'}
process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
......@@ -4622,6 +4755,10 @@ packages:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
purgecss@4.1.3:
resolution: {integrity: sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw==}
hasBin: true
q@1.5.1:
resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==}
engines: {node: '>=0.6.0', teleport: '>=0.2.0'}
......@@ -4658,6 +4795,10 @@ packages:
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
quick-lru@5.1.1:
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
engines: {node: '>=10'}
quill-delta@3.6.3:
resolution: {integrity: sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==}
engines: {node: '>=0.10'}
......@@ -4719,6 +4860,9 @@ packages:
resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==}
engines: {node: '>=0.10.0'}
reduce-css-calc@2.1.8:
resolution: {integrity: sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==}
reflect.getprototypeof@1.0.10:
resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
engines: {node: '>= 0.4'}
......@@ -4836,6 +4980,12 @@ packages:
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
rgb-regex@1.0.1:
resolution: {integrity: sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==}
rgba-regex@1.0.0:
resolution: {integrity: sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==}
rimraf@2.7.1:
resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
deprecated: Rimraf versions prior to v4 are no longer supported
......@@ -5064,6 +5214,9 @@ packages:
signal-exit@3.0.7:
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
simple-swizzle@0.2.2:
resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
sirv@2.0.4:
resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
engines: {node: '>= 10'}
......@@ -5420,6 +5573,10 @@ packages:
tiny-emitter@2.1.0:
resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
tmp@0.2.5:
resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==}
engines: {node: '>=14.14'}
to-arraybuffer@1.0.1:
resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==}
......@@ -6795,6 +6952,46 @@ snapshots:
'@stagewise/toolbar@0.4.8': {}
'@tailwindcss/postcss7-compat@2.2.17':
dependencies:
arg: 5.0.2
autoprefixer: 9.8.8
bytes: 3.1.2
chalk: 4.1.2
chokidar: 3.6.0
color: 4.2.3
cosmiconfig: 7.1.0
detective: 5.2.1
didyoumean: 1.2.2
dlv: 1.1.3
fast-glob: 3.3.3
fs-extra: 10.1.0
glob-parent: 6.0.2
html-tags: 3.3.1
is-color-stop: 1.1.0
is-glob: 4.0.3
lodash: 4.17.21
lodash.topath: 4.5.2
modern-normalize: 1.1.0
node-emoji: 1.11.0
normalize-path: 3.0.0
object-hash: 2.2.0
postcss: 7.0.39
postcss-functions: 3.0.0
postcss-js: 2.0.3
postcss-load-config: 3.1.4(postcss@7.0.39)
postcss-nested: 4.2.3
postcss-selector-parser: 6.1.2
postcss-value-parser: 4.2.0
pretty-hrtime: 1.0.3
purgecss: 4.1.3
quick-lru: 5.1.1
reduce-css-calc: 2.1.8
resolve: 1.22.10
tmp: 0.2.5
transitivePeerDependencies:
- ts-node
'@trysound/sax@0.2.0': {}
'@types/body-parser@1.19.5':
......@@ -7427,10 +7624,20 @@ snapshots:
mime-types: 2.1.35
negotiator: 0.6.3
acorn-node@1.8.2:
dependencies:
acorn: 7.4.1
acorn-walk: 7.2.0
xtend: 4.0.2
acorn-walk@7.2.0: {}
acorn-walk@8.3.4:
dependencies:
acorn: 8.14.1
acorn@7.4.1: {}
acorn@8.14.1: {}
address@1.2.2: {}
......@@ -7546,6 +7753,8 @@ snapshots:
readable-stream: 2.3.8
optional: true
arg@5.0.2: {}
argparse@1.0.10:
dependencies:
sprintf-js: 1.0.3
......@@ -7618,6 +7827,16 @@ snapshots:
atob@2.1.2: {}
autoprefixer@10.4.21(postcss@7.0.39):
dependencies:
browserslist: 4.24.5
caniuse-lite: 1.0.30001718
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.1.1
postcss: 7.0.39
postcss-value-parser: 4.2.0
autoprefixer@10.4.21(postcss@8.5.3):
dependencies:
browserslist: 4.24.5
......@@ -7628,6 +7847,16 @@ snapshots:
postcss: 8.5.3
postcss-value-parser: 4.2.0
autoprefixer@9.8.8:
dependencies:
browserslist: 4.24.5
caniuse-lite: 1.0.30001718
normalize-range: 0.1.2
num2fraction: 1.2.2
picocolors: 0.2.1
postcss: 7.0.39
postcss-value-parser: 4.2.0
available-typed-arrays@1.0.7:
dependencies:
possible-typed-array-names: 1.1.0
......@@ -7964,6 +8193,8 @@ snapshots:
pascal-case: 3.1.2
tslib: 2.8.1
camelcase-css@2.0.1: {}
camelcase-keys@2.1.0:
dependencies:
camelcase: 2.1.1
......@@ -8139,6 +8370,16 @@ snapshots:
color-name@1.1.4: {}
color-string@1.9.1:
dependencies:
color-name: 1.1.4
simple-swizzle: 0.2.2
color@4.2.3:
dependencies:
color-convert: 2.0.1
color-string: 1.9.1
colord@2.9.3: {}
colorette@2.0.20: {}
......@@ -8281,6 +8522,8 @@ snapshots:
crypto-js@4.2.0: {}
css-color-names@0.0.4: {}
css-declaration-sorter@6.4.1(postcss@8.5.3):
dependencies:
postcss: 8.5.3
......@@ -8350,6 +8593,8 @@ snapshots:
mdn-data: 2.0.14
source-map: 0.6.1
css-unit-converter@1.1.2: {}
css-url-regex@1.1.0: {}
css-what@3.4.2: {}
......@@ -8570,6 +8815,8 @@ snapshots:
is-descriptor: 1.0.3
isobject: 3.0.1
defined@1.0.1: {}
delayed-stream@1.0.0: {}
delegate@3.2.0: {}
......@@ -8590,6 +8837,14 @@ snapshots:
detect-node@2.1.0: {}
detective@5.2.1:
dependencies:
acorn-node: 1.8.2
defined: 1.0.1
minimist: 1.2.8
didyoumean@1.2.2: {}
digest-header@1.1.0: {}
dingtalk-jsapi@3.1.0:
......@@ -8600,6 +8855,8 @@ snapshots:
dependencies:
path-type: 4.0.0
dlv@1.1.3: {}
dns-packet@5.6.1:
dependencies:
'@leichtgewicht/ip-codec': 2.0.5
......@@ -9214,6 +9471,12 @@ snapshots:
fs-constants@1.0.0:
optional: true
fs-extra@10.1.0:
dependencies:
graceful-fs: 4.2.11
jsonfile: 6.1.0
universalify: 2.0.1
fs-extra@9.1.0:
dependencies:
at-least-node: 1.0.0
......@@ -9531,6 +9794,8 @@ snapshots:
he@1.2.0: {}
hex-color-regex@1.1.0: {}
highlight.js@10.7.3: {}
hosted-git-info@2.8.9: {}
......@@ -9542,6 +9807,10 @@ snapshots:
readable-stream: 2.3.8
wbuf: 1.7.3
hsl-regex@1.0.0: {}
hsla-regex@1.0.0: {}
html-entities@2.6.0: {}
html-escaper@2.0.2: {}
......@@ -9568,6 +9837,8 @@ snapshots:
html-tags@2.0.0: {}
html-tags@3.3.1: {}
html-webpack-plugin@3.2.0(webpack@5.99.8):
dependencies:
html-minifier: 3.5.21
......@@ -9814,6 +10085,8 @@ snapshots:
is-arrayish@0.2.1: {}
is-arrayish@0.3.2: {}
is-async-function@2.1.1:
dependencies:
async-function: 1.0.0
......@@ -9841,6 +10114,15 @@ snapshots:
is-class-hotfix@0.0.6: {}
is-color-stop@1.1.0:
dependencies:
css-color-names: 0.0.4
hex-color-regex: 1.1.0
hsl-regex: 1.0.0
hsla-regex: 1.0.0
rgb-regex: 1.0.1
rgba-regex: 1.0.0
is-core-module@2.16.1:
dependencies:
hasown: 2.0.2
......@@ -10216,6 +10498,8 @@ snapshots:
lodash.memoize@4.1.2: {}
lodash.topath@4.5.2: {}
lodash.uniq@4.5.0: {}
lodash@4.17.21: {}
......@@ -10424,6 +10708,8 @@ snapshots:
dependencies:
minimist: 1.2.8
modern-normalize@1.1.0: {}
module-alias@2.2.3: {}
moment@2.30.1: {}
......@@ -10495,6 +10781,10 @@ snapshots:
node-addon-api@7.1.1:
optional: true
node-emoji@1.11.0:
dependencies:
lodash: 4.17.21
node-fetch@2.7.0:
dependencies:
whatwg-url: 5.0.0
......@@ -10599,6 +10889,8 @@ snapshots:
dependencies:
boolbase: 1.0.0
num2fraction@1.2.2: {}
number-is-nan@1.0.1:
optional: true
......@@ -10613,6 +10905,8 @@ snapshots:
define-property: 0.2.5
kind-of: 3.2.2
object-hash@2.2.0: {}
object-inspect@1.13.4: {}
object-is@1.1.6:
......@@ -10974,6 +11268,25 @@ snapshots:
dependencies:
postcss: 8.5.3
postcss-functions@3.0.0:
dependencies:
glob: 7.2.3
object-assign: 4.1.1
postcss: 6.0.23
postcss-value-parser: 3.3.1
postcss-js@2.0.3:
dependencies:
camelcase-css: 2.0.1
postcss: 7.0.39
postcss-load-config@3.1.4(postcss@7.0.39):
dependencies:
lilconfig: 2.1.0
yaml: 1.10.2
optionalDependencies:
postcss: 7.0.39
postcss-loader@6.2.1(postcss@8.5.3)(webpack@5.99.8):
dependencies:
cosmiconfig: 7.1.0
......@@ -11041,6 +11354,11 @@ snapshots:
icss-utils: 5.1.0(postcss@8.5.3)
postcss: 8.5.3
postcss-nested@4.2.3:
dependencies:
postcss: 7.0.39
postcss-selector-parser: 6.1.2
postcss-normalize-charset@5.1.0(postcss@8.5.3):
dependencies:
postcss: 8.5.3
......@@ -11133,6 +11451,8 @@ snapshots:
postcss: 8.5.3
postcss-selector-parser: 6.1.2
postcss-value-parser@3.3.1: {}
postcss-value-parser@4.2.0: {}
postcss@5.2.18:
......@@ -11142,6 +11462,12 @@ snapshots:
source-map: 0.5.7
supports-color: 3.2.3
postcss@6.0.23:
dependencies:
chalk: 2.4.2
source-map: 0.6.1
supports-color: 5.5.0
postcss@7.0.39:
dependencies:
picocolors: 0.2.1
......@@ -11194,6 +11520,8 @@ snapshots:
lodash: 4.17.21
renderkid: 3.0.0
pretty-hrtime@1.0.3: {}
process-nextick-args@2.0.1: {}
progress-webpack-plugin@1.0.16(webpack@5.99.8):
......@@ -11229,6 +11557,13 @@ snapshots:
punycode@2.3.1: {}
purgecss@4.1.3:
dependencies:
commander: 8.3.0
glob: 7.2.3
postcss: 8.5.3
postcss-selector-parser: 6.1.2
q@1.5.1: {}
qrcode.vue@1.7.0(vue@2.7.16):
......@@ -11260,6 +11595,8 @@ snapshots:
queue-microtask@1.2.3: {}
quick-lru@5.1.1: {}
quill-delta@3.6.3:
dependencies:
deep-equal: 1.1.2
......@@ -11355,6 +11692,11 @@ snapshots:
strip-indent: 1.0.1
optional: true
reduce-css-calc@2.1.8:
dependencies:
css-unit-converter: 1.1.2
postcss-value-parser: 3.3.1
reflect.getprototypeof@1.0.10:
dependencies:
call-bind: 1.0.8
......@@ -11498,6 +11840,10 @@ snapshots:
reusify@1.1.0: {}
rgb-regex@1.0.1: {}
rgba-regex@1.0.0: {}
rimraf@2.7.1:
dependencies:
glob: 7.2.3
......@@ -11790,6 +12136,10 @@ snapshots:
signal-exit@3.0.7: {}
simple-swizzle@0.2.2:
dependencies:
is-arrayish: 0.3.2
sirv@2.0.4:
dependencies:
'@polka/url': 1.0.0-next.29
......@@ -12256,6 +12606,8 @@ snapshots:
tiny-emitter@2.1.0: {}
tmp@0.2.5: {}
to-arraybuffer@1.0.1: {}
to-buffer@1.1.1:
......
/*
* @Author: maoxiya 937667504@qq.com
* @Date: 2025-08-30 10:58:38
* @LastEditors: maoxiya 937667504@qq.com
* @LastEditTime: 2025-08-30 10:58:43
* @FilePath: /company_app/postcss.config.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
module.exports = {
plugins: [
require('tailwindcss'),
require('autoprefixer')
]
}
\ No newline at end of file
import request from '@/utils/request'
import store from '@/store/index'
import Cookies from 'js-cookie'
import request from '@/utils/request';
import store from '@/store/index';
import Cookies from 'js-cookie';
// 获取用户ID的函数,避免在模块加载时访问可能未初始化的 store
function getZwUserId() {
return Cookies.get('cser_id') ||
(store.state?.user?.userInfo?.id) ||
(store.state?.user?.cser_id)
return (
Cookies.get('cser_id') ||
store.state?.user?.userInfo?.id ||
store.state?.user?.cser_id
);
}
// 游戏业务所属的接口信息
// 所属分组下拉
function returnApi(api){
return '/sidebar' + api
function returnApi(api) {
return '/sidebar' + api;
}
export function cross_systemRequest(data) {
!data.noApi ? data.api = '/api' + data.api : ''
!data.noApi ? (data.api = '/api' + data.api) : '';
return request({
url: '/sidebar/cross_system/request',
method: 'post',
data
})
data,
});
}
// 请求角色详情
export function memberView(data) {
......@@ -27,11 +29,11 @@ export function memberView(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/view',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 修改手机号
......@@ -40,11 +42,11 @@ export function bindMobile(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/bindMobile',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 角色列表
......@@ -53,11 +55,11 @@ export function roleList(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/role/getList',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 绑定掌游账号
......@@ -65,8 +67,8 @@ export function zyouBind(data) {
return request({
url: returnApi('/external_user/zyouBind'),
method: 'post',
data
})
data,
});
}
// 订单列表
......@@ -75,11 +77,11 @@ export function orderList(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/order/list',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 订单金额
export function todayOrder(data) {
......@@ -87,11 +89,11 @@ export function todayOrder(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/todayOrder',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 补单和补回调
export function completionOrder(data) {
......@@ -99,11 +101,11 @@ export function completionOrder(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/order/completionOrder',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 退款提交申请
export function refundRequest(data) {
......@@ -111,11 +113,11 @@ export function refundRequest(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/order/addRefundRequest',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 退款申请记录
export function refundRecord(data) {
......@@ -123,11 +125,11 @@ export function refundRecord(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/order/getRefundRequestList',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 退款详情
export function refundRequestLog(data) {
......@@ -135,11 +137,11 @@ export function refundRequestLog(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/order/refundRequestProcess',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 下拉请求
export function selectSearch(data) {
......@@ -147,11 +149,11 @@ export function selectSearch(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/searchcondition/search',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 账号维度推广游戏列表
......@@ -160,11 +162,11 @@ export function memberExtensionGameList(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/memberExtensionGameList',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 充值
// 账号维度推广游戏列表
......@@ -173,11 +175,11 @@ export function getAmountByTime(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/getAmountByTime',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 违规记录
......@@ -186,11 +188,11 @@ export function violationList(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/violationList',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 重置密码
export function autoResetPassword(data) {
......@@ -198,19 +200,19 @@ export function autoResetPassword(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/autoResetPassword',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 重置密码加密
export function passwardEncryption(data) {
return request({
url: '/sidebar/session/zyouAutoResetPassword',
method: 'post',
data
})
data,
});
}
// VIP自助工具
......@@ -219,11 +221,11 @@ export function createVipUrl(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/createVipUrl',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 活动类型
......@@ -232,11 +234,11 @@ export function giftTypeList(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/searchcondition/search',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 充值活动列表
export function activeList(data) {
......@@ -244,11 +246,11 @@ export function activeList(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/getVipBagCodeRuleListByRole',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 活动详情
export function giftDetailsData(data) {
......@@ -256,11 +258,11 @@ export function giftDetailsData(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/getRoleConditionByRuleAndRole',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 申请礼包
......@@ -269,11 +271,11 @@ export function giftBagApply(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/giftBagApply',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 礼包检测
export function checkRoleReceivedBag(data) {
......@@ -281,11 +283,11 @@ export function checkRoleReceivedBag(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/role_gift_bag/checkRoleReceivedBag',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 礼包列表
export function emailGiftList(data) {
......@@ -293,11 +295,11 @@ export function emailGiftList(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/giftBagApplyIndex',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 易主标签查询
......@@ -306,11 +308,11 @@ export function getMemberLabel(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/getMemberLabel',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 修改易主标签
export function editMemberLabel(data) {
......@@ -318,11 +320,11 @@ export function editMemberLabel(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/editMemberLabel',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// // 转端接口
// export function getMemberLink(data) {
......@@ -343,11 +345,11 @@ export function getMemberLink(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/getMemberLink',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 转游接口
export function getLandingPageMemberLink(data) {
......@@ -355,11 +357,11 @@ export function getLandingPageMemberLink(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/getLandingPageMemberLink',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 转游接口
export function getLandingPageConfig(data) {
......@@ -367,11 +369,11 @@ export function getLandingPageConfig(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/member/getLandingPageConfig',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 渠道列表单独渠道KEY
......@@ -380,850 +382,959 @@ export function channelList(data) {
cross_systemRequest({
system: 'zhangyou',
api: '/channel/channelList',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 工单
// 任务列表
export function taskIndex(data) {
return new Promise((resovle, reject) => {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
cross_systemRequest({
system: 'zhangyou',
api: '/operator_task/index',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 任务详情
export function taskDetails(data) {
return new Promise((resovle, reject) => {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
cross_systemRequest({
system: 'zhangyou',
api: '/operator_task/info',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 分配
export function taskAssign(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/operator_task/assign',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 完成任务
export function taskTrack(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/operator_task/track',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 结果列表
export function taskRecord(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/operator_task/logs',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 备注
export function logsSave(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/operator_task_log/save',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 角色累充
export function RoleTodayOrder(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/role/todayOrder',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 用户充值
export function memberOrder(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/member/memberOrder',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 下拉加载
export function searchcondition(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/searchcondition/search',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 误操作列表
export function misoperationIndex(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/mistake_operation_request/list',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 添加误操作
export function addErrorHandle(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/mistake_operation_request/add',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
export function updateErrorHandle(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/misoperation/update',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 操作数量
export function numErrorHandle(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/misoperation/num',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 操作数量新
export function operationCount(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/mistake_operation_request/operationCount',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 任务消息读取
export function taskRead(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/operator_task/read',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 任务消息状态
export function taskReadStatus(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/operator_task/readStatus',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 撤回消息
export function cancelRefundRequest(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/order/cancelRefundRequest',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 举报列表
export function reportIndex(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/admin/report_request/list',
params: data,
noApi: true
noApi: true,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 玩家举报
export function playerReport(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/report_request/waitList',
params: data,
noApi: true
noApi: true,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 审批记录
export function reportProcess(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/report_request/process',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 撤销举报
export function reportCancel(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/report_request/cancel',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 新增举报
export function reportAdd(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/report_request/add',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 申诉列表
export function appealList(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/appeal_request/list',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 新增申诉
export function appealAdd(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/appeal_request/add',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 撤销申诉
export function appealCancel(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/appeal_request/cancel',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 申诉记录
export function appealProcess(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/appeal_request/process',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 玩家举报审批记录
export function gamerReportProcess(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/report_request/process',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 角色列表Holo 实时性较高
export function getRoleHoLo(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/role/getListHoLo',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 角色列表 待请求
export function memberTaskStatus(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/operator_task/memberTaskStatus',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 举报申请列表
export function report_request_list(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/report_request/list',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 举报申请驳回或者通过
export function report_request_approval(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/report_request/approval',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 游戏类型下的游戏列表 游戏类型:安卓 h5 ios
export function getTransferRecallGameList(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/member/getTransferRecallGameList',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 转端和召回 游戏类型列表
export function getGameConfig(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/game/getGameConfig',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 召回的时候染色
export function recallChannelSeq(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/channel/recallChannelSeq',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 获取游戏信息
export function getGameInfo(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/game/info',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 新增渠道
export function addChannel(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/channel/addDistributorChannelByZm',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 一键发送召回渠道链接
export function quickRecallChannelLink(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/channel/quickRecallChannelLink',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 转端发送落地页
export function getLandingPageTransfer(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/member/getLandingPageTransfer',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 工作台关联客服
export function bindUserSelfAdd(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/member_bind_cser/selfAdd',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 关联客服列表
export function bindUserList(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/member_bind_cser/list',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 新增关联客服
export function bindUserAdd(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/member_bind_cser/add',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 删除关联客服
export function bindUserDelete(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/member_bind_cser/delete',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 调用掌游的日志中心
export function getSystemModelLog(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/member_bind_cser/getSystemModelLog',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
export function getMemberTransStatus(data) {
// 转端文档 获取W账号的转端状态 如果状态是 false 表示不允许转端 在工作台 发送游戏 里面转端里 点开发送的时候 提示 当前w账号不满足转端要求,请联系组长处理
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/member/getMemberTransStatus',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
export function getTaskTracer(data) {
// 获取运营任务的跟进人 参数 member_id
data.zw_user_id = getZwUserId()
// 获取运营任务的跟进人 参数 member_id
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/operator_task/getTaskTracer',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 用户触达 发送客服号添加消息的日志
export function getTaskTracerTouch(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/operator_task_log/touch',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 添加一条任务跟进记录
export function getTaskTracerTouchAdd(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/operator_task_log/add',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 审批组流程下拉
export function approval_group_flow_list(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/approval_group_flow/options',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 审批人员表格
export function approval_group_flow_user(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/approval_group_flow/users',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 保存转端提交
export function approval_group_flow_add(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/member_trans_request/add',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 转端申请列表
export function member_trans_request_list(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/member_trans_request/list',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 转端申请审批记录
export function member_trans_request_process(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/member_trans_request/process',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 转区列表
export function transfer_server_request_list(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/transfer_server_request/list',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 转区申请
export function transfer_server_request_add(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/transfer_server_request/add',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 转区申请节点
export function transfer_server_request_process(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/transfer_server_request/process',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
export function getMainGameInfo(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/service_wechat/getMainGameInfo',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 掌游标签搜索
export function roleLabelSearch(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/role/labelSearch',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 掌游标签列表
export function roleGetRoleLabel(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/role/getRoleLabel',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 编辑角色标签
export function editRoleLabel(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/role/editRoleLabel',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 编辑角色标签
export function getRoleLabelCreate(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/role/getRoleLabelCreate',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
export function ruleList(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/member_trans_request/ruleList',
params: data
params: data,
}).then((res) => {
resovle(res)
})
})
resovle(res);
});
});
}
// 查询客服未完成任务
export function getTaskTotal(data) {
data.zw_user_id = getZwUserId()
data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/operator_task/getTaskTotal',
params: data
params: data,
}).then((res) => {
resovle(res)
resovle(res);
});
});
}
/**
* 当前w账号充值金额最靠前的有未推送的近期要开首条数据
* @param {{member_id}} data
* @returns
*/
export function getRoleRecentActivityOneApi(data) {
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/recent_activity/roleRecentActivityOne',
params: data,
})
.then((res) => {
resovle(res);
})
.catch((error) => {
reject(error);
});
});
}
/**
* 角色近期要开活动编辑
* @param {Object} data - 请求参数对象
* @param {string} data.role_id - 角色ID
* @param {string} data.open_activity_time - 活动开启时间
* @param {string} data.activity_rule_id - 活动规则ID
* @param {string} data.is_push - 是否推送(2=已推送,只能传2)
* @param {number} data.type - 操作类型(1=更新推送,2=更新备注)
* @param {string} data.remark - 备注信息
* @param {number} data.user_id - 操作人ID
* @param {string} data.user_name - 操作人姓名
* @returns {Promise} 返回Promise对象,包含请求结果
*/
export function getRoleRecentActivityEditApi(data) {
console.log(data, '===123123123123123===');
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/recent_activity/roleRecentActivityEdit',
params: data,
})
.then((res) => {
resovle(res);
})
.catch((error) => {
reject(error);
});
});
}
/**
* 角色近期要开列表
* @param {{role_id}} data
* @returns
*/
export function getRoleRecentActivityListApi(data) {
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/recent_activity/roleRecentActivityList',
params: data,
})
.then((res) => {
resovle(res);
})
.catch((error) => {
reject(error);
});
});
}
/**
* 角色近期活动列表
* @param {{role_id}} data
* @returns
*/
export function getRecentActivityListApi(data) {
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/recent_activity/recentActivityList',
params: data,
})
.then((res) => {
resovle(res);
})
.catch((error) => {
reject(error);
});
});
}
/**
* 账号近期要开活动数
* @param {{member_id}} data
* @returns
*/
export function getRoleRecentActivityNotPushNumApi(data) {
return new Promise((resovle, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/recent_activity/roleRecentActivityNotPushNum',
params: data,
})
.then((res) => {
resovle(res);
})
.catch((error) => {
reject(error);
});
});
}
import request from '@/utils/request'
import store from '@/store/index'
import request from '@/utils/request';
import store from '@/store/index';
// 所属分组下拉
function returnApi(api){
return '/sidebar' + api
function returnApi(api) {
return '/sidebar' + api;
}
export function procedure_group(data) {
return request({
url: returnApi('/procedure_group/index'),
method: 'post',
data
})
data,
});
}
// 话术列表
export function procedureList(data) {
return request({
url: returnApi('/procedure/index'),
method: 'post',
data
})
data,
});
}
// 删除话术
......@@ -25,8 +25,8 @@ export function proceduredel(data) {
return request({
url: returnApi('/procedure/del'),
method: 'post',
data
})
data,
});
}
// 批量移动
......@@ -34,8 +34,8 @@ export function proceduremove(data) {
return request({
url: returnApi('/procedure/move'),
method: 'post',
data
})
data,
});
}
// 新增话术
......@@ -43,8 +43,8 @@ export function procedureadd(data) {
return request({
url: returnApi('/procedure/add'),
method: 'post',
data
})
data,
});
}
// 分组添加/修改
......@@ -52,8 +52,8 @@ export function procedure_groupAdd(data) {
return request({
url: returnApi('/procedure_group/add'),
method: 'post',
data
})
data,
});
}
// 分组删除
......@@ -61,8 +61,8 @@ export function procedure_groupDel(data) {
return request({
url: returnApi('/procedure_group/del'),
method: 'post',
data
})
data,
});
}
// 个人话术移到企业库
......@@ -70,8 +70,8 @@ export function addCompany(data) {
return request({
url: returnApi('/procedure/addCompany'),
method: 'post',
data
})
data,
});
}
// 个人话术详情
......@@ -79,8 +79,8 @@ export function procedureInfo(data) {
return request({
url: returnApi('/procedure/info'),
method: 'post',
data
})
data,
});
}
// 个人话术排序
......@@ -88,8 +88,8 @@ export function procedureSort(data) {
return request({
url: returnApi('/procedure/sort'),
method: 'post',
data
})
data,
});
}
// 个人话术租排序
......@@ -97,8 +97,8 @@ export function procedureGroupSort(data) {
return request({
url: returnApi('/procedure_group/sort'),
method: 'post',
data
})
data,
});
}
// 企业话术增至个人
......@@ -106,8 +106,8 @@ export function addToPersonal(data) {
return request({
url: returnApi('/procedure/addToPersonal'),
method: 'post',
data
})
data,
});
}
// 话术使用次数
......@@ -115,8 +115,8 @@ export function skillQuote(data) {
return request({
url: '/admin/procedure/quote',
method: 'post',
data
})
data,
});
}
/* ----------- 知识库的接口 ---------- */
......@@ -125,16 +125,16 @@ export function groupList(data) {
return request({
url: returnApi('/knowledge_group/index'),
method: 'post',
data
})
data,
});
}
// 知识库分组下拉
export function libraryIndex(data) {
return request({
url: returnApi('/knowledge_base/index'),
method: 'post',
data
})
data,
});
}
// 新增和编辑
......@@ -142,8 +142,8 @@ export function groupHandle(data) {
return request({
url: returnApi('/knowledge_group/add'),
method: 'post',
data
})
data,
});
}
// 删除分组
......@@ -151,63 +151,63 @@ export function groupDel(data) {
return request({
url: returnApi('/knowledge_group/del'),
method: 'post',
data
})
data,
});
}
// 新增知识库任务
export function addLibraryTask(data) {
return request({
url: returnApi('/knowledge_base/add'),
method: 'post',
data
})
data,
});
}
// 详情
export function libraryTaskView(data) {
return request({
url: returnApi('/knowledge_base/view'),
method: 'post',
data
})
data,
});
}
// 编辑
export function libraryTaskEdit(data) {
return request({
url: returnApi('/knowledge_base/edit'),
method: 'post',
data
})
data,
});
}
// 删除
export function libraryTaskDel(data) {
return request({
url: returnApi('/knowledge_base/del'),
method: 'post',
data
})
data,
});
}
// 批量删除
export function multipleDel(data) {
return request({
url: returnApi('/knowledge_base/batchDel'),
method: 'post',
data
})
data,
});
} // 导入
export function importData(data) {
return request({
url: returnApi('/knowledge_base/importKnowledgeBase'),
method: 'post',
data
})
data,
});
}
// 知识库计数
export function logClickTime(data) {
return request({
url: returnApi('/knowledge_base/logClickTime'),
method: 'post',
data
})
data,
});
}
// 问答模块
......@@ -215,18 +215,17 @@ export function Aihistory(data) {
return request({
url: returnApi('/corp_beta_question_log/history'),
method: 'post',
data
})
data,
});
}
// 同步知识库
export function asyncKnowledge(data) {
return request({
url: returnApi('/knowledge_base/syncToCorp'),
method: 'post',
data
})
data,
});
}
/* -------------------- 机器人知识库 ----------------------- */
......@@ -235,8 +234,8 @@ export function corp_robot_knowledge_add(data) {
return request({
url: returnApi('/corp_robot_knowledge_base/add'),
method: 'post',
data
})
data,
});
}
// 机器人知识库列表
......@@ -244,48 +243,48 @@ export function corp_robot_knowledge_list(data) {
return request({
url: returnApi('/corp_robot_knowledge_base/index'),
method: 'post',
data
})
data,
});
}
// 机器人知识库编辑
export function corp_robot_knowledge_edit(data) {
return request({
url: returnApi('/corp_robot_knowledge_base/edit'),
method: 'post',
data
})
data,
});
}
// 机器人知识库详情
export function corp_robot_knowledge_view(data) {
return request({
url: returnApi('/corp_robot_knowledge_base/view'),
method: 'post',
data
})
data,
});
}
// 机器人知识库删除
export function corp_robot_knowledge_del(data) {
return request({
url: returnApi('/corp_robot_knowledge_base/delete'),
method: 'post',
data
})
data,
});
}
// 机器人知识库批量删除
export function corp_robot_knowledge_batchDelete(data) {
return request({
url: returnApi('/corp_robot_knowledge_base/batchDelete'),
method: 'post',
data
})
data,
});
}
// 机器人知识库批量导入
export function corp_robot_knowledge_import(data) {
return request({
url: returnApi('/corp_robot_knowledge_base/import'),
method: 'post',
data
})
data,
});
}
/* --------------------机器人知识库分组-----------------------*/
// 知识库分组列表
......@@ -293,32 +292,32 @@ export function corp_robot_knowledge_group_index(data) {
return request({
url: returnApi('/corp_robot_knowledge_group/index'),
method: 'post',
data
})
data,
});
}
// 知识库分组新增
export function corp_robot_knowledge_group_add(data) {
return request({
url: returnApi('/corp_robot_knowledge_group/add'),
method: 'post',
data
})
data,
});
}
// 知识库分组编辑
export function corp_robot_knowledge_group_edit(data) {
return request({
url: returnApi('/corp_robot_knowledge_group/edit'),
method: 'post',
data
})
data,
});
}
// 知识库分组删除
export function corp_robot_knowledge_group_del(data) {
return request({
url: returnApi('/corp_robot_knowledge_group/delete'),
method: 'post',
data
})
data,
});
}
// AI问答对列表
......@@ -326,8 +325,8 @@ export function AI_list(data) {
return request({
url: returnApi('/corp_ai_question_answer/index'),
method: 'post',
data
})
data,
});
}
// 业务下拉
......@@ -335,8 +334,8 @@ export function search_condition(data) {
return request({
url: '/admin/search_condition',
method: 'post',
data
})
data,
});
}
// 智能体列表
......@@ -344,8 +343,8 @@ export function corp_beta_config(data) {
return request({
url: '/admin/corp_beta_config/index',
method: 'post',
data
})
data,
});
}
// 标记有用/无用
......@@ -353,22 +352,30 @@ export function markUseful(data) {
return request({
url: returnApi('/corp_ai_question_answer/markUseful'),
method: 'post',
data
})
data,
});
}
// 跨主体分组列表
export function cross_corp_robot_knowledge_group_index(data) {
return request({
url: returnApi('/corp_cross_knowledge_group/index'),
method: 'post',
data
})
data,
});
}
// 跨主体知识库分组列表
export function cross_corp_robot_knowledge_group_getList(data) {
return request({
url: returnApi('/corp_cross_knowledge_base/getList'),
method: 'post',
data
})
data,
});
}
// 营销面板-话术生成
export function getGenerateProcedureApi(data) {
return request({
url: returnApi('/corp_activity_procedure/generateProcedure'),
method: 'post',
data,
});
}
// 客户绑定掌游账号列表
import request from '@/utils/request'
import request from '@/utils/request';
function returnApi(api) {
return '/sidebar' + api
return '/sidebar' + api;
}
// w 账号绑定列表
export function zyouBindMember(data) {
return request({
url: returnApi('/external_user/zyouBindMember'),
method: 'post',
data
})
data,
});
}
// 检查账号绑定
export function checkZyouBind(data) {
return request({
url: returnApi('/external_user/checkZyouBind'),
method: 'post',
data
})
data,
});
}
// 绑定掌游账号
// 绑定掌游账号
......@@ -27,68 +27,67 @@ export function zyouBind(data) {
return request({
url: returnApi('/external_user/zyouBind'),
method: 'post',
data
})
data,
});
}
export function detailsInfoRequest(data) {
return request({
url: returnApi('/external_user/info'),
method: 'post',
data
})
}
data,
});
}
// 是否转端
export function toTransfer(data) {
return request({
url: returnApi('/external_user/toTransfer'),
method: 'post',
data
})
}
// 同步智能标签
export function syncSessionIntelTag(data) {
data,
});
}
// 同步智能标签
export function syncSessionIntelTag(data) {
return request({
url: '/sidebar/group_tag_detail/syncSessionIntelTag',
method: 'post',
data
})
}
data,
});
}
// 关联客服
export function memberBindCser(data) {
export function memberBindCser(data) {
return request({
url: returnApi('/external_user/memberBindCser'),
method: 'post',
data
})
}
data,
});
}
// 修改用户信息
// 修改用户信息
export function editUser(data) {
export function editUser(data) {
return request({
url: returnApi('/external_user/edit'),
method: 'post',
data
})
}
data,
});
}
// 修改共享信息
export function shareInfoUpsert(data) {
export function shareInfoUpsert(data) {
return request({
url: returnApi('/external_user/shareInfoUpsert'),
method: 'post',
data
})
}
data,
});
}
// 解绑掌游账号
// 解绑掌游账号
export function zyouUnBind(data) {
return request({
url: returnApi('/external_user/zyouUnBind'),
method: 'post',
data
})
data,
});
}
// 获取礼包码列表
......@@ -96,16 +95,16 @@ export function getSendingCodeList(data) {
return request({
url: returnApi('/corp_gift_package_list/getSendingCodeList'),
method: 'post',
data
})
data,
});
}
// 标签
export function searchTags(data) {
return request({
url: returnApi('/tag/index'),
method: 'post',
data
})
data,
});
}
// 通讯录
......@@ -113,32 +112,32 @@ export function externalUserList(data) {
return request({
url: returnApi('/corp_user/externalUserList'),
method: 'post',
data
})
data,
});
}
// 获取图片id
export function getMediaId(data) {
return request({
url: returnApi('/common/getMedia'),
method: 'post',
data
})
data,
});
}
// 通讯录红点
export function mailRedTip(data) {
return request({
url: returnApi('/external_user/redTip'),
method: 'post',
data
})
data,
});
}
// 同步通讯录
export function refreshBindMail(data) {
return request({
url: returnApi('/external_user/refreshBind'),
method: 'post',
data
})
data,
});
}
// 搜索客户
......@@ -147,24 +146,24 @@ export function remarkSearchSelect(data) {
return request({
url: returnApi('/follow_user/preview'),
method: 'post',
data
})
data,
});
}
// 礼包可发送礼包
export function giftCodeList(data) {
return request({
url: returnApi('/corp_gift_package_list/getCanSendPackage'),
method: 'post',
data
})
data,
});
}
// 礼包码发送
export function sendGiftCode(data) {
return request({
url: returnApi('/corp_gift_package_list/sendGiftCode'),
method: 'post',
data
})
data,
});
}
// 获取举报授权链接地址
......@@ -172,8 +171,8 @@ export function getZyouAuthLink(data) {
return request({
url: returnApi('/corp_zyou_bind/getZyouAuthLink'),
method: 'post',
data
})
data,
});
}
// 转游最近发送的记录 5 条
......@@ -181,32 +180,32 @@ export function getRecentSendLog(data) {
return request({
url: returnApi('/corp_zyou_game_send_log/getRecentSendLog'),
method: 'post',
data
})
data,
});
}
// 标记转端
export function markTransScene(data) {
return request({
url: returnApi('/external_user/markTransScene'),
method: 'post',
data
})
data,
});
}
// 根据用户 id 获取掌权分组
export function getZqCserGroup(data) {
return request({
url: returnApi('/common/getZqCserGroup'),
method: 'post',
data
})
data,
});
}
// 根据用户 id 获取掌权项目
export function getZqCserWxBelong(data) {
return request({
url: returnApi('/common/getZqCserWxBelong'),
method: 'post',
data
})
data,
});
}
// 记录转游发送记录
......@@ -214,16 +213,16 @@ export function send_log_add(data) {
return request({
url: returnApi('/corp_zyou_game_send_log/add'),
method: 'post',
data
})
data,
});
}
// 发送渠道密码加密
export function zyouGetMemberLink(data) {
return request({
url: returnApi('/session/zyouGetMemberLink'),
method: 'post',
data
})
data,
});
}
// 我的任务获取红点数组
......@@ -231,8 +230,8 @@ export function getTaskUnReadData(data) {
return request({
url: returnApi('/corp_zyou_bind/getTaskUnReadData'),
method: 'post',
data
})
data,
});
}
// 我的任务小时红点数字
......@@ -240,24 +239,24 @@ export function clearTaskUnReadData(data) {
return request({
url: returnApi('/corp_zyou_bind/clearTaskUnReadData'),
method: 'post',
data
})
data,
});
}
// w账号绑定客户列表
export function memberBindExternalUser(data) {
return request({
url: returnApi('/cser_receipt/memberBindExternalUser'),
method: 'post',
data
})
data,
});
}
// 删除共享信息
export function shareInfoDel(data) {
return request({
url: returnApi('/external_user/shareInfoDel'),
method: 'post',
data
})
data,
});
}
// 跟进总结列表
......@@ -266,6 +265,14 @@ export function corp_follow_up_summary_index(data) {
return request({
url: returnApi('/corp_follow_up_summary/index'),
method: 'post',
data
})
data,
});
}
// 话术生成复制
export function corp_activity_procedure_copyUsed(data) {
return request({
url: returnApi('/corp_activity_procedure/copyUsed'),
method: 'post',
data,
});
}
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
<title>编辑</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="工作台" transform="translate(-1881.000000, -278.000000)" fill-rule="nonzero">
<g id="编辑" transform="translate(1880.000000, 277.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="20" height="20"></rect>
<path d="M18.0820312,8.68359375 C17.8125,8.68359375 17.59375,8.90234375 17.59375,9.171875 L17.59375,15.5546875 C17.59375,16.9003906 16.4980469,17.9960938 15.1523438,17.9960938 L4.7734375,17.9960938 C3.42773438,17.9960938 2.33203125,16.9003906 2.33203125,15.5546875 L2.33203125,4.67773438 C2.33203125,3.33203125 3.42773438,2.23632812 4.7734375,2.23632812 L11.15625,2.23632812 C11.4257813,2.23632812 11.6445313,2.01757812 11.6445313,1.74804688 C11.6445313,1.47851562 11.4257813,1.25976562 11.15625,1.25976562 L4.7734375,1.25976562 C2.88867188,1.25976562 1.35546875,2.79296875 1.35546875,4.67773438 L1.35546875,15.5527344 C1.35546875,17.4375 2.88867188,18.9707031 4.7734375,18.9707031 L15.1523438,18.9707031 C17.0371094,18.9707031 18.5703125,17.4375 18.5703125,15.5527344 L18.5703125,9.171875 C18.5703125,8.90234375 18.3515625,8.68359375 18.0820312,8.68359375 Z M18.6816406,3.65429687 L16.3417969,1.3984375 C16.2480469,1.30859375 16.1230469,1.25976562 15.9941406,1.26166234 C15.8652344,1.26367187 15.7421875,1.31835937 15.6523438,1.41015625 L14.359375,2.75195312 C14.3515625,2.7578125 14.3457031,2.765625 14.3378906,2.7734375 L6.95898438,10.421875 C6.9296875,10.453125 6.90429688,10.4863281 6.88476563,10.5214844 C6.85742188,10.5605469 6.8359375,10.6035156 6.82226563,10.6484375 L5.66015625,14.2382812 C5.6015625,14.4179687 5.65234375,14.6152344 5.7890625,14.7441406 C5.88085938,14.8300781 6.00195313,14.8769531 6.12304688,14.8769531 C6.18359375,14.8769531 6.24414063,14.8652344 6.30078125,14.84375 L9.73828125,13.4980469 C9.83398438,13.4804687 9.92773438,13.4335937 10,13.3574219 L17.3085937,5.78125 C17.3164062,5.77539062 17.3222656,5.76757812 17.3300781,5.76171875 L18.6953125,4.34570312 C18.8828125,4.15039062 18.8769531,3.84179687 18.6816406,3.65429687 Z M14.6484375,3.85546875 L16.2851562,5.43554688 L9.63671875,12.3300781 L8,10.75 L14.6484375,3.85546875 Z M6.90625,13.5585938 L7.51367188,11.6816406 L8.74609375,12.8378906 L6.90625,13.5585938 Z M17.0175781,4.67773438 L15.3808594,3.09765625 L16.0175781,2.4375 L17.6542969,4.01757813 L17.0175781,4.67773438 Z" id="形状" fill="#666666"></path>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<template>
<div class="expand_image">
<el-image ref="previewImage" class="image" v-if="url" v-bind="$attrs" style="height: 100%;width: 100%;" :src="url"
:preview-src-list="[url]">
<!-- 透传所有普通插槽 -->
<template v-for="(_, name) in $slots" v-slot:[name]>
<slot :name="name" />
</template>
</el-image>
<div class="expand_image_icon">
<div @click="handleLook">
<slot name="icon"></slot>
</div>
</div>
</div>
</template>
<script type="text/javascript">
export default {
name: 'ExpandImage',
inheritAttrs: false,
props:{
/**
* 图片的 URL 地址
* @type {string}
* @default ''
*/
url: {
type: String,
default: ''
},
},
data() {
return {
}
},
methods: {
handleLook() {
this.$nextTick(() => {
this.$refs.previewImage.clickHandler();
});
}
},
created() {
console.log(this.url,'++++++++++++++++');
},
}
</script>
<style lang="scss" scoped>
.expand_image {
position: relative;
&:hover::after {
content: '';
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #000;
opacity: .3;
cursor: pointer;
}
.expand_image_icon {
visibility: hidden;
position: absolute;
display: flex;
top: 0;
left: 0;
width: 100%;
height: 100%;
justify-content: center;
align-items: center;
z-index: 1;
}
&:hover .expand_image_icon {
visibility: visible;
cursor: pointer;
}
}
</style>
\ No newline at end of file
<!--
# getRoleList 传入 member_id 获取角色列表
-->
<template>
<el-select v-model="selectedValue" placeholder="请选择" clearable size="small" :style="{ width: width || '100%' }"
v-bind="$attrs" :clearable="false" filterable remote :remote-method="remoteMethod" @clear="handleClear"
v-on="$listeners" @change="handleChange" @visible-change="handleVisibleChange">
<div class="select-dropdown" @scroll="handleScroll">
<el-option v-for="item in RuleList" :key="item.value" :label="item.label" :value="item.value"></el-option>
<div v-if="loading" v-loading="true" class="loading-more">
加载中...
</div>
</div>
</el-select>
</template>
<script lang="jsx">
import { getRoleHoLo } from '@/api/game'
import { debounce } from '@/utils'
export default {
name: 'getRoleList',
props: {
member_id: {
type: [String, Number],
default: ''
},
value: {
type: [String, Number],
default: ''
},
width: {
type: [String, Number],
default: ''
}
},
data() {
return {
RuleList: [],
loading: false,
currentPage: 1,
hasMore: true,
searchQuery: '',
selectedValue: this.value,
_debouncedRemote: null
}
},
watch: {
value(newVal) {
this.selectedValue = newVal
},
member_id(newVal) {
this.getRuleList()
}
},
created() {
this.getRuleList()
},
methods: {
async getRuleList(isLoadMore = false, query) {
// 仅在加载更多时受 hasMore 限制;新检索应始终允许
if (this.loading || (isLoadMore && !this.hasMore)) return
try {
this.loading = true
const keyword = typeof query === 'string' ? query : this.searchQuery
if (!isLoadMore) {
// 新检索时记录关键字
this.searchQuery = keyword || ''
}
const res = await getRoleHoLo({
page: isLoadMore ? this.currentPage + 1 : 1,
page_size: 20,
role_name: keyword,
search_type: 'list',
member_id: this.member_id
})
if (res.status_code === 1 && res.data && res.data.data) {
res.data.data.forEach(item => {
item.server_name ? item.label = `${item.role_name} - ${item.server_name}` : item.label = item.role_name
item.value = item.role_id
})
if (isLoadMore) {
this.RuleList = [...this.RuleList, ...res.data.data]
this.currentPage++
} else {
this.RuleList = res.data.data
this.currentPage = 1
}
this.hasMore = res.data.data.length >= 20
} else {
this.$message.warning(res.data.msg)
}
} catch (error) {
this.$message.error('获取数据失败')
} finally {
this.loading = false
}
},
handleScroll(e) {
const { scrollTop, scrollHeight, clientHeight } = e.target
if (scrollHeight - scrollTop - clientHeight < 50 && this.hasMore) {
this.getRuleList(true, this.searchQuery)
}
},
handleClear() {
this.selectedValue = ''
this.searchQuery = ''
this.$emit('clear')
},
handleChange() {
const roleInfo = this.RuleList.find(item => item.value === this.selectedValue)
this.$emit('selectChange', roleInfo)
},
handleVisibleChange(visible) {
// if (visible) {
// this.getRuleList()
// }
},
remoteMethod(query) {
if (!this._debouncedRemote) {
this._debouncedRemote = debounce((q) => {
this.getRuleList(false, q)
}, 300)
}
this._debouncedRemote(query)
}
}
}
</script>
<style lang="scss" scoped>
.select-dropdown {
max-height: 300px;
overflow-y: auto;
&::-webkit-scrollbar {
width: 6px;
}
&::-webkit-scrollbar-thumb {
background-color: #e4e7ed;
border-radius: 3px;
}
}
.loading-more {
text-align: center;
padding: 5px 0;
}
</style>
\ No newline at end of file
......@@ -13,6 +13,7 @@ Vue.use(ElementUI);
// import '@/styles/element-theme-colors.css';
import '@/styles/index.scss';
import moment from 'moment'
import '@/styles/tailwind.css'
import VConsole from 'vconsole';
import uploading from '@/utils/cos-upload'
import errorHandle from '@/utils/errorHandle'
......
......@@ -852,3 +852,8 @@ li {
.el-input__icon{
line-height: 1;
}
//弹框内容超出显示滚动
.el-message-box__message {
max-height: 500px !important;
overflow-y: auto !important;
}
\ No newline at end of file
@tailwind base;
@tailwind components;
@tailwind utilities;
<template>
<div class="violationRecord">
<el-form
v-loading="loading"
class="violationRecordContent"
label-width="90px"
>
<el-form v-loading="loading" class="violationRecordContent" label-width="90px">
<div v-if="violationList.length > 0">
<div
v-for="(item, index) in violationList"
:key="index"
class="contentItem"
>
<div v-for="(item, index) in violationList" :key="index" class="contentItem">
<el-form-item label="违规时间:">
<p>{{ item.violation_time }}</p>
</el-form-item>
......@@ -31,15 +23,9 @@
<el-form-item label="是否允许申诉:">
<p class="error">{{ item.appeal_name }}</p>
</el-form-item>
<el-form-item
v-if="item.remake != ''"
label="详情:"
>
<el-form-item v-if="item.remake != ''" label="详情:">
<!-- AI自动封禁 -->
<div
v-if="item.information_type === 6"
class="remarkType"
>
<div v-if="item.information_type === 6" class="remarkType">
<p>
<span class="label">所属项目:</span><span>{{ item.newRemake.project || "" }}</span>
</p>
......@@ -66,29 +52,16 @@
</p>
</div>
<!-- 其他类型 -->
<div
v-else
class="remarkType"
>
<div
v-if="item.remake.indexOf('src=') !== -1"
class="remakeImage"
>
<div v-else class="remarkType">
<div v-if="item.remake.indexOf('src=') !== -1" class="remakeImage">
<p class="watchDetails">
<el-button
type="text"
icon="el-icon-view"
size="medium"
<el-button type="text" icon="el-icon-view" size="medium"
style="z-index: 1; position: relative; margin-left: 5px"
@click="showRemake(item.remake)"
>查看大图</el-button>
@click="showRemake(item.remake)">查看大图</el-button>
</p>
<p class="remakeDetails" v-html="item.remake"></p>
</div>
<div
v-else
class="remakeImage"
>
<div v-else class="remakeImage">
<p class="remakeDetails" v-html="item.remake"></p>
</div>
</div>
......@@ -96,38 +69,14 @@
<!-- 命中统计表格 -->
<div v-if="item && item.newRemake && item.newRemake.hit">
<div
class="title"
style="font-weight: 600; margin-bottom: 10px"
>
<div class="title" style="font-weight: 600; margin-bottom: 10px">
命中统计
</div>
<el-table
:data="item.newRemake.hit"
size="medium"
style="width: 100%"
class="hit-statistics-table"
>
<el-table-column
prop="content"
label="文本内容"
show-overflow-tooltip
/>
<el-table-column
prop="type"
label="命中类型"
width="120"
/>
<el-table-column
prop="key"
label="关键字"
width="120"
show-overflow-tooltip
/>
<el-table-column
label="时间"
width="180"
>
<el-table :data="item.newRemake.hit" size="medium" style="width: 100%" class="hit-statistics-table">
<el-table-column prop="content" label="文本内容" show-overflow-tooltip />
<el-table-column prop="type" label="命中类型" width="120" />
<el-table-column prop="key" label="关键字" width="120" show-overflow-tooltip />
<el-table-column label="时间" width="180">
<template slot-scope="{ row }">
<span>{{ $moment(row.time).format("YYYY-MM-DD HH:mm:ss") }}</span>
</template>
......@@ -138,27 +87,14 @@
</div>
<!-- 无数据状态 -->
<div
v-if="!loading && violationList.length == 0"
class="noContent rowFlex allCenter"
>
<div v-if="!loading && violationList.length == 0" class="noContent rowFlex allCenter">
<noContent title="暂无数据" description="当前没有任何数据,请稍后再试或联系管理员" />
</div>
</el-form>
<!-- 查看大图弹窗 -->
<el-dialog
title="查看大图"
:visible.sync="imageLayer"
width="320px"
center
append-to-body
@close="imageLayer = false"
>
<div
v-html="imageSrc"
class="layerImage"
></div>
<el-dialog title="查看大图" :visible.sync="imageLayer" width="320px" center append-to-body @close="imageLayer = false">
<div v-html="imageSrc" class="layerImage"></div>
</el-dialog>
</div>
</template>
......@@ -274,7 +210,8 @@ export default {
border-bottom: 1px dashed #ebeef5;
margin-bottom: 20px;
padding-bottom: 20px;
::v-deep .el-form-item__label{
::v-deep .el-form-item__label {
line-height: 40px;
}
......@@ -362,6 +299,7 @@ export default {
.remakeDetails {
word-break: break-all;
::v-deep img {
max-width: 200px;
max-height: 200px;
......
<!--
* @Author: maoxiya 937667504@qq.com
* @Date: 2025-06-25 16:46:39
* @LastEditors: maoxiya 937667504@qq.com
* @LastEditTime: 2025-09-02 15:38:31
* @FilePath: /company_app/src/views/applyRecord.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<div class="gift-tab-container-errorHanledle">
<el-tabs v-model="activeTab">
<el-tab-pane label="举报记录" name="report">
<report v-if="activeTab === 'report'" />
</el-tab-pane>
<el-tab-pane label="误操作" name="errorHandle">
<errorHandle v-if="activeTab=='errorHandle'"></errorHandle>
<errorHandle v-if="activeTab == 'errorHandle'"></errorHandle>
</el-tab-pane>
<el-tab-pane label="转区申请" name="serve">
<AreaTransferApply v-if="activeTab=='serve'" />
<AreaTransferApply v-if="activeTab == 'serve'" />
</el-tab-pane>
<el-tab-pane label="转端申请" name="terminal">
<TerminalTransfer v-if="activeTab=='terminal'" />
<TerminalTransfer v-if="activeTab == 'terminal'" />
</el-tab-pane>
</el-tabs>
</div>
......@@ -17,43 +28,51 @@
import AreaTransferApply from './components/ApplyRecords/AreaTransferApply.vue'
import errorHandle from './components/ApplyRecords/errorHandle.vue'
import TerminalTransfer from './components/ApplyRecords/TerminaTranfer.vue'
import report from './components/roleInfo/report.vue'
export default {
name: 'applyRecord',
components: {
AreaTransferApply,
errorHandle,
TerminalTransfer
TerminalTransfer,
report
},
data() {
return {
activeTab: 'errorHandle'
activeTab: 'report'
}
}
}
</script>
<style lang="scss" scoped>
.gift-tab-container-errorHanledle {
<style lang="scss" scoped>
.gift-tab-container-errorHanledle {
//padding: 20px;
width: 100%;
height: 100%;
padding-top: 10px;
background: #fff;
::v-deep .el-tabs{
::v-deep .el-tabs {
height: calc(100% - 40px);
}
::v-deep .el-tabs__content{
::v-deep .el-tabs__content {
height: 100%;
}
::v-deep .el-tab-pane{
::v-deep .el-tab-pane {
height: 100%;
}
::v-deep .el-tabs .el-tabs__header{
::v-deep .el-tabs .el-tabs__header {
margin: 0;
// height: 60px;
}
::v-deep .el-tabs__nav-next, ::v-deep .el-tabs__nav-prev{
::v-deep .el-tabs__nav-next,
::v-deep .el-tabs__nav-prev {
line-height: 50px;
}
}
</style>
\ No newline at end of file
}
</style>
\ No newline at end of file
......@@ -37,11 +37,12 @@
<div class="terminaItemRight columnFlex columnCenter">
<el-button v-if="item.approval_status == 4 && item.related_request_id == 0" type="primary" size="mini"
style="margin-bottom:15px;" @click.stop="resubmitApproval(item)">重新提交</el-button>
<img v-if="item.approval_status == 1" :src="shenpi1" class="icon" />
<img v-else-if="item.approval_status == 2" :src="shenpi2" class="icon" />
<img v-else-if="item.approval_status == 3" :src="shenpi3" class="icon" />
<img v-else-if="item.approval_status == 4" :src="shenpi4" class="icon" />
<img v-else-if="item.approval_status == 5" :src="shenpi5" class="icon" />
<!-- 改成 svg-icon 图标 -->
<svg-icon v-if="item.approval_status == 1" icon-class="shenpi1" class="icon" />
<svg-icon v-else-if="item.approval_status == 2" icon-class="shenpi2" class="icon" />
<svg-icon v-else-if="item.approval_status == 3" icon-class="shenpi3" class="icon" />
<svg-icon v-else-if="item.approval_status == 4" icon-class="shenpi4" class="icon" />
<svg-icon v-else-if="item.approval_status == 5" icon-class="shenpi5" class="icon" />
</div>
</div>
<!-- 审批进度 -->
......
<template>
<el-drawer
title="新增关联账号"
:visible="show"
size="360px"
:append-to-body="true"
@close="close"
>
<el-drawer title="新增关联账号" :visible="show" size="360px" :append-to-body="true" @close="close">
<div class="content">
<el-form
ref="form"
:model="form"
label-position="top"
:rules="rules"
label-width="120px"
>
<el-form ref="form" :model="form" label-position="top" :rules="rules" label-width="120px">
<div class="inputContent">
<el-form-item
label="请输入w账号"
prop="username"
>
<el-input
v-model.trim="form.username"
placeholder="请输入w账号"
class="input-with-select"
>
<el-form-item label="请输入w账号" prop="username">
<el-input v-model.trim="form.username" placeholder="请输入w账号" class="input-with-select">
</el-input>
</el-form-item>
<el-form-item
label="请输入主游戏名"
prop="main_game_id"
>
<el-select
v-model="form.main_game_id"
filterable
remote
clearable
reserve-keyword
placeholder="请输入主游戏名"
style="width: 100%;"
:remote-method="remoteMethod"
:loading="loading"
@focus="gameNameList=optionsList"
>
<el-option
v-for="item in gameNameList"
:key="item.value"
:label="item.label"
:value="item.value"
>
<el-form-item label="请输入主游戏名" prop="main_game_id">
<el-select v-model="form.main_game_id" filterable remote clearable reserve-keyword placeholder="请输入主游戏名"
style="width: 100%;" :remote-method="remoteMethod" :loading="loading" @focus="gameNameList = optionsList">
<el-option v-for="item in gameNameList" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item
label="请输入区服"
prop="server_info"
>
<el-select
v-model.trim="form.server_info"
filterable
remote
:disabled="form.main_game_id==''"
clearable
style="width: 100%;"
reserve-keyword
placeholder="请先选择主游戏"
:remote-method="remoteMethodServer"
:loading="loading"
>
<el-option
v-for="item in serverNameList"
:key="item.id"
:label="item.label"
:value="item.value"
>
<el-form-item label="请输入区服" prop="server_info">
<el-select v-model.trim="form.server_info" filterable remote :disabled="form.main_game_id == ''" clearable
style="width: 100%;" reserve-keyword placeholder="请先选择主游戏" :remote-method="remoteMethodServer"
:loading="loading">
<el-option v-for="item in serverNameList" :key="item.id" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item
label="请输入角色名"
prop="role_name"
>
<el-input
v-model.trim="form.role_name"
placeholder="请输入角色"
class="input-with-select"
>
<el-form-item label="请输入角色名" prop="role_name">
<el-input v-model.trim="form.role_name" placeholder="请输入角色" class="input-with-select">
</el-input>
</el-form-item>
<el-form-item>
<el-button
type="primary"
size="small"
@click="onSubmit"
>搜索</el-button>
<el-button type="primary" size="small" @click="onSubmit">搜索</el-button>
</el-form-item>
</div>
</el-form>
......@@ -100,24 +35,16 @@
<div class="bind-account-title">
账号列表
</div>
<userTable
:list="tableList"
@checkedTag="checkedTag"
/>
<userTable :list="tableList" @checkedTag="checkedTag" />
</div>
<!-- <div class="line"></div> w92865226508-->
<div
v-if="userDetails.username"
class="account_select_userInfo"
>
<div v-if="userDetails.username" class="account_select_userInfo">
<div class="bind-account-title" style="margin-top: 20px;">
账号详情
</div>
<div class="item rowFlex columnCenter"><span class="label">账号</span>
<p class="text">{{ userDetails.username }}</p> <span
v-if="userDetails.account_type==2"
class="account_type"
></span>
<p class="text">{{ userDetails.username }}</p> <span v-if="userDetails.account_type == 2"
class="account_type"></span>
</div>
<div class="item rowFlex columnCenter"><span class="label">获客渠道</span>
<p class="text">{{ userDetails.channel_name }}</p>
......@@ -141,10 +68,10 @@
<p class="text">{{ userDetails.mobile }}</p>
</div>
<div class="item rowFlex columnCenter"><span class="label">染色时间</span>
<p class="text">{{ moment( userDetails.seq_time * 1000).format('YYYY-MM-DD') }}</p>
<p class="text">{{ moment(userDetails.seq_time * 1000).format('YYYY-MM-DD') }}</p>
</div>
<div class="item rowFlex columnCenter"><span class="label">注册时间</span>
<p class="text">{{ moment( userDetails.reg_time * 1000).format('YYYY-MM-DD') }}</p>
<p class="text">{{ moment(userDetails.reg_time * 1000).format('YYYY-MM-DD') }}</p>
</div>
<div class="item rowFlex columnCenter"><span class="label">登录系统</span>
<p class="text">{{ userDetails.last_login_os }}</p>
......@@ -157,29 +84,16 @@
</div>
</div>
</div>
<page
class="pageInfo"
:page-info="pageInfo"
@requestNextPage="requestNextPage"
/>
<page class="pageInfo" :page-info="pageInfo" @requestNextPage="requestNextPage" />
<span class="dialog-footer rowFlex">
<el-button
class="btn"
type="primary"
size="small"
:disabled="!userDetails.id"
@click="confirmSubmit"
>确 定</el-button>
<el-button
class="btn"
size="small"
@click="close"
>取 消</el-button>
<el-button class="btn" type="primary" size="small" :disabled="!userDetails.id" @click="confirmSubmit">
</el-button>
<el-button class="btn" size="small" @click="close">取 消</el-button>
</span>
</el-drawer>
</template>
</template>
<script type="text/javascript">
<script type="text/javascript">
import moment from 'moment'
import userTable from './userTable.vue'
import { getRoleHoLo, memberView, selectSearch } from '@/api/game'
......@@ -419,32 +333,37 @@
}
</script>
<style lang="scss" scoped>
::v-deep .el-drawer {
<style lang="scss" scoped>
::v-deep .el-drawer {
height: 100%;
overflow: auto;
}
.bind-account-title{
}
.bind-account-title {
font-size: 16px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 600;
color: #333333;
text-align: left;
margin-bottom: 10px;
}
.content {
}
.content {
width: 100%;
height: 100%;
overflow: auto;
padding-bottom: 200px;
padding: 0 10px;
.inputContent {
width: 100%;
}
.info {
width: 100%;
margin-top: 30px;
overflow: auto;
.table {
width: 100%;
min-width: 500px;
......@@ -460,15 +379,18 @@
height: 70%;
border-right: 1px dashed #e0e0e0;
}
.account_select_userInfo {
width: 100%;
height: auto;
padding-left: 20px;
margin-top: -20px;
margin-bottom: 150px;
.item {
width: 100%;
margin-top: 20px;
.label {
width: 30%;
font-size: 14px;
......@@ -478,6 +400,7 @@
text-align: left;
margin-right: 20px;
}
.text {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
......@@ -488,29 +411,33 @@
}
}
}
.account_table{
}
.account_table {
width: 100%;
height: auto;
overflow: auto;
}
.account_type {
}
.account_type {
color: #f56c6c;
font-weight: bold;
margin-left: 5px;
background: #f7eded;
padding: 2px 5px;
border-radius: 3px;
}
.pageInfo {
}
.pageInfo {
width: calc(100% - 20px);
height: 82px;
position: absolute;
right: 20px;
bottom: 60px;
background: #fff;
}
.dialog-footer {
}
.dialog-footer {
width: calc(100% - 20px);
position: absolute;
right: 20px;
......@@ -521,16 +448,15 @@
justify-content: flex-end;
background: #fff;
z-index: 10;
.btn {
width: 84px;
height: 32px;
}
}
</style>
<style>
::v-deep .el-select-dropdown {
}
</style>
<style>
::v-deep .el-select-dropdown {
min-width: 210px !important;
}
</style>
\ No newline at end of file
}
</style>
\ No newline at end of file
......@@ -3,10 +3,14 @@
<div ref="giftList" class="gift-list" @scroll="handleScroll">
<div v-for="item in giftList" :key="item._id" class="gift-item">
<div class="gift-info">
<div v-if="item.gift_package_group_name ">分组: {{ item.gift_package_group_name }}</div>
<div v-if="item.gift_package_group_name">分组: {{ item.gift_package_group_name }}</div>
<div>礼包名称: {{ item.gift_package_name }}</div>
<div>发送时间: {{ item.send_time }}</div>
<div>礼包码: {{ item.code }}</div>
<div>领取角色: <span v-if="item.role_name && item.role_name != 0">{{ item.role_name }}</span> <span
v-else>-</span>
</div>
<div>W 账号: {{ item.username || '-' }}</div>
<div class="rowFlex spaceBetween columnCenter gift-sender">
<div>发送客服: {{ item.cser_name }}</div>
<i class="el-icon-document-copy" style="cursor: pointer;" @click="handleCopy(item.code)"></i>
......@@ -16,18 +20,17 @@
<div v-if="loading" class="loading-more">加载中...</div>
<div v-if="!hasMore && giftList.length > 0" class="no-more">没有更多数据了</div>
<div v-if="giftList.length == 0" class="noContent rowFlex allCenter">
<noContent/>
<noContent />
</div>
</div>
</div>
</template>
<script>
</template>
<script>
import Clipboard from 'clipboard'
import { getSendingCodeList } from '@/api/works'
import { debounce,copyText,sendChatMessage } from '@/utils/index'
import { mapState } from 'vuex'
export default {
import { getSendingCodeList } from '@/api/works'
import { debounce, copyText, sendChatMessage } from '@/utils/index'
import { mapState } from 'vuex'
export default {
name: 'wxGift',
data() {
return {
......@@ -69,7 +72,7 @@ import Clipboard from 'clipboard'
this.loading = false
}
},
handleScroll: debounce(function(e) {
handleScroll: debounce(function (e) {
const { scrollHeight, scrollTop, clientHeight } = e.target
if (scrollHeight - scrollTop - clientHeight < 50) {
this.fetchGiftList()
......@@ -87,11 +90,11 @@ import Clipboard from 'clipboard'
// })
}
}
}
</script>
}
</script>
<style lang="scss" scoped>
.wx-gift-container {
<style lang="scss" scoped>
.wx-gift-container {
height: 100%;
width: 100%;
background-color: #fff;
......@@ -106,11 +109,13 @@ import Clipboard from 'clipboard'
background: #F7F8FA;
border-radius: 12px;
border: 1px solid #E5E6EB;
margin-bottom:12px;
margin-bottom: 12px;
.gift-info {
div{
div {
line-height: 26px;
}
.gift-name {
font-weight: 400;
font-size: 14px;
......@@ -118,6 +123,7 @@ import Clipboard from 'clipboard'
text-align: left;
font-style: normal;
}
.gift-code {
display: flex;
align-items: center;
......@@ -129,6 +135,7 @@ import Clipboard from 'clipboard'
color: #323335;
text-align: justify;
font-style: normal;
span {
color: #323335;
font-size: 14px;
......@@ -158,7 +165,8 @@ import Clipboard from 'clipboard'
line-height: 18px;
text-align: justify;
font-style: normal;
i{
i {
color: #00BF8A;
font-size: 14px;
}
......@@ -175,5 +183,5 @@ import Clipboard from 'clipboard'
font-size: 13px;
}
}
}
</style>
\ No newline at end of file
}
</style>
\ No newline at end of file
<template>
<el-select
v-model="resulte"
v-loadmore="loadMoreList"
filterable
remote
:disabled="disabled"
:remote-method="remoteMethod"
:placeholder="placeholder"
:clearable='false'
reserve-keyword
:loading="loading"
@change="selectChange"
>
<el-option
v-for="(item,index) in searchUserOption"
:key="index"
:value="item.role_id || item.id"
:label="item.role_name"
style="height:50px;"
>
<el-select v-model="resulte" v-loadmore="loadMoreList" filterable remote :disabled="disabled"
:remote-method="remoteMethod" :placeholder="placeholder" :clearable='false' reserve-keyword :loading="loading"
@change="selectChange">
<el-option v-for="(item, index) in searchUserOption" :key="index" :value="item?.role_id || item.id"
:label="item.role_name" style="height:50px;">
<div class="rowFlex columnCenter selectItem">
<!-- 没有头像 -->
<!-- <el-image v-if="item.avata" fit="fill" :src="item.avatar" class="tableImage "></el-image> -->
<div class="infoSpan columnFlex rowCenter">
<p class="hidden">{{ item.role_name &&item.role_name!=''?item.game_name+' - '+item.server_name+' - '+item.role_name:'' }}</p>
<p class="rowFlex columnCenter">角色名:<label class="hidden" style="max-width:120px;">{{ item.role_name }}</label></p>
<p class="hidden">
{{ item.role_name && item.role_name != '' ? item.game_name + ' - ' + item.server_name + ' -
'+item.role_name:'' }}
</p>
<p class="rowFlex columnCenter">角色名:<label class="hidden" style="max-width:120px;">
{{ item.role_name }}
</label>
</p>
</div>
</div>
</el-option>
</el-select>
</template>
<script>
</template>
<script>
import { roleList } from '@/api/game'
import { mapState } from 'vuex'
export default {
......@@ -128,28 +119,33 @@
}
</script>
<style lang="scss" scoped>
.selectItem{
<style lang="scss" scoped>
.selectItem {
height: 50px;
}
.infoSpan{
}
.infoSpan {
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
max-width: 250px;
height: 50px;
p{
font-size:12px;max-width:100%;
p {
font-size: 12px;
max-width: 100%;
line-height: 20px;
}
span{
color:#FFA81D;
}
span {
color: #FFA81D;
}
.tableImage{
width:30px;height:30px;
}
.tableImage {
width: 30px;
height: 30px;
border-radius: 30px;
margin-right: 10px;
}
</style>
\ No newline at end of file
}
</style>
\ No newline at end of file
<!--
* @Author: maoxiya 937667504@qq.com
* @Date: 2025-08-28 15:59:46
* @LastEditors: maoxiya 937667504@qq.com
* @LastEditTime: 2025-09-02 09:51:24
* @FilePath: /company_wx_frontend/src/views/works/component/chat/giftCodeDialog.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<el-dialog title="请确认发放的角色" :visible="dialogVisible" class="giftCodeDialogForm" width="360px" @close="closeDialog">
<p class="font12 mb-[10px] mt-[-10px]">即将发送召回礼包<span v-if="gameName" style="color: #00BF8A;"> ({{ gameName
}})</span>,发送后可在礼包记录中查看</p>
<el-form :model="form" ref="giftCodeDialogForm" label-width="80px" :rules="rules">
<el-form-item label="账号ID:" prop="member_id">
<el-select style="width: 320px;" :clearable="false" @change="handleMemberIdChange"
v-model="form.member_id" placeholder="请选择账号ID">
<el-option v-for="item in bindGameUserList" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="角色ID:" prop="role_id">
<getRoleList v-model="form.role_id" width="320px" placeholder="请选择角色" :member_id="form.member_id"
@selectChange="handleSelectionChange" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button size="mini" @click="closeDialog">取消</el-button>
<el-button type="primary" size="mini" @click="getGiftCodeSubmit('send')">确定</el-button>
<el-button type="text" size="mini" @click="getGiftCodeSubmit('copy')">仅复制</el-button>
</div>
</el-dialog>
</template>
<script>
import getRoleList from '@/components/getRoleList.vue'
import { getRoleHoLo } from '@/api/game'
import { mapState } from 'vuex'
export default {
props: {
dialogVisible: {
type: Boolean,
default: false
},
gameName: {
type: String,
default: ''
}
},
components: {
getRoleList
},
data() {
return {
form: {
member_id: '',
username: '',
role_id: '',
role_name: '',
},
rules: {
member_id: [{ required: true, message: '请选择账号ID', trigger: 'change' }],
role_id: [{ required: true, message: '请选择角色ID', trigger: 'change' }]
},
getRoleHoLo: getRoleHoLo,
gift_code: [],
roleList: [],
pageInfo: {
page: 1,
page_size: 10
},
loading: false
}
},
mounted() {
this.form.member_id = this.accountSelect
this.form.username = this.bindGameUserList.find(item => item.member_id === this.accountSelect).username
},
computed: {
...mapState('game', ['accountSelect', 'bindGameUserList'])
},
methods: {
handleMemberIdChange(value) {
this.form.role_id = ''
this.form.role_name = ''
const userInfo = this.bindGameUserList.find(item => item.value === value)
this.form.username = userInfo.label || userInfo.username
this.form.member_id = value
},
handleSelectionChange(roleInfo) {
console.log(roleInfo, 'roleInfo')
this.form.role_name = roleInfo.label || ''
},
closeDialog() {
this.$emit('update:dialogVisible', false)
},
getGiftCodeSubmit(type) {
this.$refs.giftCodeDialogForm.validate((valid) => {
if (valid) {
this.$emit('update:dialogVisible', false)
this.$emit('result', this.form, type)
}
})
}
}
}
</script>
<style lang="scss" scoped>
.giftCodeDialogForm {
.dialog-footer {
border: none;
padding: 0;
}
::v-deep .el-input__inner {
font-size: 14px;
width: 240px;
}
::v-deep .el-form-item__label {
line-height: 40px;
}
}
</style>
\ No newline at end of file
......@@ -12,14 +12,15 @@
<!-- 转端 -->
<el-collapse v-if="activeName == '1' && conversionGameList.length > 0" :disabled="disabled"
@change="conversionChangeOld">
<el-collapse-item v-for="(item, index) in conversionGameList" :key="index" :name="item.game_type">
<el-collapse-item class="mb-[10px]" v-for="(item, index) in conversionGameList" :key="index"
:name="item.game_type">
<template slot="title">
<div class="title-with-icon">
<img v-if="item.game_type == 1" src="@/assets/icon/svg/wxgame.svg" class="game-icon" alt="微信小游戏">
<img v-else-if="item.game_type == 5" src="@/assets/icon/svg/douyin.svg" class="game-icon" alt="抖音小游戏">
<img v-else-if="item.game_type == 3" src="@/assets/icon/svg/Android.svg" class="game-icon" alt="安卓游戏">
<img v-else-if="item.game_type == 4" src="@/assets/icon/svg/IOS.svg" class="game-icon" alt="IOS游戏">
<img v-else-if="item.game_type == 2" src="@/assets/icon/svg/H5.svg" class="game-icon" alt="H5游戏">
<svg-icon v-if="item.game_type == 1" icon-class="wxgame" class="game-icon" />
<svg-icon v-else-if="item.game_type == 5" icon-class="douyin" class="game-icon" />
<svg-icon v-else-if="item.game_type == 3" icon-class="Android" class="game-icon" />
<svg-icon v-else-if="item.game_type == 4" icon-class="IOS" class="game-icon" />
<svg-icon v-else-if="item.game_type == 2" icon-class="H5" class="game-icon" />
{{ item.game_text }}
</div>
</template>
......@@ -62,11 +63,11 @@
<el-collapse-item v-for="(item, index) in recallGameList" :key="index" :name="item.game_type">
<template slot="title">
<div class="title-with-icon">
<img v-if="item.game_type == 1" src="@/assets/icon/svg/wxgame.svg" class="game-icon" alt="微信小游戏">
<img v-else-if="item.game_type == 5" src="@/assets/icon/svg/douyin.svg" class="game-icon" alt="抖音小游戏">
<img v-else-if="item.game_type == 3" src="@/assets/icon/svg/Android.svg" class="game-icon" alt="安卓游戏">
<img v-else-if="item.game_type == 4" src="@/assets/icon/svg/IOS.svg" class="game-icon" alt="IOS游戏">
<img v-else-if="item.game_type == 2" src="@/assets/icon/svg/H5.svg" class="game-icon" alt="H5游戏">
<svg-icon v-if="item.game_type == 1" icon-class="wxgame" class="game-icon" />
<svg-icon v-else-if="item.game_type == 5" icon-class="douyin" class="game-icon" />
<svg-icon v-else-if="item.game_type == 3" icon-class="Android" class="game-icon" />
<svg-icon v-else-if="item.game_type == 4" icon-class="IOS" class="game-icon" />
<svg-icon v-else-if="item.game_type == 2" icon-class="H5" class="game-icon" />
{{ item.game_text }}
</div>
</template>
......@@ -106,17 +107,14 @@
<el-collapse-item v-for="(item, index) in regGameList" :key="index" :name="item.label">
<template slot="title">
<div class="title-with-icon">
<img v-if="item.label.includes('微信')" src="@/assets/icon/svg/wxgame.svg" class="game-icon"
alt="微信小游戏">
<img v-else-if="item.label.includes('抖音')" src="@/assets/icon/svg/douyin.svg" class="game-icon"
alt="抖音小游戏">
<img v-else-if="item.label.includes('安卓')" src="@/assets/icon/svg/Android.svg" class="game-icon"
alt="安卓游戏">
<img
<svg-icon v-if="item.label.includes('微信')" icon-class="wxgame" class="game-icon" />
<svg-icon v-else-if="item.label.includes('抖音')" icon-class="douyin" class="game-icon" />
<svg-icon v-else-if="item.label.includes('安卓')" icon-class="Android" class="game-icon" />
<svg-icon
v-else-if="item.label.includes('IOS') || item.label.includes('iOS') || item.label.includes('ios')"
src="@/assets/icon/svg/IOS.svg" class="game-icon" alt="IOS游戏">
<img v-else-if="item.label.includes('H5') || item.label.includes('h5')" src="@/assets/icon/svg/H5.svg"
class="game-icon" alt="H5游戏">
icon-class="IOS" class="game-icon" />
<svg-icon v-else-if="item.label.includes('H5') || item.label.includes('h5')" icon-class="H5"
class="game-icon" />
{{ item.label }}
</div>
</template>
......
......@@ -46,7 +46,7 @@
</el-popover>
</p>
<el-button size="mini" type="primary" :loading="loading"
@click="sendGameCode(items)">发送礼包码</el-button>
@click="sendGameCodeCopyDialog(items)">发送礼包码</el-button>
</div>
</div>
</div>
......@@ -58,12 +58,15 @@
</el-collapse>
</el-collapse-transition>
</div>
<giftCodeDialog v-if="dialogVisible" :game-name="game_name" :dialogVisible.sync="dialogVisible"
@result="getGiftCodeSubmit" />
</div>
</template>
<script>
import { mapState, mapMutations } from 'vuex'
import { passwardEncryption, createVipUrl } from '@/api/game'
import { giftCodeList, sendGiftCode, getZyouAuthLink } from '@/api/works'
import giftCodeDialog from './giftCodeDialog.vue'
export default {
name: 'vipTools',
data() {
......@@ -71,12 +74,33 @@ export default {
disabled: true,
showGameCode: false,
giftCodeGame: [],
dialogVisible: false,
game_name: '',
giftCodeForm: {
member_id: '',
username: '',
role_name: '',
role_id: '',
gift_package_id: '',
},
loading: false
}
},
components: {
giftCodeDialog
},
mounted() {
this.requestGiftCode()
},
destroyed() {
this.giftCodeForm = {
member_id: '',
username: '',
role_name: '',
role_id: '',
gift_package_id: ''
}
},
computed: {
...mapState('game', ['accountSelect', 'bindGameUserList', 'chatUserInfo']),
...mapState('user', ['userid']),
......@@ -94,6 +118,16 @@ export default {
}
},
methods: {
initGiftCodeForm() {
const username = this.bindGameUserList.find(item => item.member_id === this.accountSelect).username
this.giftCodeForm = {
member_id: this.accountSelect,
username: username,
role_name: '',
role_id: '',
gift_package_id: '',
}
},
sendVipGift() {
if (this.bindGameUserList.length > 0) {
createVipUrl({ member_id: this.accountSelect }).then(res => {
......@@ -107,6 +141,7 @@ export default {
this.$message.warning('请先关联游戏账号')
}
},
sendChatMessage(content, type) {
let message = {}
if (type == 'text') {
......@@ -192,14 +227,36 @@ export default {
item.group_name = item.gift_package_group_name
})
},
// 发送渠道
// 确定提交
getGiftCodeSubmit(form) {
const { member_id, role_id, username, role_name } = form
this.giftCodeForm.username = username
this.giftCodeForm.role_name = role_name
this.giftCodeForm.member_id = member_id
this.giftCodeForm.role_id = role_id
this.sendGameCode()
},
sendGameCodeCopyDialog(items) {
this.game_name = items.name
this.initGiftCodeForm()
this.giftCodeForm.gift_package_id = items.id
if (items.package_type == 3) {
this.dialogVisible = true
} else {
this.sendGameCode()
}
},
// 发送礼包码
async sendGameCode(items) {
this.loading = true
const data = {
userid: this.chatUserInfo.userid,
external_userid: this.chatUserInfo.external_userid,
member_id: this.accountSelect,
gift_package_id: items.id,
member_id: this.giftCodeForm.member_id,
username: this.giftCodeForm.username,
role_name: this.giftCodeForm.role_name,
role_id: this.giftCodeForm.role_id,
gift_package_id: this.giftCodeForm.gift_package_id,
user_type: 1
}
const res = await sendGiftCode(data)
......
......@@ -75,11 +75,11 @@
size="mini" style="margin-bottom:15px;" @click.stop="handleReport(item)">撤销</el-button>
<el-button v-else-if="item.approval_status == 4" type="primary" size="mini" style="margin-bottom:15px;"
@click.stop="resubmitApproval(item)">重新提交</el-button>
<img v-if="item.approval_status == 1" :src="shenpi1" class="icon" />
<img v-else-if="item.approval_status == 2" :src="shenpi2" class="icon" />
<img v-else-if="item.approval_status == 3" :src="shenpi3" class="icon" />
<img v-else-if="item.approval_status == 4" :src="shenpi4" class="icon" />
<img v-else-if="item.approval_status == 5" :src="shenpi5" class="icon" />
<svg-icon v-if="item.approval_status == 1" icon-class="shenpi1" class="icon" />
<svg-icon v-else-if="item.approval_status == 2" icon-class="shenpi2" class="icon" />
<svg-icon v-else-if="item.approval_status == 3" icon-class="shenpi3" class="icon" />
<svg-icon v-else-if="item.approval_status == 4" icon-class="shenpi4" class="icon" />
<svg-icon v-else-if="item.approval_status == 5" icon-class="shenpi5" class="icon" />
</div>
</div>
<!-- 审批进度 -->
......
<template>
<div class="reportList">
<el-form ref="taskForm" :model="reportForm" class="taskForm" label-position="top" label-width="85px">
<div class="reportList" v-scroll="paperScroll">
<el-form
ref="taskForm"
:model="reportForm"
class="taskForm"
label-position="top"
label-width="85px"
>
<el-form-item label="角色名称">
<el-input v-model="reportForm.role_name" clearable placeholder="请输入角色名称" @change="filterChange">
<el-input
v-model="reportForm.role_name"
clearable
placeholder="请输入角色名称"
@change="filterChange"
>
</el-input>
</el-form-item>
<el-form-item label="审批状态">
<el-select v-model="reportForm.approval_status" style="width:100%;" clearable placeholder="请选择审批状态"
@change="filterChange">
<el-option v-for="item in approvalList" :key="item.value" :label="item.label" :value="item.value">
<el-select
v-model="reportForm.approval_status"
style="width: 100%"
clearable
placeholder="请选择审批状态"
@change="filterChange"
>
<el-option
v-for="item in approvalList"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="申请方式">
<el-select v-model="reportForm.register_type" style="width:100%;" clearable placeholder="请选择申请方式"
@change="filterChange">
<el-option v-for="item in register_type_list" :key="item.value" :label="item.label" :value="item.value">
<el-select
v-model="reportForm.register_type"
style="width: 100%"
clearable
placeholder="请选择申请方式"
@change="filterChange"
>
<el-option
v-for="item in register_type_list"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
<div v-infinite-scroll="paperScroll" :infinite-scroll-disabled="!isMoreRecord" :infinite-scroll-immediate="false"
class="mailListScroll">
<div
:infinite-scroll-disabled="!isMoreRecord"
:infinite-scroll-immediate="false"
class="mailListScroll"
>
<!-- 举报申请 -->
<div class="scrollMain" v-if="reportList.length > 0">
<div v-for="(item, index) in reportList" :key="index" class="reportContent" @click="reportProcess(item, index)">
<div
v-for="(item, index) in reportList"
:key="index"
class="reportContent"
@click="reportProcess(item, index)"
>
<div class="reportItem rowFlex spaceBetween columnCenter">
<div class="reportItemLeft">
<p><span class="label">角色名称:</span><span class="value">{{ item.role_name }}</span></p>
<p>
<span class="label">累计充值:</span><span class="value">{{ formatNumber(item.recharge_total_amount) }}
</span>
<span class="label">角色名称:</span
><span class="value">{{ item.role_name }}</span>
</p>
<p>
<span class="label">近一周充值:</span><span class="value">{{ formatNumber(item.recharge_week_amount)
}}</span>
<span class="label">累计充值:</span
><span class="value"
>{{ formatNumber(item.recharge_total_amount) }}</span
>
</p>
<p>
<span class="label">近一周充值:</span
><span class="value"
>{{ formatNumber(item.recharge_week_amount) }}</span
>
</p>
<p>
<span class="label">违规操作:</span
><span class="value">{{ item.violation_type_text }}</span>
</p>
<p><span class="label">违规操作:</span><span class="value">{{ item.violation_type_text }}</span></p>
</div>
<div class="reportItemRight columnFlex columnCenter">
<!-- 撤销 当item.create_user_id == zq_user_id 的时候才可以撤销 只能撤销自己提交的审批 -->
<el-button v-if="item.approval_status == 1 && (item.create_user_id == cser_id)" type="primary" size="mini"
@click.stop="handleReport(item)">撤销</el-button>
<el-button
v-if="
item.approval_status == 1 && item.create_user_id == cser_id
"
type="primary"
size="mini"
@click.stop="handleReport(item)"
>撤销</el-button
>
<!-- 审批 只有待审批状态可以并且申请方式是玩家登记的时候才有这个 -->
<el-button
v-if="item.approval_status == 1 && reportForm.register_type == 2 && (item.customer_id == userInfo.id)"
type="primary" size="mini" @click.stop="resubmitReportApproval(item)">审批</el-button>
v-if="
item.approval_status == 1 &&
reportForm.register_type == 2 &&
item.customer_id == userInfo.id
"
type="primary"
size="mini"
@click.stop="resubmitReportApproval(item)"
>审批</el-button
>
<!-- 重新提交 -->
<el-button v-else-if="item.approval_status == 4" type="primary" size="mini"
@click.stop="resubmitReport(item)">重新提交</el-button>
<img v-if="item.approval_status == 1" :src="shenpi1" class="icon" />
<img v-else-if="item.approval_status == 2" :src="shenpi2" class="icon" />
<img v-else-if="item.approval_status == 3" :src="shenpi3" class="icon" />
<img v-else-if="item.approval_status == 4" :src="shenpi4" class="icon" />
<img v-else-if="item.approval_status == 5" :src="shenpi5" class="icon" />
<el-button
v-else-if="item.approval_status == 4"
type="primary"
size="mini"
@click.stop="resubmitReport(item)"
>重新提交</el-button
>
<!-- 换成 svg-icon 组件 -->
<svg-icon
v-if="item.approval_status == 1"
icon-class="shenpi1"
class="icon"
/>
<svg-icon
v-else-if="item.approval_status == 2"
icon-class="shenpi2"
class="icon"
/>
<svg-icon
v-else-if="item.approval_status == 3"
icon-class="shenpi3"
class="icon"
/>
<svg-icon
v-else-if="item.approval_status == 4"
icon-class="shenpi4"
class="icon"
/>
<svg-icon
v-else-if="item.approval_status == 5"
icon-class="shenpi5"
class="icon"
/>
</div>
</div>
<!-- 审批进度 -->
<el-collapse-transition>
<div v-if="item.showStep" class="reportProcessList">
<el-steps direction="vertical" :active="item.current" finish-status="success">
<el-step v-for="(items, indexs) in item.reportProcessList" :key="'trans_item_' + indexs"
:title="items.node_name">
<el-steps
direction="vertical"
:active="item.current"
finish-status="success"
>
<el-step
v-for="(items, indexs) in item.reportProcessList"
:key="'trans_item_' + indexs"
:title="items.node_name"
>
<template slot="description">
<div v-if="items" class="trans-follow-1 card-style">
<div class="follow-item">
......@@ -69,34 +166,77 @@
{{ items.node_sort !== '0' ? '审批人:' : '登记人:' }}
</span>
<span class="info-value value-font">
{{ Array.isArray(items.user_name) ? items.user_name[0] : items.user_name }}
{{
Array.isArray(items.user_name)
? items.user_name[0]
: items.user_name
}}
</span>
<el-tooltip v-if="Array.isArray(items.user_name) && items.user_name.length > 1" class="item"
effect="dark" :content="items.user_name.slice(1).join('、')" placement="top">
<el-tooltip
v-if="
Array.isArray(items.user_name) &&
items.user_name.length > 1
"
class="item"
effect="dark"
:content="items.user_name.slice(1).join('、')"
placement="top"
>
<span class="info-value value-font info-value-color">
{{ `+${items.user_name.length - 1}` }}
</span>
</el-tooltip>
</div>
<div v-if="items.node_sort !== '0' || items.node_name === '系统'" class="follow-item">
<div
v-if="
items.node_sort !== '0' || items.node_name === '系统'
"
class="follow-item"
>
<span class="follow-info-label label-font">
审批结果:
</span>
<span class="info-value value-font"
:class="[items.current < indexs ? '' : switchStateTag(items.approval_result)]">
{{ items.current < indexs ? '' : items.approval_result_text }} </span>
<span
class="info-value value-font"
:class="[
items.current < indexs
? ''
: switchStateTag(items.approval_result),
]"
>
{{
items.current < indexs
? ''
: items.approval_result_text
}}
</span>
</div>
<div class="follow-item">
<span class="follow-info-label label-font">
{{ items.node_sort !== '0' || items.node_name === '系统' ? '审批时间:' : '登记时间:' }}
{{
items.node_sort !== '0' ||
items.node_name === '系统'
? '审批时间:'
: '登记时间:'
}}
</span>
<span class="info-value value-font">
{{ items.node_sort === '0' ? items.create_time : items.update_time }}
{{
items.node_sort === '0'
? items.create_time
: items.update_time
}}
</span>
</div>
<div v-if="(items.node_sort !== '0' || items.node_name === '系统') && items.approval_result === '2'"
class="follow-item">
<div
v-if="
(items.node_sort !== '0' ||
items.node_name === '系统') &&
items.approval_result === '2'
"
class="follow-item"
>
<span class="follow-info-label label-font">
驳回原因:
</span>
......@@ -106,8 +246,17 @@
</div>
<div
v-if="items.node_sort === item.reportProcessList[item.reportProcessList.length - 1].node_sort + '' && items.approval_result === '1' && items.node_sort !== '0'"
class="follow-item-remark follow-item">
v-if="
items.node_sort ===
item.reportProcessList[
item.reportProcessList.length - 1
].node_sort +
'' &&
items.approval_result === '1' &&
items.node_sort !== '0'
"
class="follow-item-remark follow-item"
>
<span class="follow-info-label label-font">
处理结果:
</span>
......@@ -115,17 +264,35 @@
{{ items.extra_attribution.banned_text }}
</span>
</div>
<div v-if="items.node_sort === '0' && items.node_name !== '系统'" class="info-item-remark">
<div style="display: flex;">
<div
v-if="
items.node_sort === '0' && items.node_name !== '系统'
"
class="info-item-remark"
>
<div style="display: flex">
<span class="info-label remark-label">详情:</span>
<span class="preview-btn" @click.stop="previewRemark(items.extra_attribution.remark)">
<span
class="preview-btn"
@click.stop="
previewRemark(items.extra_attribution.remark)
"
>
<i class="el-icon-view"></i>
点击查看大图
</span>
</div>
<div class="remark-value"
v-html="formatImg(items.extra_attribution && items.extra_attribution.remark ? items.extra_attribution.remark : '')">
</div>
<div
class="remark-value"
v-html="
formatImg(
items.extra_attribution &&
items.extra_attribution.remark
? items.extra_attribution.remark
: ''
)
"
></div>
</div>
</div>
</template>
......@@ -139,49 +306,67 @@
<noContent />
</div>
</div>
<el-dialog :visible.sync="dialogRemarkVisible" append-to-body title="查看大图" custom-class="remake-dialog">
<el-dialog
:visible.sync="dialogRemarkVisible"
append-to-body
title="查看大图"
custom-class="remake-dialog"
>
<div class="remake-box">
<div v-html="dialogRemake"></div>
</div>
</el-dialog>
<!-- 重新提交 -->
<resubmitReport v-if="showResubmitReport" :report-info="reportInfo" :show.sync="showResubmitReport"
@updateReportList="filterChange" />
<resubmitReport
v-if="showResubmitReport"
:report-info="reportInfo"
:show.sync="showResubmitReport"
@updateReportList="filterChange"
/>
<!-- 审批 -->
<approvalTask v-if="isApproval" :show.sync="isApproval" :report-info="reportInfo"
@updateReportList="filterChange" />
<approvalTask
v-if="isApproval"
:show.sync="isApproval"
:report-info="reportInfo"
@updateReportList="filterChange"
/>
</div>
</template>
<script>
import { searchcondition, reportIndex, reportCancel, reportProcess } from '@/api/game'
import { mapState, mapMutations } from 'vuex'
import { removeDp, formatNumber, debounce } from '@/utils/index'
import resubmitReport from './layer/report.vue'
import approvalTask from './layer/approvalTask.vue'
import {
searchcondition,
reportIndex,
reportCancel,
reportProcess,
} from '@/api/game';
import { mapState, mapMutations } from 'vuex';
import { removeDp, formatNumber, debounce } from '@/utils/index';
import resubmitReport from './layer/report.vue';
import approvalTask from './layer/approvalTask.vue';
// 导入审批状态图标
import shenpi1 from '@/assets/icon/svg/shenpi1.svg'
import shenpi2 from '@/assets/icon/svg/shenpi2.svg'
import shenpi3 from '@/assets/icon/svg/shenpi3.svg'
import shenpi4 from '@/assets/icon/svg/shenpi4.svg'
import shenpi5 from '@/assets/icon/svg/shenpi5.svg'
import noContent from '@/components/noContent.vue'
import shenpi1 from '@/assets/icon/svg/shenpi1.svg';
import shenpi2 from '@/assets/icon/svg/shenpi2.svg';
import shenpi3 from '@/assets/icon/svg/shenpi3.svg';
import shenpi4 from '@/assets/icon/svg/shenpi4.svg';
import shenpi5 from '@/assets/icon/svg/shenpi5.svg';
import noContent from '@/components/noContent.vue';
export default {
name: 'report',
computed: {
...mapState('game', ['accountSelect']),
...mapState('user', ['cser_id', 'cser_name'])
...mapState('user', ['cser_id', 'cser_name']),
},
watch: {
accountSelect(newVal, oldVal) {
if (newVal && newVal !== "" && newVal !== oldVal) {
this.filterChange()
}
if (newVal && newVal !== '' && newVal !== oldVal) {
this.filterChange();
}
},
},
components: {
resubmitReport,
approvalTask,
noContent
noContent,
},
data() {
return {
......@@ -198,17 +383,17 @@ export default {
username: '',
role_name: '',
register_type: 1,
approval_status: ''
approval_status: '',
},
isApproval: false,
register_type_list: [
{ value: 2, label: '玩家登记' },
{ value: 1, label: '客服登记' }
{ value: 1, label: '客服登记' },
],
reportInfo: {},
pageInfo: {
page: 1,
page_size: 20
page_size: 20,
},
showResubmitReport: false,
reportList: [],
......@@ -217,148 +402,154 @@ export default {
dialogRemarkVisible: false,
dialogRemake: '',
formatNumber: formatNumber,
taskTypeList: []
}
taskTypeList: [],
};
},
mounted() {
// this.request_register_type()
this.requstApprovalList()
this.filterChange()
this.requstApprovalList();
this.filterChange();
},
methods: {
resubmitReport(item) {
this.reportInfo = item
this.showResubmitReport = true
this.reportInfo = item;
this.showResubmitReport = true;
},
// 审批
resubmitReportApproval(item) {
this.reportInfo = item
this.isApproval = true
this.reportInfo = item;
this.isApproval = true;
},
filterChange() {
this.pageInfo.page = 1
this.reportList = []
this.isMoreRecord = true
this.reportIndex()
this.pageInfo.page = 1;
this.reportList = [];
this.isMoreRecord = true;
this.reportIndex();
},
async requstApprovalList() {
const data = {
type: 'dictionaries',
table_name: 'zs_refund_request',
field_name: 'approval_status'
}
const res = await searchcondition(data)
field_name: 'approval_status',
};
const res = await searchcondition(data);
if (res.status_code === 1) {
this.approvalList = res.data.data
this.approvalList = res.data.data;
}
},
async request_register_type() {
const data = {
type: 'dictionaries',
table_name: 'zs_report_request',
field_name: 'register_type'
}
const res = await searchcondition(data)
field_name: 'register_type',
};
const res = await searchcondition(data);
if (res.status_code === 1) {
this.register_type_list = res.data.data
this.register_type_list = res.data.data;
}
},
previewRemark(remark) {
this.dialogRemake = remark
this.dialogRemarkVisible = true
this.dialogRemake = remark;
this.dialogRemarkVisible = true;
},
async reportProcess(item, index) {
console.log(item.current, 'item')
item.showStep = !item.showStep
console.log(item.current, 'item');
item.showStep = !item.showStep;
if (item.reportProcessList.length === 0) {
const res = await reportProcess({ id: item.id })
item.reportProcessList = res.data.data
const res = await reportProcess({ id: item.id });
item.reportProcessList = res.data.data;
res.data.data.map((items) => {
if (items.approval_result !== '0' && items.approval_result !== '2') {
item.current += 1
item.current += 1;
}
})
this.$forceUpdate()
});
this.$forceUpdate();
}
this.$forceUpdate()
this.$forceUpdate();
},
paperScroll() {
this.requestNextPage()
console.log('开始滚动了');
if (!this.isMoreRecord) {
console.log('没有更多数据了');
return false;
}
this.requestNextPage();
},
requestNextPage(pageInfo) {
this.pageInfo.page++
this.reportIndex()
this.pageInfo.page++;
this.reportIndex();
},
handleCurrentChange(val) {
this.pageInfo.page = val
this.pageInfo.page = val;
},
switchStateTag(status) {
switch (status) {
case '0':
return 'unhandle'
return 'unhandle';
case '1':
return 'handled'
return 'handled';
case '2':
return 'sendFail'
return 'sendFail';
}
},
formatImg(html) {
if (html) {
return html.replaceAll(/<img/g, '<img style="max-width:100px;"')
return html.replaceAll(/<img/g, '<img style="max-width:100px;"');
}
return html
return html;
},
switchStateText(status) {
switch (status) {
case '0':
return '待审批'
return '待审批';
case '1':
return '通过'
return '通过';
case '2':
return '驳回'
return '驳回';
}
},
handleReport(item) {
this.$confirm('确定要撤销该申请么?', '确认提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
type: 'warning',
})
.then(() => {
console.log(1231)
console.log(1231);
const data = {
id: item.id,
user_id: this.userInfo.id,
user_name: this.userInfo.username
}
reportCancel(data).then(res => {
user_name: this.userInfo.username,
};
reportCancel(data).then((res) => {
if (res.status_code === 1) {
this.$message({
type: 'success',
message: '撤销成功!'
})
this.filterChange()
message: '撤销成功!',
});
this.filterChange();
}
})
});
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消'
})
})
message: '已取消',
});
});
},
// 举报列表
async reportIndex() {
if (this.accountSelect === '') {
this.$message.warning('暂无关联的账号,请先去关联账号!')
return false
this.$message.warning('暂无关联的账号,请先去关联账号!');
return false;
}
if (this.pageInfo.page == 1) {
this.reportList = []
this.reportList = [];
}
const { username, role_name, approval_status, register_type } = this.reportForm
const { username, role_name, approval_status, register_type } =
this.reportForm;
// const { id } = this.userInfo
const data = {
username,
......@@ -367,36 +558,31 @@ export default {
// customer_id: id,
member_id: this.accountSelect,
register_type,
...this.pageInfo
}
const res = await reportIndex(data)
...this.pageInfo,
};
const res = await reportIndex(data);
if (this.pageInfo.page == 1) {
this.reportList = res.data.data
this.reportList = res.data.data;
} else {
this.reportList = removeDp(this.reportList, res.data.data, 'id')
this.reportList = removeDp(this.reportList, res.data.data, 'id');
}
if (this.reportList.length > 0) {
this.reportList.map((item) => {
item.showStep = false
item.current = 0
item.reportProcessList = []
})
item.showStep = false;
item.current = 0;
item.reportProcessList = [];
});
} else {
this.reportList = []
this.reportList = [];
}
if (res.data.data.length < 20) {
this.isMoreRecord = false
this.isMoreRecord = false;
} else {
this.isMoreRecord = true
}
if (res.data.data.length < 20) {
this.isMoreRecord = false
} else {
this.isMoreRecord = true
}
this.isMoreRecord = true;
}
}
}
},
},
};
</script>
<style lang="scss" scoped>
......@@ -438,7 +624,7 @@ export default {
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #3491FA;
color: #3491fa;
border: none;
}
......@@ -564,30 +750,30 @@ export default {
width: 1px;
}
::v-deep .el-step>.is-success {
color: #3491FA;
border-color: #3491FA;
::v-deep .el-step > .is-success {
color: #3491fa;
border-color: #3491fa;
.el-step__line {
background-color: #e5e6eb;
}
}
::v-deep .el-step__main>.is-success {
color: #3491FA;
::v-deep .el-step__main > .is-success {
color: #3491fa;
}
::v-deep .el-step>.is-process {
color: #3491FA;
border-color: #3491FA;
::v-deep .el-step > .is-process {
color: #3491fa;
border-color: #3491fa;
.el-step__line {
background-color: #e5e6eb;
}
}
::v-deep .el-step__main>.is-process {
color: #3491FA;
::v-deep .el-step__main > .is-process {
color: #3491fa;
}
.form-item-btn {
......@@ -608,7 +794,7 @@ export default {
.preview-btn {
cursor: pointer;
font-size: 14px;
color: #3491FA;
color: #3491fa;
margin: 0 0 0 10px;
i {
......@@ -712,7 +898,7 @@ export default {
height: 80px;
}
&:hover>.preview-pic {
&:hover > .preview-pic {
z-index: 100;
}
}
......@@ -764,7 +950,7 @@ export default {
}
.info-value-color {
color: #3491FA;
color: #3491fa;
margin-left: 5px;
}
}
......
<template>
<div class="details-user-info-role columnFlex">
<div
v-loading="loading"
class="detailsContent"
>
<div v-if="roleList.length>0">
<p class="textInfo">角色充值金额信息会有5-10分钟延迟,请以订单信息为准</p>
<el-collapse
v-model="collapseActive"
@change="handleChange"
>
<div
v-for="(items,indexs) in roleList"
:key="indexs"
class="contentItem"
>
<div v-loading="loading" class="detailsContent">
<div v-if="roleList.length > 0">
<div class="flex items-cente mb-[10px] justify-between">
<p class="textInfo">
角色充值金额信息会有5-10分钟延迟,请以订单信息为准
</p>
<el-button type="primary" size="small" class="h-[30px]" @click.stop="appealLayer()">申诉</el-button>
</div>
<el-collapse v-model="collapseActive" @change="handleChange">
<div v-for="(items, indexs) in roleList" :key="indexs" class="contentItem mb-[10px]">
<div class="title"></div>
<el-collapse-item :name="items.id">
<template slot="title">
<div class="collapseTitle rowFlex columnCenter spaceBetween">
<!-- <div class="collapseTitle rowFlex columnCenter spaceBetween">
<p class="hidden">
{{ items.role_name }} - {{ items.server_name }} - {{ items.recharge_total?items.recharge_total+'元':'0元' }}
{{ items.role_name }} - {{ items.server_name }} - {{
items.recharge_total ? items.recharge_total + '元' : '0元' }}
</p>
<el-button
type="primary"
size="mini"
class="collapseTitleBtn"
@click.stop="appealLayer(items)"
>申诉</el-button>
<el-button type="primary" size="mini" class="collapseTitleBtn"
@click.stop="appealLayer(items)">申诉</el-button>
</div> -->
<div class="flex w-[100%] justify-between">
<div class="py-[10px]">
<div class="leading-[25px]">
<span>角色名:</span><span>{{ items.role_name }}</span>
</div>
<div class="leading-[25px]">
<span>区服:</span><span>{{ items.server_name }}</span>
</div>
<div class="leading-[25px]">
<span>充值金额:</span><span>{{
items.recharge_total
? items.recharge_total + '元'
: '0元'
}}</span>
</div>
</div>
<div class="flex-1 h-0 flex justify-end items-start pt-[10px]">
<el-badge :value="getNumRoleIdList(items.role_id)" class="text-center leading-[0] ml-[8px]">
<el-button type="primary" size="mini" @click.stop="
() =>
recentActivitiesPopupInstance.instance.open(
items.role_id,
`${items.role_name}-${items.server_name}-${items.recharge_total}元`
)
">
近期要开</el-button>
</el-badge>
</div>
</div>
</template>
<div class="item rowFlex columnCenter spaceBetween">
......@@ -81,13 +102,25 @@
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">最近活跃时间:</span>
<p class="text">{{ $moment( items.last_login_time * 1000).format('YYYY-MM-DD HH:mm:ss') }}</p>
<p class="text">
{{
$moment(items.last_login_time * 1000).format(
'YYYY-MM-DD HH:mm:ss'
)
}}
</p>
</div>
</div>
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">创建时间:</span>
<p class="text">{{ $moment( items.create_time * 1000).format('YYYY-MM-DD HH:mm:ss') }}</p>
<p class="text">
{{
$moment(items.create_time * 1000).format(
'YYYY-MM-DD HH:mm:ss'
)
}}
</p>
</div>
</div>
<div class="item rowFlex columnCenter spaceBetween">
......@@ -100,32 +133,27 @@
</div>
</el-collapse>
</div>
<div
v-else-if="!loading && roleList.length==0"
class="noContent rowFlex allCenter"
>
<div v-else-if="!loading && roleList.length == 0" class="noContent rowFlex allCenter">
<noContent title="暂无数据" description="当前没有任何数据,请稍后再试或联系管理员" />
</div>
</div>
<appeal
v-if="showAppeal"
:show.sync="showAppeal"
:appeal-info="appealInfo"
/>
<appeal v-if="showAppeal" :show.sync="showAppeal" :appeal-info="appealInfo" />
</div>
</template>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex'
import { getRoleHoLo } from '@/api/game'
import noContent from '@/components/noContent.vue'
import appeal from './layer/appeal.vue'
import watchMember from '@/mixins/watchMember'
export default {
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import { getRoleHoLo } from '@/api/game';
import noContent from '@/components/noContent.vue';
import appeal from './layer/appeal.vue';
import watchMember from '@/mixins/watchMember';
import { createDetails } from '@/views/popup/RecentActivitiesPopup/index.js';
import { createRoleRecentActivityNotPushNum } from '@/views/hooks/useGetCount.js';
export default {
name: 'roleInfo',
components: {
noContent,
appeal
appeal,
},
data() {
return {
......@@ -138,66 +166,99 @@
pageInfo: {
page_size: 100,
page: 1,
total: 0
total: 0,
},
infoList: []
}
infoList: [],
recentActivitiesPopupInstance: null, //近期要开模块弹框
roleRecentActivityNotPushNumInstance: null, //侧边栏计数弹框
numRoleIdList: [],
};
},
computed: {
...mapState('game', ['accountSelect'])
...mapState('game', ['accountSelect']),
},
mixins: [watchMember],
mounted() {
this.requestRoleList()
this.nowTime = new Date().getTime()
this.requestRoleList();
this.nowTime = new Date().getTime();
// 初始化创建角色最近活动未推送数量
this.initInstance();
},
methods: {
handleChange() {
getNumRoleIdList(role_id) {
return (
this.numRoleIdList.find((item) => item.role_id == role_id)?.num || null
);
},
//初始化创建模块
async initInstance() {
this.recentActivitiesPopupInstance = createDetails();
this.roleRecentActivityNotPushNumInstance =
await createRoleRecentActivityNotPushNum(this.accountSelect);
this.numRoleIdList =
this.roleRecentActivityNotPushNumInstance.getRoleNum();
this.roleRecentActivityNotPushNumInstance.roleRecentActivitySubscription(
(v) => {
this.numRoleIdList = v.roleNum;
},
this
);
},
handleChange() { },
memberChange() {
this.requestRoleList()
this.requestRoleList();
},
// 申诉
appealLayer(item) {
this.appealInfo = item
this.showAppeal = true
this.appealInfo = item;
this.showAppeal = true;
},
requestRoleList() {
if (this.accountSelect === '') {
this.$message.warning('暂无关联的账号,请先去关联账号!')
return false
this.$message.warning('暂无关联的账号,请先去关联账号!');
return false;
}
this.loading = true
this.loading = true;
const data = {
api_search_name: '',
member_id: this.accountSelect,
search_type: 'list',
...this.pageInfo
}
getRoleHoLo(data).then(res => {
this.loading = false
...this.pageInfo,
};
getRoleHoLo(data).then(
(res) => {
this.loading = false;
if (res.status_code == 1) {
if (res.data.data.length > 0) {
this.roleList = res.data.data.sort((a, b) => { return Number(b.recharge_total) - Number(a.recharge_total) })
this.roleList = res.data.data.sort((a, b) => {
return Number(b.recharge_total) - Number(a.recharge_total);
});
} else {
this.roleList = []
}
}
}, err => {
this.loading = false
})
this.roleList = [];
}
}
},
(err) => {
this.loading = false;
}
</script>
<style lang="scss" scoped>
.details-user-info-role {
);
},
},
beforeDestroy() {
this.recentActivitiesPopupInstance.destroy();
this.roleRecentActivityNotPushNumInstance?.destroy();
},
};
</script>
<style lang="scss" scoped>
.details-user-info-role {
width: 100%;
height: 100%;
background: #fff;
margin-left: 2px;
overflow: auto;
.detailsTitle {
width: 100%;
padding: 0 10px;
......@@ -208,14 +269,17 @@
color: #333333;
border-bottom: 1px solid #ebeef5;
border-left: 1px solid #ebeef5;
p {
color: #333333;
}
}
.detailsContent {
width: 100%;
height: 100%;
overflow: auto;
.textInfo {
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
......@@ -224,8 +288,10 @@
margin-bottom: 10px;
margin-top: 10px;
}
.contentItem {
position: relative;
.title {
position: absolute;
left: 10px;
......@@ -233,10 +299,12 @@
font-size: 14px;
color: #999999;
}
.collapseTitle {
width: 90%;
}
}
.item {
width: 100%;
height: auto;
......@@ -248,33 +316,40 @@
position: relative;
padding-left: 10px;
cursor: pointer;
.tableImage {
width: 40px;
height: 40px;
border-radius: 6px;
margin-right: 10px;
}
.label {
color: #999999;
}
.text {
color: #333333;
margin-left: 10px;
word-break: break-all;
max-width: 80%;
}
.icon {
display: none;
position: absolute;
right: 0;
top: 12px;
}
.tags {
width: 300px;
margin-left: 10px;
.tagsItem {
width: 300px;
}
.tag {
height: 22px;
line-height: 22px;
......@@ -291,10 +366,48 @@
}
}
}
.item:hover .icon {
display: block;
}
}
/* 已移除局部 el-collapse 样式,使用全局样式 */
::v-deep .el-collapse-item {
margin-bottom: 20px;
}
::v-deep .el-collapse-item__content {
padding-bottom: 10px;
}
</style>
\ No newline at end of file
::v-deep .el-collapse {
border: none;
}
::v-deep .el-collapse-item__header {
width: 100%;
height: auto;
background: #f9faff;
color: #333333;
padding-left: 10px;
font-size: 14px;
font-weight: 400;
}
::v-deep .el-collapse .el-collapse-item__header .el-collapse-item__arrow {
color: #4e5969;
}
::v-deep .el-badge__content.is-fixed {
top: 0;
}
::v-deep .el-card__header,
::v-deep .el-collapse,
::v-deep .el-collapse-item__header {
border: 0 !important;
}
/* 已移除局部 el-collapse 样式,使用全局样式 */
}
</style>
......@@ -4,24 +4,30 @@
<!-- 标签 -->
<el-collapse-transition>
<div v-if="groupList.length > 0" class="tagList columnFlex">
<div v-for="(item, index) in groupList" :key="index" class="tagItem columnCenter" :draggable="false" :class="groupActive == item.value ? 'tagItemActiveText' : ''" @dragstart="handleDragStart($event, item, index)" @dragover.prevent="handleDragOver($event, item)" @dragenter="handleDragEnter($event, item, 'group')" @dragend="handleDragEnd($event, item, 'group')">
<div v-for="(item, index) in groupList" :key="index" class="tagItem columnCenter" :draggable="false"
:class="groupActive == item.value ? 'tagItemActiveText' : ''"
@dragstart="handleDragStart($event, item, index)" @dragover.prevent="handleDragOver($event, item)"
@dragenter="handleDragEnter($event, item, 'group')" @dragend="handleDragEnd($event, item, 'group')">
<div class="rowFlex columnCenter spaceBetween tagItemGroup" @click="groupFilter(item, index)">
<div class="rowFlex columnCenter">
<i class="el-icon-rank icon" style="cursor: move"></i>
<el-tooltip effect="dark" placement="top" :content="item.name" v-if="item.name.length >= 6">
<p class="text hidden">{{ item.name }}</p>
</el-tooltip>
<p v-else class="text hidden">{{ item.name }}</p>
</div>
<i class="el-icon-caret-right rotageIcon" :class="groupActive == item.value ? 'rotage' : ''"></i>
</div>
<!-- 二级分组 -->
<div v-if="item.child.length > 0 && groupActive == item.value" class="childGroup">
<div v-for="child in item.child" :key="child._id" class="childGroupText" :class="[groupActiveChild == child._id ? 'tagItemActive' : '']" @click.stop="groupFilterChild(child)">
<div v-for="child in item.child" :key="child._id" class="childGroupText"
:class="[groupActiveChild == child._id ? 'tagItemActive' : '']" @click.stop="groupFilterChild(child)">
<p class="text hidden">{{ child.name }}</p>
</div>
</div>
</div>
</div>
<div v-else class="noContent rowFlex allCenter">
<noContent/>
<noContent />
</div>
</el-collapse-transition>
<!-- 话术 -->
......@@ -34,7 +40,8 @@
<div ref="skillLibrary" v-loading="skillLoading" @scroll="paperScroll" class="scrollList">
<div v-for="(items, indexs) in groupDataList" :key="indexs" class="answerContent">
<div class="question"><span class="title">Q:</span>{{ items.question }}</div>
<div v-for="(answer, answerIndex) in items.answer" :key="answerIndex" class="answerItem" style="width: 100%">
<div v-for="(answer, answerIndex) in items.answer" :key="answerIndex" class="answerItem"
style="width: 100%">
<!-- <span class="question">{{ answerIndex + 1 }}: {{ answer }}</span> -->
<div v-if="answer.msgtype == 'text'" class="answerText rowFlex spaceBetween">
<span class="title rowFlex">A{{ answerIndex + 1 }}:</span>
......@@ -45,7 +52,8 @@
</div>
<div v-else-if="answer.msgtype == 'image'" class="answerText rowFlex">
<span class="title rowFlex">A{{ answerIndex + 1 }}:</span>
<el-image style="max-width: 200px" :src="answer.image.picurl" @click="sendMessageImage(answer, items._id)" :preview-src-list="[answer.image.picurl]" > </el-image>
<el-image style="max-width: 200px" :src="answer.image.picurl"
@click="sendMessageImage(answer, items._id)" :preview-src-list="[answer.image.picurl]"> </el-image>
</div>
</div>
</div>
......@@ -53,15 +61,15 @@
</div>
</div>
</div>
</template>
<script>
// procedure_group, procedureList, procedureSort, procedureGroupSort, skillQuote,
import { cross_corp_robot_knowledge_group_index, cross_corp_robot_knowledge_group_getList} from '@/api/skill'
import { mapState, mapMutations, mapActions } from 'vuex'
import { throttle, debounce, copyToClipboard,sendChatMessage } from '@/utils/index'
import noContent from '@/components/noContent.vue'
export default {
</template>
<script>
// procedure_group, procedureList, procedureSort, procedureGroupSort, skillQuote,
import { cross_corp_robot_knowledge_group_index, cross_corp_robot_knowledge_group_getList } from '@/api/skill'
import { mapState, mapMutations, mapActions } from 'vuex'
import { throttle, debounce, copyToClipboard, sendChatMessage } from '@/utils/index'
import noContent from '@/components/noContent.vue'
export default {
name: 'skillLibrary',
components: {
noContent
......@@ -110,7 +118,7 @@
}
},
computed: {
...mapState('game', ['accountSelect','chatUserInfo']),
...mapState('game', ['accountSelect', 'chatUserInfo']),
},
watch: {
accountSelect(newVal, oldVal) {
......@@ -133,7 +141,7 @@
this.requestLibraryData()
},
methods: {
sendMessage: throttle(function(item, id) {
sendMessage: throttle(function (item, id) {
console.log(item, id)
// this.skillQuote(id, item.length)
}, 500),
......@@ -141,14 +149,14 @@
this.sortID._id = item._id
this.dragging = item
},
paperScroll:debounce(function(){
paperScroll: debounce(function () {
const el = this.$refs.skillLibrary
if (el.offsetHeight + el.scrollTop + 10 >= el.scrollHeight) {
console.log('下一页')
this.pageInfo.page++
this.searchTable()
}
},500),
}, 500),
skillQuote(id, num) {
const data = {
type: this.activeName,
......@@ -186,7 +194,7 @@
this.sendChatMessage(item.text.content || '', 'text')
},
sendMessageImage(item){
sendMessageImage(item) {
console.log(item, 'item')
this.sendChatMessage(item.image.picurl || '', 'image')
},
......@@ -256,7 +264,7 @@
this.groupLastDataList = this.groupDataList
})
},
handleChange() {},
handleChange() { },
// 重置select
resizeSelect() {
this.groupActive = '0'
......@@ -268,21 +276,23 @@
this.isResize = false
}, 2000)
},
sendChatMessage(content, type){
sendChatMessage(content, type) {
sendChatMessage(content, type)
},
}
}
</script>
<style lang="scss" scoped>
.skillLibrary {
}
</script>
<style lang="scss" scoped>
.skillLibrary {
width: 100%;
height: 100%;
overflow-y: auto;
overflow-x: hidden;
.noContent {
font-size: 200px;
}
.contentItemTitle {
position: absolute;
left: 10px;
......@@ -293,9 +303,11 @@
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2; /* 这里是超出几行省略 */
-webkit-line-clamp: 2;
/* 这里是超出几行省略 */
overflow: hidden;
}
.titleFixed {
position: absolute;
right: 0px;
......@@ -303,6 +315,7 @@
margin-left: 15px;
margin-right: 25px;
z-index: 10;
.num {
width: auto;
font-size: 14px;
......@@ -311,6 +324,7 @@
color: #409EFF;
margin-right: 10px;
}
.button {
width: 50px;
height: 24px;
......@@ -334,6 +348,7 @@
height: auto;
margin: 20px 0;
padding-left: 10px;
.text {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
......@@ -343,6 +358,7 @@
word-wrap: break-word;
line-height: 18px;
}
.sendButton {
width: 50px;
height: 24px;
......@@ -354,12 +370,14 @@
color: #333333;
padding: 0;
}
.image {
max-width: 25%;
border-radius: 5px;
}
}
}
.item {
width: 100%;
height: auto;
......@@ -371,33 +389,40 @@
position: relative;
padding-left: 10px;
cursor: move;
.tableImage {
width: 40px;
height: 40px;
border-radius: 6px;
margin-right: 10px;
}
.label {
color: #999999;
}
.text {
color: #333333;
margin-left: 10px;
word-break: break-all;
max-width: 80%;
}
.icon {
display: none;
position: absolute;
right: 0;
top: 12px;
}
.tags {
width: 300px;
margin-left: 10px;
.tagsItem {
width: 300px;
}
.tag {
height: 22px;
line-height: 22px;
......@@ -414,31 +439,38 @@
}
}
}
.item:hover .icon {
display: block;
}
}
::v-deep .el-tabs--border-card .is-active {
}
::v-deep .el-tabs--border-card .is-active {
border: none !important;
}
::v-deep .is-active {
}
::v-deep .is-active {
border: none;
}
/* 已移除局部 el-collapse 样式,使用全局样式 */
.inputContent {
}
/* 已移除局部 el-collapse 样式,使用全局样式 */
.inputContent {
width: 100%;
margin-bottom: 20px;
margin-left: 20px;
::v-deep .el-input {
width: 90%;
}
}
.skillBox {
}
.skillBox {
width: 100%;
height: calc(100% - 20px);
}
.tagList {
}
.tagList {
width: 200px;
height: 100%;
position: relative;
......@@ -455,15 +487,18 @@
color: #333333;
margin-bottom: 6px;
cursor: pointer;
.text {
max-width: 90px;
margin-left: 5px;
}
.tagItemGroup {
height: 36px;
padding-right: 10px;
}
}
.iconFont {
font-size: 20px;
color: #999999;
......@@ -471,47 +506,57 @@
right: 0;
top: 20px;
cursor: pointer;
.upIcon {
transform: rotate(90deg);
}
}
.tagItemActive {
color: #409EFF !important;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
background: #e4fff1;
}
.tagItemActiveText {
color: #409EFF;
}
}
.libraryListContent{
}
.libraryListContent {
width: 100%;
height: 100%;
}
.rotageIcon {
}
.rotageIcon {
cursor: pointer;
transition: all 0.5s;
transform: rotate(0deg);
font-size: 12px;
}
.rotage {
}
.rotage {
transform: rotate(90deg);
}
.childGroup {
}
.childGroup {
p {
margin-left: 15px !important;
}
.childGroupText {
height: 36px;
line-height: 36px;
color: #333333;
}
}
.scrollList {
}
.scrollList {
width: 100%;
height: 100%;
padding-left: 20px;
.answerContent {
width: 100%;
background: #f7f8fa;
......@@ -519,15 +564,18 @@
border: 1px solid #e5e6eb;
padding: 10px;
margin-bottom: 20px;
.title {
width: 30px;
font-size: 14px;
font-weight: 500;
margin-right: 10px;
}
.answerItem {
margin-bottom: 10px;
}
.question {
font-weight: 500;
font-size: 14px;
......@@ -536,6 +584,7 @@
text-align: left;
margin-bottom: 10px;
}
.answerText {
width: 100%;
font-family: PingFangSC, PingFang SC;
......@@ -544,15 +593,18 @@
color: #333333;
text-align: justify;
font-style: normal;
.answerTextTitle {
width: 30px;
font-size: 16px;
font-weight: 500;
}
.textAnswer {
word-wrap: break-word;
font-size: 13px;
}
.copyIcon {
width: 20px;
color: #409EFF;
......@@ -564,55 +616,70 @@
}
}
}
}
.scrollList::-webkit-scrollbar {display:none}
.container {
}
.scrollList::-webkit-scrollbar {
display: none
}
.container {
// margin-top: -20px;
}
::v-deep .el-tabs,
.el-tabs__content,
.el-tab-pane {
}
::v-deep .el-tabs,
.el-tabs__content,
.el-tab-pane {
width: 100%;
height: 100%;
}
::v-deep .el-tabs__content {
}
::v-deep .el-tabs__content {
width: 100%;
height: calc(100% - 50px);
}
::v-deep .el-tab-pane {
}
::v-deep .el-tab-pane {
width: 100%;
height: 100%;
}
.scrollList {
}
.scrollList {
width: 100%;
height: calc(100% - 40px);
overflow: auto;
}
.draggable {
}
.draggable {
position: relative;
transition: all 0.3s;
.icon {
position: absolute;
left: 10px;
top: 15px;
z-index: 10;
}
}
.textAnswer {
}
.textAnswer {
word-wrap: break-word;
display: inline;
}
.img_drop {
}
.img_drop {
width: 200px;
height: 200px;
background: rgba(0, 0, 0, 0.36);
position: absolute;
left: 0;
top: 0;
}
.skillLibrary::-webkit-scrollbar {display:none}
::v-deep .el-icon-circle-close {
color: #fff;
}
</style>
}
.skillLibrary::-webkit-scrollbar {
display: none
}
::v-deep .el-icon-circle-close {
color: #fff;
}
</style>
\ No newline at end of file
......@@ -9,9 +9,15 @@
<!-- 标签 -->
<el-collapse-transition>
<div v-if="groupList.length > 0" class="tagList columnFlex">
<div v-for="(item, index) in groupList" :key="index" class="tagItem rowFlex columnCenter" :draggable="activeName == 'personal' ? true : false" :class="groupActive == item.value ? 'tagItemActive' : ''" @dragstart="handleDragStart($event, item, index)" @dragover.prevent="handleDragOver($event, item)" @dragenter="handleDragEnter($event, item, 'group')" @dragend="handleDragEnd($event, item, 'group')">
<i class="el-icon-rank icon" style="cursor: move"></i>
<div v-for="(item, index) in groupList" :key="index" class="tagItem rowFlex columnCenter"
:draggable="activeName == 'personal' ? true : false"
:class="groupActive == item.value ? 'tagItemActive' : ''" @dragstart="handleDragStart($event, item, index)"
@dragover.prevent="handleDragOver($event, item)" @dragenter="handleDragEnter($event, item, 'group')"
@dragend="handleDragEnd($event, item, 'group')">
<el-tooltip effect="dark" placement="top" :content="item.group_name" v-if="item.group_name.length >= 6">
<p class="text hidden" @click="groupFilter(item, index)">{{ item.group_name }}</p>
</el-tooltip>
<p v-else class="text hidden" @click="groupFilter(item, index)">{{ item.group_name }}</p>
</div>
</div>
<div v-else>暂无话术内容</div>
......@@ -20,14 +26,19 @@
<div v-loading="skillLoading" class="scrollList">
<el-collapse v-model="collapseActive" @change="handleChange">
<transition-group v-if="groupDataList.length > 0" tag="div" class="container">
<div v-for="(items, indexs) in groupDataList" :key="indexs" :draggable="activeName == 'personal' ? true : false" class="draggable" @dragstart="handleDragStart($event, items, indexs)" @dragover.prevent="handleDragOver($event, items)" @dragenter="handleDragEnter($event, items, 'item')" @dragend="handleDragEnd($event, items, 'item')">
<div v-for="(items, indexs) in groupDataList" :key="indexs"
:draggable="activeName == 'personal' ? true : false" class="draggable"
@dragstart="handleDragStart($event, items, indexs)" @dragover.prevent="handleDragOver($event, items)"
@dragenter="handleDragEnter($event, items, 'item')" @dragend="handleDragEnd($event, items, 'item')">
<el-popover placement="top" width="300" trigger="hover">
<p>{{ items.title }}</p>
<div slot="reference" class="contentItemTitle allCenter" :style="{ top: items.title.length > 8 ? '5px' : '13px' }">{{ items.title }}</div>
<div slot="reference" class="contentItemTitle allCenter"
:style="{ top: items.title.length > 8 ? '5px' : '13px' }">{{ items.title }}</div>
</el-popover>
<div class="rowFlex titleFixed columnCenter">
<div class="num">{{items.message && items.message.attachments && items.message.attachments.length > 1 ? `+${items.message.attachments.length - 1}条` : '' }}</div>
<div class="num">{{ items.message && items.message.attachments && items.message.attachments.length > 1 ?
`+${items.message.attachments.length - 1}条` : '' }}</div>
</div>
<el-collapse-item title="" :name="items._id" class="contentItem">
......@@ -35,11 +46,14 @@
<div>
<div v-if="i.msgtype == 'text'" class="contentItemDetails rowFlex spaceBetween columnCenter">
<div class="text">{{ i.text.content }}</div>
<el-button class="sendButton rowFlex allCenter" @click.stop="sendMessageEdit(i, items._id)">发送</el-button>
<el-button class="sendButton rowFlex allCenter"
@click.stop="sendMessageEdit(i, items._id)">发送</el-button>
</div>
<div v-if="i.msgtype == 'image'" class="contentItemDetails rowFlex spaceBetween columnCenter">
<el-image class="image" :src="i.image.picurl" :preview-src-list="[i.image.picurl]" fit="contain"></el-image>
<el-button class="sendButton rowFlex allCenter" @click.stop="sendMessageEdit(i, items._id)">发送</el-button>
<el-image class="image" :src="i.image.picurl" :preview-src-list="[i.image.picurl]"
fit="contain"></el-image>
<el-button class="sendButton rowFlex allCenter"
@click.stop="sendMessageEdit(i, items._id)">发送</el-button>
</div>
</div>
</div>
......@@ -56,7 +70,7 @@
import { procedure_group, procedureList, procedureSort, procedureGroupSort, skillQuote } from '@/api/skill'
import { mapState, mapMutations, mapActions } from 'vuex'
import { throttle, copyToClipboard } from '@/utils/index'
import {getMediaId} from '@/api/works'
import { getMediaId } from '@/api/works'
export default {
name: 'skillCompany',
components: {},
......@@ -215,7 +229,7 @@ export default {
// 发送语音的时候 先编辑再发送
sendMessageEdit(item, id) {
// 复制内容到粘贴板
if(item.msgtype == 'text'){
if (item.msgtype == 'text') {
if (item && item.text && item.text.content) {
// copyToClipboard(
// item.text.content,
......@@ -224,15 +238,15 @@ export default {
// )
this.sendChatMessage(item.text.content)
}
}else if(item.msgtype == 'image' && item.image.picurl){
} else if (item.msgtype == 'image' && item.image.picurl) {
this.sendMessageImage(item)
}
},
async sendMessageImage(item, id){
async sendMessageImage(item, id) {
// 发送图片作为链接消息
if (item.image && item.image.picurl) {
const res = await getMediaId({url: item.image.picurl})
if(res.status_code == 1){
const res = await getMediaId({ url: item.image.picurl })
if (res.status_code == 1) {
this.sendImageAsMedia(res.data.media_id)
}
} else {
......@@ -260,7 +274,7 @@ export default {
},
// 发送文本消息
sendChatMessage(text){
sendChatMessage(text) {
this.$ww.sendChatMessage({
msgtype: 'text',
text: {
......@@ -335,7 +349,7 @@ export default {
this.groupLastDataList = this.groupDataList
})
},
handleChange() {},
handleChange() { },
// 重置select
resizeSelect() {
this.groupActive = '0'
......@@ -360,6 +374,7 @@ export default {
width: 100%;
height: 100%;
background: #fff;
.detailsTitle {
width: 100%;
padding: 0 10px;
......@@ -370,15 +385,18 @@ export default {
color: #333333;
border-bottom: 1px solid #ebeef5;
border-left: 1px solid #ebeef5;
p {
color: #333333;
}
}
.content {
width: 100%;
padding: 10px;
height: 100%;
background: red;
.contentItemTitle {
position: absolute;
left: 10px;
......@@ -389,9 +407,11 @@ export default {
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2; /* 这里是超出几行省略 */
-webkit-line-clamp: 2;
/* 这里是超出几行省略 */
overflow: hidden;
}
.titleFixed {
position: absolute;
right: 0px;
......@@ -399,6 +419,7 @@ export default {
margin-left: 15px;
margin-right: 25px;
z-index: 10;
.num {
width: auto;
font-size: 14px;
......@@ -407,6 +428,7 @@ export default {
color: #409EFF;
margin-right: 10px;
}
.button {
width: 50px;
height: 24px;
......@@ -430,6 +452,7 @@ export default {
height: auto;
margin: 20px 0;
padding-left: 10px;
.text {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
......@@ -439,6 +462,7 @@ export default {
line-height: 18px;
max-width: calc(100% - 60px);
}
.sendButton {
width: 50px;
height: 24px;
......@@ -450,12 +474,14 @@ export default {
color: #333333;
padding: 0;
}
.image {
max-width: 25%;
border-radius: 5px;
}
}
}
.item {
width: 100%;
height: auto;
......@@ -467,33 +493,40 @@ export default {
position: relative;
padding-left: 10px;
cursor: move;
.tableImage {
width: 40px;
height: 40px;
border-radius: 6px;
margin-right: 10px;
}
.label {
color: #999999;
}
.text {
color: #333333;
margin-left: 10px;
word-break: break-all;
max-width: 80%;
}
.icon {
display: none;
position: absolute;
right: 0;
top: 12px;
}
.tags {
width:250px;
width: 250px;
margin-left: 10px;
.tagsItem {
width: 250px;
}
.tag {
height: 22px;
line-height: 22px;
......@@ -510,34 +543,42 @@ export default {
}
}
}
.item:hover .icon {
display: block;
}
}
::v-deep .el-tabs--border-card .is-active {
border: none !important;
}
::v-deep .is-active {
border: none;
}
/* 已移除局部 el-collapse 样式,使用全局样式 */
.inputContent {
width: 100%;
::v-deep .el-input {
width: 80%;
}
}
.skillBox {
width: 100%;
height: 100%;
overflow: auto;
margin-top: 20px;
}
.tagList {
width: 150px;
height: 100%;
position: relative;
border-right: 1px solid #e0e0e0;
.tagItem {
width: 100px;
height: 36px;
......@@ -550,11 +591,12 @@ export default {
padding-left: 10px;
margin-bottom: 6px;
cursor: pointer;
.text {
max-width: 100px;
margin-left: 10px;
}
}
.iconFont {
font-size: 20px;
color: #999999;
......@@ -562,10 +604,12 @@ export default {
right: 0;
top: 20px;
cursor: pointer;
.upIcon {
transform: rotate(90deg);
}
}
.tagItemActive {
color: #409EFF;
font-family: PingFangSC-Regular, PingFang SC;
......@@ -573,35 +617,43 @@ export default {
background: #e4fff1;
}
}
.scrollList {
width: 100%;
height: 100%;
}
.container {
// margin-top: -20px;
}
::v-deep .el-tabs,
.el-tabs__content,
.el-tab-pane {
width: 100%;
height: 100%;
}
::v-deep .el-tabs__content {
width: 100%;
height: calc(100% - 50px);
}
::v-deep .el-tab-pane {
width: 100%;
height: 100%;
}
.scrollList {
width: 100%;
height: calc(100% - 40px);
overflow: auto;
}
.draggable {
position: relative;
transition: all 0.3s;
.icon {
position: absolute;
left: 10px;
......@@ -609,10 +661,12 @@ export default {
z-index: 10;
}
}
::v-deep .el-icon-circle-close {
color: #fff;
}
}
.skillTab {
width: 100%;
height: calc(100% - 60px);
......
......@@ -4,24 +4,30 @@
<!-- 标签 -->
<el-collapse-transition>
<div v-if="groupList.length > 0" class="tagList columnFlex">
<div v-for="(item, index) in groupList" :key="index" class="tagItem columnCenter" :draggable="false" :class="groupActive == item.value ? 'tagItemActiveText' : ''" @dragstart="handleDragStart($event, item, index)" @dragover.prevent="handleDragOver($event, item)" @dragenter="handleDragEnter($event, item, 'group')" @dragend="handleDragEnd($event, item, 'group')">
<div v-for="(item, index) in groupList" :key="index" class="tagItem columnCenter" :draggable="false"
:class="groupActive == item.value ? 'tagItemActiveText' : ''"
@dragstart="handleDragStart($event, item, index)" @dragover.prevent="handleDragOver($event, item)"
@dragenter="handleDragEnter($event, item, 'group')" @dragend="handleDragEnd($event, item, 'group')">
<div class="rowFlex columnCenter spaceBetween tagItemGroup" @click="groupFilter(item, index)">
<div class="rowFlex columnCenter">
<i class="el-icon-rank icon" style="cursor: move"></i>
<p class="text hidden">{{ item.name }}</p>
<el-tooltip effect="dark" placement="top" :content="item.name" v-if="item.name.length >= 6">
<p class="text hidden" @click="groupFilter(item, index)">{{ item.name }}</p>
</el-tooltip>
<p v-else class="text hidden" @click="groupFilter(item, index)">{{ item.name }}</p>
</div>
<i class="el-icon-caret-right rotageIcon" :class="groupActive == item.value ? 'rotage' : ''"></i>
</div>
<!-- 二级分组 -->
<div v-if="item.child.length > 0 && groupActive == item.value" class="childGroup">
<div v-for="child in item.child" :key="child._id" class="childGroupText" :class="[groupActiveChild == child._id ? 'tagItemActive' : '']" @click.stop="groupFilterChild(child)">
<div v-for="child in item.child" :key="child._id" class="childGroupText"
:class="[groupActiveChild == child._id ? 'tagItemActive' : '']" @click.stop="groupFilterChild(child)">
<p class="text hidden">{{ child.name }}</p>
</div>
</div>
</div>
</div>
<div v-else class="noContent rowFlex allCenter">
<noContent/>
<noContent />
</div>
</el-collapse-transition>
<!-- 话术 -->
......@@ -34,7 +40,8 @@
<div ref="skillLibrary" v-loading="skillLoading" @scroll="paperScroll" class="scrollList">
<div v-for="(items, indexs) in groupDataList" :key="indexs" class="answerContent">
<div class="question"><span class="title">Q:</span>{{ items.name }}</div>
<div v-for="(answer, answerIndex) in items.answer" :key="answerIndex" class="answerItem" style="width: 100%">
<div v-for="(answer, answerIndex) in items.answer" :key="answerIndex" class="answerItem"
style="width: 100%">
<!-- <span class="question">{{ answerIndex + 1 }}: {{ answer }}</span> -->
<div v-if="answer.msgtype == 'text'" class="answerText rowFlex spaceBetween">
<span class="title rowFlex">A{{ answerIndex + 1 }}:</span>
......@@ -45,7 +52,8 @@
</div>
<div v-else-if="answer.msgtype == 'image'" class="answerText rowFlex">
<span class="title rowFlex">A{{ answerIndex + 1 }}:</span>
<el-image style="max-width: 200px" :src="answer.image.picurl" @click="sendMessageImage(answer, items._id)" :preview-src-list="[answer.image.picurl]" > </el-image>
<el-image style="max-width: 200px" :src="answer.image.picurl"
@click="sendMessageImage(answer, items._id)" :preview-src-list="[answer.image.picurl]"> </el-image>
</div>
</div>
</div>
......@@ -59,7 +67,7 @@
// procedure_group, procedureList, procedureSort, procedureGroupSort, skillQuote,
import { groupList, libraryIndex, logClickTime } from '@/api/skill'
import { mapState, mapMutations, mapActions } from 'vuex'
import { throttle, debounce, copyToClipboard,sendChatMessage } from '@/utils/index'
import { throttle, debounce, copyToClipboard, sendChatMessage } from '@/utils/index'
import noContent from '@/components/noContent.vue'
export default {
name: 'skillLibrary',
......@@ -110,7 +118,7 @@ export default {
}
},
computed: {
...mapState('game', ['accountSelect','chatUserInfo']),
...mapState('game', ['accountSelect', 'chatUserInfo']),
},
watch: {
accountSelect(newVal, oldVal) {
......@@ -133,7 +141,7 @@ export default {
this.requestLibraryData()
},
methods: {
sendMessage: throttle(function(item, id) {
sendMessage: throttle(function (item, id) {
console.log(item, id)
// this.skillQuote(id, item.length)
}, 500),
......@@ -141,14 +149,14 @@ export default {
this.sortID._id = item._id
this.dragging = item
},
paperScroll:debounce(function(){
paperScroll: debounce(function () {
const el = this.$refs.skillLibrary
if (el.offsetHeight + el.scrollTop + 10 >= el.scrollHeight) {
console.log('下一页')
this.pageInfo.page++
this.searchTable()
}
},500),
}, 500),
skillQuote(id, num) {
const data = {
type: this.activeName,
......@@ -186,7 +194,7 @@ export default {
this.sendChatMessage(item.text.content || '', 'text')
},
sendMessageImage(item){
sendMessageImage(item) {
console.log(item, 'item')
this.sendChatMessage(item.image.picurl || '', 'image')
},
......@@ -256,7 +264,7 @@ export default {
this.groupLastDataList = this.groupDataList
})
},
handleChange() {},
handleChange() { },
// 重置select
resizeSelect() {
this.groupActive = '0'
......@@ -268,7 +276,7 @@ export default {
this.isResize = false
}, 2000)
},
sendChatMessage(content, type){
sendChatMessage(content, type) {
sendChatMessage(content, type)
},
}
......@@ -280,9 +288,11 @@ export default {
height: 100%;
overflow-y: auto;
overflow-x: hidden;
.noContent {
font-size: 200px;
}
.contentItemTitle {
position: absolute;
left: 10px;
......@@ -293,9 +303,11 @@ export default {
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2; /* 这里是超出几行省略 */
-webkit-line-clamp: 2;
/* 这里是超出几行省略 */
overflow: hidden;
}
.titleFixed {
position: absolute;
right: 0px;
......@@ -303,6 +315,7 @@ export default {
margin-left: 15px;
margin-right: 25px;
z-index: 10;
.num {
width: auto;
font-size: 14px;
......@@ -311,6 +324,7 @@ export default {
color: #409EFF;
margin-right: 10px;
}
.button {
width: 50px;
height: 24px;
......@@ -334,6 +348,7 @@ export default {
height: auto;
margin: 20px 0;
padding-left: 10px;
.text {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
......@@ -343,6 +358,7 @@ export default {
word-wrap: break-word;
line-height: 18px;
}
.sendButton {
width: 50px;
height: 24px;
......@@ -354,12 +370,14 @@ export default {
color: #333333;
padding: 0;
}
.image {
max-width: 25%;
border-radius: 5px;
}
}
}
.item {
width: 100%;
height: auto;
......@@ -371,33 +389,40 @@ export default {
position: relative;
padding-left: 10px;
cursor: move;
.tableImage {
width: 40px;
height: 40px;
border-radius: 6px;
margin-right: 10px;
}
.label {
color: #999999;
}
.text {
color: #333333;
margin-left: 10px;
word-break: break-all;
max-width: 80%;
}
.icon {
display: none;
position: absolute;
right: 0;
top: 12px;
}
.tags {
width: 300px;
margin-left: 10px;
.tagsItem {
width: 300px;
}
.tag {
height: 22px;
line-height: 22px;
......@@ -414,30 +439,37 @@ export default {
}
}
}
.item:hover .icon {
display: block;
}
}
::v-deep .el-tabs--border-card .is-active {
border: none !important;
}
::v-deep .is-active {
border: none;
}
/* 已移除局部 el-collapse 样式,使用全局样式 */
.inputContent {
width: 100%;
margin-bottom: 20px;
margin-left: 20px;
::v-deep .el-input {
width: 90%;
}
}
.skillBox {
width: 100%;
height: calc(100% - 20px);
}
.tagList {
width: 200px;
height: 100%;
......@@ -455,15 +487,18 @@ export default {
color: #333333;
margin-bottom: 6px;
cursor: pointer;
.text {
max-width: 90px;
margin-left: 5px;
}
.tagItemGroup {
height: 36px;
padding-right: 10px;
}
}
.iconFont {
font-size: 20px;
color: #999999;
......@@ -471,47 +506,57 @@ export default {
right: 0;
top: 20px;
cursor: pointer;
.upIcon {
transform: rotate(90deg);
}
}
.tagItemActive {
color: #409EFF !important;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
background: #e4fff1;
}
.tagItemActiveText {
color: #409EFF;
}
}
.libraryListContent{
.libraryListContent {
width: 100%;
height: 100%;
}
.rotageIcon {
cursor: pointer;
transition: all 0.5s;
transform: rotate(0deg);
font-size: 12px;
}
.rotage {
transform: rotate(90deg);
}
.childGroup {
p {
margin-left: 15px !important;
}
.childGroupText {
height: 36px;
line-height: 36px;
color: #333333;
}
}
.scrollList {
width: 100%;
height: 100%;
padding-left: 20px;
.answerContent {
width: 100%;
background: #f7f8fa;
......@@ -519,15 +564,18 @@ export default {
border: 1px solid #e5e6eb;
padding: 10px;
margin-bottom: 20px;
.title {
width: 30px;
font-size: 14px;
font-weight: 500;
margin-right: 10px;
}
.answerItem {
margin-bottom: 10px;
}
.question {
font-weight: 500;
font-size: 14px;
......@@ -536,6 +584,7 @@ export default {
text-align: left;
margin-bottom: 10px;
}
.answerText {
width: 100%;
font-family: PingFangSC, PingFang SC;
......@@ -544,15 +593,18 @@ export default {
color: #333333;
text-align: justify;
font-style: normal;
.answerTextTitle {
width: 30px;
font-size: 16px;
font-weight: 500;
}
.textAnswer {
word-wrap: break-word;
font-size: 13px;
}
.copyIcon {
width: 20px;
color: #409EFF;
......@@ -565,32 +617,42 @@ export default {
}
}
}
.scrollList::-webkit-scrollbar {display:none}
.scrollList::-webkit-scrollbar {
display: none
}
.container {
// margin-top: -20px;
}
::v-deep .el-tabs,
.el-tabs__content,
.el-tab-pane {
width: 100%;
height: 100%;
}
::v-deep .el-tabs__content {
width: 100%;
height: calc(100% - 50px);
}
::v-deep .el-tab-pane {
width: 100%;
height: 100%;
}
.scrollList {
width: 100%;
height: calc(100% - 40px);
overflow: auto;
}
.draggable {
position: relative;
transition: all 0.3s;
.icon {
position: absolute;
left: 10px;
......@@ -598,10 +660,12 @@ export default {
z-index: 10;
}
}
.textAnswer {
word-wrap: break-word;
display: inline;
}
.img_drop {
width: 200px;
height: 200px;
......@@ -610,7 +674,11 @@ export default {
left: 0;
top: 0;
}
.skillLibrary::-webkit-scrollbar {display:none}
.skillLibrary::-webkit-scrollbar {
display: none
}
::v-deep .el-icon-circle-close {
color: #fff;
}
......
......@@ -9,9 +9,15 @@
<!-- 标签 -->
<el-collapse-transition>
<div v-if="groupList.length > 0" class="tagList columnFlex">
<div v-for="(item, index) in groupList" :key="index" class="tagItem rowFlex columnCenter" :draggable="activeName == 'personal' ? true : false" :class="groupActive == item.value ? 'tagItemActive' : ''" @dragstart="handleDragStart($event, item, index)" @dragover.prevent="handleDragOver($event, item)" @dragenter="handleDragEnter($event, item, 'group')" @dragend="handleDragEnd($event, item, 'group')">
<i class="el-icon-rank icon" v-if="activeName == 'personal'" style="cursor: move"></i>
<div v-for="(item, index) in groupList" :key="index" class="tagItem rowFlex columnCenter"
:draggable="activeName == 'personal' ? true : false"
:class="groupActive == item.value ? 'tagItemActive' : ''" @dragstart="handleDragStart($event, item, index)"
@dragover.prevent="handleDragOver($event, item)" @dragenter="handleDragEnter($event, item, 'group')"
@dragend="handleDragEnd($event, item, 'group')">
<el-tooltip effect="dark" placement="top" :content="item.group_name" v-if="item.group_name.length >= 6">
<p class="text hidden" @click="groupFilter(item, index)">{{ item.group_name }}</p>
</el-tooltip>
<p v-else class="text hidden" @click="groupFilter(item, index)">{{ item.group_name }}</p>
</div>
</div>
<div v-else>暂无话术内容</div>
......@@ -20,14 +26,19 @@
<div v-loading="skillLoading" class="scrollList">
<el-collapse v-model="collapseActive" @change="handleChange">
<transition-group v-if="groupDataList.length > 0" tag="div" class="container">
<div v-for="(items, indexs) in groupDataList" :key="indexs" :draggable="activeName == 'personal' ? true : false" class="draggable" @dragstart="handleDragStart($event, items, indexs)" @dragover.prevent="handleDragOver($event, items)" @dragenter="handleDragEnter($event, items, 'item')" @dragend="handleDragEnd($event, items, 'item')">
<div v-for="(items, indexs) in groupDataList" :key="indexs"
:draggable="activeName == 'personal' ? true : false" class="draggable"
@dragstart="handleDragStart($event, items, indexs)" @dragover.prevent="handleDragOver($event, items)"
@dragenter="handleDragEnter($event, items, 'item')" @dragend="handleDragEnd($event, items, 'item')">
<el-popover placement="top" width="300" trigger="hover">
<p>{{ items.title }}</p>
<div slot="reference" class="contentItemTitle allCenter" :style="{ top: items.title.length > 8 ? '5px' : '13px' }">{{ items.title }}</div>
<div slot="reference" class="contentItemTitle allCenter"
:style="{ top: items.title.length > 8 ? '5px' : '13px' }">{{ items.title }}</div>
</el-popover>
<div class="rowFlex titleFixed columnCenter">
<div class="num">{{ items.message.attachments.length > 1 ? `+${items.message.attachments.length - 1}条` : '' }}</div>
<div class="num">{{ items.message.attachments.length > 1 ? `+${items.message.attachments.length - 1}条` :
'' }}</div>
<!-- <el-button class="button rowFlex allCenter" @click.stop="sendMessage(items.message.attachments, items._id)">发送</el-button> -->
</div>
<el-collapse-item title="" :name="items._id" class="contentItem">
......@@ -35,11 +46,14 @@
<div>
<div v-if="i.msgtype == 'text'" class="contentItemDetails rowFlex spaceBetween columnCenter">
<div class="text">{{ i.text.content }}</div>
<el-button class="sendButton rowFlex allCenter" @click.stop="sendMessageEdit(i, items._id)">发送</el-button>
<el-button class="sendButton rowFlex allCenter"
@click.stop="sendMessageEdit(i, items._id)">发送</el-button>
</div>
<div v-if="i.msgtype == 'image'" class="contentItemDetails rowFlex spaceBetween columnCenter">
<el-image class="image" :src="i.image.picurl" :preview-src-list="[i.image.picurl]" fit="contain"></el-image>
<el-button class="sendButton rowFlex allCenter" @click.stop="sendMessageEdit(i, items._id)">发送</el-button>
<el-image class="image" :src="i.image.picurl" :preview-src-list="[i.image.picurl]"
fit="contain"></el-image>
<el-button class="sendButton rowFlex allCenter"
@click.stop="sendMessageEdit(i, items._id)">发送</el-button>
</div>
</div>
</div>
......@@ -54,7 +68,7 @@
</template>
<script>
import { procedure_group, procedureList, procedureSort, procedureGroupSort } from '@/api/skill'
import {getMediaId} from '@/api/works'
import { getMediaId } from '@/api/works'
import { mapState, mapMutations, mapActions } from 'vuex'
import { debounce, copyToClipboard } from '@/utils/index'
export default {
......@@ -103,7 +117,7 @@ export default {
},
computed: {
...mapState('game', ['accountSelect']),
...mapState('user', ['userid','external_userid']),
...mapState('user', ['userid', 'external_userid']),
},
watch: {
accountSelect(newVal, oldVal) {
......@@ -127,14 +141,14 @@ export default {
},
methods: {
// ...mapMutations('common', ['set_sendSkillMessage', 'set_isEditSkill']),
sendMessage: debounce(function(item, id) {
sendMessage: debounce(function (item, id) {
console.log(item, id, 'sendMessage')
}, 500),
// 发送语音的时候 先编辑再发送
sendMessageEdit(item, id) {
console.log(item)
// 复制内容到粘贴板
if(item.msgtype == 'text'){
if (item.msgtype == 'text') {
if (item && item.text && item.text.content) {
// copyToClipboard(
// item.text.content,
......@@ -143,15 +157,15 @@ export default {
// )
this.sendChatMessage(item.text.content)
}
}else if(item.msgtype == 'image' && item.image.picurl){
} else if (item.msgtype == 'image' && item.image.picurl) {
this.sendMessageImage(item)
}
},
async sendMessageImage(item, id){
async sendMessageImage(item, id) {
// 发送图片作为链接消息
if (item.image && item.image.picurl) {
const res = await getMediaId({url: item.image.picurl})
if(res.status_code == 1){
const res = await getMediaId({ url: item.image.picurl })
if (res.status_code == 1) {
this.sendImageAsMedia(res.data.media_id)
}
} else {
......@@ -178,7 +192,7 @@ export default {
},
// 发送文本消息
sendChatMessage(text){
sendChatMessage(text) {
this.$ww.sendChatMessage({
msgtype: 'text',
text: {
......@@ -332,7 +346,7 @@ export default {
this.groupLastDataList = this.groupDataList
})
},
handleChange() {},
handleChange() { },
// 重置select
resizeSelect() {
this.groupActive = '0'
......@@ -357,6 +371,7 @@ export default {
width: 100%;
height: 100%;
background: #fff;
.detailsTitle {
width: 100%;
padding: 0 10px;
......@@ -367,15 +382,18 @@ export default {
color: #333333;
border-bottom: 1px solid #ebeef5;
border-left: 1px solid #ebeef5;
p {
color: #333333;
}
}
.content {
width: 100%;
padding: 10px;
height: 100%;
background: red;
.contentItemTitle {
position: absolute;
left: 10px;
......@@ -386,9 +404,11 @@ export default {
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2; /* 这里是超出几行省略 */
-webkit-line-clamp: 2;
/* 这里是超出几行省略 */
overflow: hidden;
}
.titleFixed {
position: absolute;
right: 0px;
......@@ -396,6 +416,7 @@ export default {
margin-left: 15px;
margin-right: 25px;
z-index: 10;
.num {
width: auto;
font-size: 14px;
......@@ -404,6 +425,7 @@ export default {
color: #409EFF;
margin-right: 10px;
}
.button {
width: 50px;
height: 24px;
......@@ -427,6 +449,7 @@ export default {
height: auto;
margin: 20px 0;
padding-left: 10px;
.text {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
......@@ -436,6 +459,7 @@ export default {
line-height: 18px;
max-width: calc(100% - 60px);
}
.sendButton {
width: 50px;
height: 24px;
......@@ -447,12 +471,14 @@ export default {
color: #333333;
padding: 0;
}
.image {
max-width: 25%;
border-radius: 5px;
}
}
}
.item {
width: 100%;
height: auto;
......@@ -464,33 +490,40 @@ export default {
position: relative;
padding-left: 10px;
cursor: move;
.tableImage {
width: 40px;
height: 40px;
border-radius: 6px;
margin-right: 10px;
}
.label {
color: #999999;
}
.text {
color: #333333;
margin-left: 10px;
word-break: break-all;
max-width: 80%;
}
.icon {
display: none;
position: absolute;
right: 0;
top: 12px;
}
.tags {
width:260px;
width: 260px;
margin-left: 10px;
.tagsItem {
width: 260px;
}
.tag {
height: 22px;
line-height: 22px;
......@@ -507,34 +540,42 @@ export default {
}
}
}
.item:hover .icon {
display: block;
}
}
::v-deep .el-tabs--border-card .is-active {
border: none !important;
}
::v-deep .is-active {
border: none;
}
/* 已移除局部 el-collapse 样式,使用全局样式 */
.inputContent {
width: 100%;
::v-deep .el-input {
width: 80%;
}
}
.skillBox {
width: 100%;
height: 100%;
overflow: auto;
margin-top: 20px;
}
.tagList {
width: 140px;
height: 100%;
position: relative;
border-right: 1px solid #e0e0e0;
.tagItem {
width: 100px;
height: 36px;
......@@ -547,11 +588,12 @@ export default {
padding-left: 10px;
margin-bottom: 6px;
cursor: pointer;
.text {
max-width: 90px;
margin-left: 10px;
}
}
.iconFont {
font-size: 20px;
color: #999999;
......@@ -559,10 +601,12 @@ export default {
right: 0;
top: 20px;
cursor: pointer;
.upIcon {
transform: rotate(90deg);
}
}
.tagItemActive {
color: #409EFF;
font-family: PingFangSC-Regular, PingFang SC;
......@@ -570,35 +614,43 @@ export default {
background: #e4fff1;
}
}
.scrollList {
width: 100%;
height: 100%;
}
.container {
// margin-top: -20px;
}
::v-deep .el-tabs,
.el-tabs__content,
.el-tab-pane {
width: 100%;
height: 100%;
}
::v-deep .el-tabs__content {
width: 100%;
height: calc(100% - 50px);
}
::v-deep .el-tab-pane {
width: 100%;
height: 100%;
}
.scrollList {
width: 100%;
height: calc(100% - 40px);
overflow: auto;
}
.draggable {
position: relative;
transition: all 0.3s;
.icon {
position: absolute;
left: 10px;
......@@ -606,10 +658,12 @@ export default {
z-index: 10;
}
}
::v-deep .el-icon-circle-close {
color: #fff;
}
}
.skillTab {
width: 100%;
height: calc(100% - 60px);
......@@ -640,6 +694,7 @@ export default {
.tagList {
.tagItem {
transition: all 0.3s ease;
&:hover {
background-color: #f5f7fa;
}
......
......@@ -5,178 +5,96 @@
</div> -->
<div class="account-task-container-content" v-scroll="requestOrderList">
<!-- 运营任务 和 用户任务 -->
<div
class="orderDetailsScroll"
v-loading="loading"
>
<div class="orderDetailsScroll" v-loading="loading">
<div v-if="orderList.length > 0">
<div
v-for="(item, index) in orderList"
:key="index"
class="orderDetails"
>
<div v-for="(item, index) in orderList" :key="index" class="orderDetails">
<div class="orderDetailsList">
<el-collapse
v-model="collapseValue"
@change="handleChange(item,$event)"
>
<el-collapse-item :name="item.order_id || '--'">
<el-collapse v-model="collapseValue" @change="handleChange(item, $event)">
<el-collapse-item :name="item?.order_id || '--'">
<template slot="title">
<div class="orderDetailsTitle">
<div class="money rowFlex spaceBetween">
<p class="text">{{ item.role_name }} - {{ item.server_name }} - ¥{{ item.recharge_total }}</p>
<div class="btns">
<span style="color: #0988f2">{{ taskTypeList.find((items) => items.value == item.plan_type) && taskTypeList.find((items) => items.value == item.plan_type).label?taskTypeList.find((items) => items.value == item.plan_type).label:'' }}</span>
<span
v-if="item.status_name"
class="btn"
:class="[item.status_name == '待跟进' ? 'noSend' : '', item.status_name == '已跟进' ? 'sended' : '', item.status_name == '已完成' ? 'sended' : '', item.status_name == '跟进中' ? 'noSend' : '']"
>{{ item.status_name }}</span>
<span style="color: #0988f2">{{taskTypeList.find((items) => items.value == item.plan_type) &&
taskTypeList.find((items) => items.value == item.plan_type).label ? taskTypeList.find((items)
=> items.value == item.plan_type).label:'' }}</span>
<span v-if="item.status_name" class="btn"
:class="[item.status_name == '待跟进' ? 'noSend' : '', item.status_name == '已跟进' ? 'sended' : '', item.status_name == '已完成' ? 'sended' : '', item.status_name == '跟进中' ? 'noSend' : '']">{{
item.status_name }}</span>
</div>
</div>
</div>
</template>
<div class="editLayer">
<el-form
:model="webForm"
label-width="100px"
>
<el-form-item
label="跟进客服:"
>
<el-form :model="webForm" label-width="100px">
<el-form-item label="跟进客服:">
<p class="text" style="margin-left: 10px;">{{ item.tracer_name || '--' }}</p>
</el-form-item>
<el-form-item
label="待维护日期:"
>
<el-form-item label="待维护日期:">
<p class="text" style="margin-left: 10px;">{{ item.assignment_time }}</p>
</el-form-item>
<!-- 新增异常原因筛选 当 plan_type==5 5:为大R异跟进异常时 新增异常原因筛选 -->
<el-form-item
v-if="taskInfo.plan_type && taskInfo.plan_type==5"
label="异常原因"
prop="abnormal_types"
>
<el-select
v-model="webForm.abnormal_types"
placeholder="请选择"
multiple
style="margin-left: 10px;"
collapse-tags
>
<el-option
v-for="item in errorTypeList"
:key="item.value"
:label="item.label"
:value="item.value"
>
<el-form-item v-if="taskInfo.plan_type && taskInfo.plan_type == 5" label="异常原因"
prop="abnormal_types">
<el-select v-model="webForm.abnormal_types" placeholder="请选择" multiple
style="margin-left: 10px;" collapse-tags>
<el-option v-for="item in errorTypeList" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item
label="跟进结果:"
prop="trace_result"
>
<el-select
v-model="webForm.trace_result"
placeholder="请选择"
style="margin-left: 10px;"
>
<el-option
v-for="item in traceList"
:key="item.value"
:label="item.label"
:value="item.value"
> </el-option>
<el-form-item label="跟进结果:" prop="trace_result">
<el-select v-model="webForm.trace_result" placeholder="请选择" style="margin-left: 10px;">
<el-option v-for="item in traceList" :key="item.value" :label="item.label"
:value="item.value"> </el-option>
</el-select>
</el-form-item>
<el-form-item
v-if="activeType == 'user_task'"
label="免打扰:"
prop="no_trouble"
style="margin-left: 10px;"
>
<el-form-item v-if="activeType == 'user_task'" label="免打扰:" prop="no_trouble"
style="margin-left: 10px;">
<div class="noDisturb">
<el-checkbox
v-model="webForm.no_trouble"
class="noDisturb rowFlex "
:true-label="1"
:false-label="0"
>免打扰(勾选后该用户不会再被分配任务)</el-checkbox>
<el-checkbox v-model="webForm.no_trouble" class="noDisturb rowFlex " :true-label="1"
:false-label="0">免打扰(勾选后该用户不会再被分配任务)</el-checkbox>
</div>
</el-form-item>
</el-form>
</div>
<div
v-for="(remark, indexs) in item.remarks"
:key="indexs"
class="item rowFlex columnCenter spaceBetween"
>
<div
class="rowFlex spaceBetween remarkItem"
style="width: 100%;"
>
<span
style="margin-left: 40px;color: #999999;"
>备注:</span>
<div v-for="(remark, indexs) in item.remarks" :key="indexs"
class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex spaceBetween remarkItem" style="width: 100%;">
<span style="margin-left: 40px;color: #999999;">备注:</span>
<div class="remarkTxext rowFlex remark flex1">
<textEditor
:remark.sync="remark.remark"
:domid="'taskRemark' + indexs"
style="width: 100%;"
:contenteditable="!Boolean(remark.id)"
@resultReamrk="resultReamrk"
/>
<textEditor :remark.sync="remark.remark" :domid="'taskRemark' + indexs" style="width: 100%;"
:contenteditable="!Boolean(remark.id)" @resultReamrk="resultReamrk" />
</div>
<i
v-if="indexs == 0"
class="el-icon-circle-plus-outline remarkHandle"
type="primary"
@click="addRemark(index)"
></i>
<i
v-else-if="indexs != 0 && !remark.id"
class="el-icon-remove-outline remarkHandle"
type="primary"
@click="removeRemark(index, indexs)"
></i>
<i v-if="indexs == 0" class="el-icon-circle-plus-outline remarkHandle" type="primary"
@click="addRemark(index)"></i>
<i v-else-if="indexs != 0 && !remark.id" class="el-icon-remove-outline remarkHandle"
type="primary" @click="removeRemark(index, indexs)"></i>
</div>
</div>
<div
class="btns rowFlex allCenter"
style="margin-top: 20px"
>
<el-button
:disabled="item.status==3"
:loading="remarkLoading"
@click="saveRemak(item, index)"
>保存</el-button>
<el-button
type="primary"
:disabled="item.status==3"
:loading="taskLoading"
@click="completeTask(item, index)"
>保存并完成任务</el-button>
<div class="btns rowFlex allCenter" style="margin-top: 20px">
<el-button :disabled="item.status == 3" :loading="remarkLoading"
@click="saveRemak(item, index)">保存</el-button>
<el-button type="primary" :disabled="item.status == 3" :loading="taskLoading"
@click="completeTask(item, index)">保存并完成任务</el-button>
</div>
</el-collapse-item>
</el-collapse>
</div>
</div>
</div>
<div
v-else-if="!loading && orderList.length == 0"
style="margin-top: 100px;"
class="noContent rowFlex allCenter"
>
<div v-else-if="!loading && orderList.length == 0" style="margin-top: 100px;"
class="noContent rowFlex allCenter">
<noContent />
</div>
</div>
</div>
</div>
</template>
<script>
</template>
<script>
import { taskTrack, taskRecord, logsSave, searchcondition } from '@/api/game'
import { mapState } from 'vuex'
import textEditor from '@/components/textEditor.vue'
......@@ -444,16 +362,18 @@
}
}
</script>
<style lang="scss" scoped>
.task-info-container {
<style lang="scss" scoped>
.task-info-container {
width: 100%;
height: 100%;
background: #fff;
position: relative;
overflow: hidden;
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
line-height: 32px;
}
.detailsTitle {
width: 100%;
padding: 0 10px;
......@@ -464,10 +384,12 @@
color: #333333;
border-bottom: 1px solid #ebeef5;
border-left: 1px solid #ebeef5;
p {
color: #333333;
}
}
.account-task-container-content {
width: 100%;
height: 100%;
......@@ -475,8 +397,10 @@
overflow-x: hidden;
padding: 20px 0;
padding-top: 0px;
.contentItem {
position: relative;
.title {
position: absolute;
left: 10px;
......@@ -485,6 +409,7 @@
color: #999999;
}
}
.taskItem {
width: 100%;
height: auto;
......@@ -493,36 +418,43 @@
color: #333333;
transition: all 0.5s;
position: relative;
div {
width: 100%;
margin-bottom: 5px;
}
.remark {
::v-deep .el-textarea__inner {
height: 80px;
}
}
.tableImage {
width: 40px;
height: 40px;
border-radius: 6px;
margin-right: 10px;
}
.label {
color: #999999;
}
.text {
color: #333333;
margin-left: 10px;
word-break: break-all;
max-width: 75%;
}
.icon {
display: none;
position: absolute;
right: 0;
top: 12px;
}
.dianFail {
display: inline-block;
width: 8px;
......@@ -530,6 +462,7 @@
background: #f45454;
border-radius: 5px;
}
.dian {
display: inline-block;
width: 8px;
......@@ -537,6 +470,7 @@
background: #00bf8a;
border-radius: 5px;
}
.dian2 {
display: inline-block;
width: 8px;
......@@ -551,51 +485,62 @@
height: 80px;
// margin-left: -20px;
padding: 10px 0;
.orderMoneyItem {
width: 50%;
text-align: center;
margin-top: 5px;
span {
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333333;
}
p {
font-size: 22px;
color: #00bf8a;
}
}
}
.filterList {
margin-bottom: 10px;
.filterListInput {
width: 60%;
margin-left: 15px;
margin-bottom: 10px;
}
.filterListDate {
width: 150px;
margin-bottom: 10px;
}
::v-deep .search-item .item-label {
margin-right: 20px;
}
}
.orderDetailsScroll {
width: 100%;
}
.orderDetails {
width: 100%;
height: auto;
margin-top: 20px;
position: relative;
.bridgeMain {
position: absolute;
top: 0px;
right: 0px;
width: 50px;
height: 50px;
.text {
font-size: 8px;
font-family: PingFangSC-Regular, PingFang SC;
......@@ -609,6 +554,7 @@
width: 50px;
text-align: center;
}
.bridge {
font-size: 50px;
position: absolute;
......@@ -620,12 +566,15 @@
.orderDetailsTitle {
width: 100%;
background: #f9faff;
.money {
width: 100%;
height: auto;
.btns {
margin-right: 20px;
}
.btn {
background: #fff;
border-radius: 4px;
......@@ -635,6 +584,7 @@
color: #333333;
cursor: pointer;
}
.btnnot {
background: #ffdddd;
font-family: PingFangSC-Regular, PingFang SC;
......@@ -642,6 +592,7 @@
color: #f56c6c;
border: none;
}
.btnsuccess {
background: #e1fff0;
font-family: PingFangSC-Regular, PingFang SC;
......@@ -649,6 +600,7 @@
color: #00bf8a;
border: none;
}
.sended {
padding: 0 8px;
height: 20px;
......@@ -660,6 +612,7 @@
font-weight: 400;
color: #00bf8a;
}
.noSend {
padding: 0 8px;
height: 20px;
......@@ -672,6 +625,7 @@
color: #ffa81d;
}
}
.text {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
......@@ -679,16 +633,20 @@
color: #333333;
max-width: 200px;
overflow: hidden;
white-space: nowrap; /* 防止文字换行 */
text-overflow: ellipsis; /* 超出部分显示省略号 */
white-space: nowrap;
/* 防止文字换行 */
text-overflow: ellipsis;
/* 超出部分显示省略号 */
}
}
.orderDetailsList {
width: 100%;
height: auto;
background: #ffffff;
border: 1px solid #ebeef5;
position: relative;
.titleFix {
position: absolute;
left: 10px;
......@@ -698,31 +656,37 @@
}
}
}
.remarkHandle {
font-size: 20px;
color: #0ac358;
cursor: pointer;
margin-right: 5px;
position:absolute;
position: absolute;
right: 0;
top: 0;
}
::v-deep .el-tabs__item {
line-height: 26px;
font-size: 16px;
font-weight: 500;
}
.remarkTxext{
.remarkTxext {
width: calc(100% - 120px);
margin-left: 10px;
}
.remarkItem{
.remarkItem {
margin-left: 40px;
position: relative;
}
::v-deep .el-collapse {
border: none;
}
::v-deep .el-collapse-item__header {
width: 100%;
color: #333333;
......@@ -734,33 +698,39 @@
text-overflow: ellipsis;
white-space: nowrap;
}
::v-deep .el-collapse-item__arrow {
position: absolute;
right: 5px;
}
::v-deep .el-collapse-item__content{
::v-deep .el-collapse-item__content {
padding: 10px;
}
.editLayer {
padding: 10px 0;
.noDisturb {
display: flex;
align-items: center;
margin-top: 4px;
}
::v-deep .el-form-item__label {
font-weight: normal;
color: #999999;
padding-right: 8px;
}
::v-deep .el-form-item {
margin-bottom: 14px;
}
::v-deep .el-select, ::v-deep .el-checkbox {
::v-deep .el-select,
::v-deep .el-checkbox {
width: 100%;
}
}
}
</style>
\ No newline at end of file
}
</style>
\ No newline at end of file
import { getRoleRecentActivityNotPushNumApi } from '@/api/game';
// 账号近期要开活动数
let roleRecentActivityNotPushNum = null;
let cacheMemberId = null; //缓存请求id
const computedMap = new Map([]); //观察者列表
// 观察者收集
export function roleRecentActivitySubscription(fn, key) {
computedMap.set(key, fn);
}
//通知所有观察者
function roleRecentActivityRelease() {
computedMap.forEach((fn) => {
fn(roleRecentActivityNotPushNum);
});
}
function setCacheMemberId(member_id) {
cacheMemberId = member_id;
}
//获取数据
export async function queryRoleRecentActivityNotPushNum(
member_id = cacheMemberId
) {
const { data } = await getRoleRecentActivityNotPushNumApi({
member_id: member_id,
});
roleRecentActivityNotPushNum = data.data;
roleRecentActivityRelease();
}
function validate(v) {
if (!roleRecentActivityNotPushNum)
console.log(new Error(`执行${v},但是数据为空`));
}
//获取总数量
export function getTotalNum() {
validate('getTotalNum');
return roleRecentActivityNotPushNum?.totalNum || null;
}
//获取列表
export function getRoleNum() {
validate('getRoleNum');
return roleRecentActivityNotPushNum?.roleNum;
}
//销毁
export function destroy() {
roleRecentActivityNotPushNum = null;
cacheMemberId = null;
computedMap.clear();
}
//初始化
export async function createRoleRecentActivityNotPushNum(member_id) {
if (member_id && member_id !== cacheMemberId) {
setCacheMemberId(member_id);
await queryRoleRecentActivityNotPushNum(member_id);
}
return {
roleRecentActivitySubscription,
queryRoleRecentActivityNotPushNum,
getTotalNum,
getRoleNum,
destroy,
};
}
......@@ -5,27 +5,44 @@
<p class="loginContentTitle">选择客服:</p>
<div class="loginContentInput rowFlex alignCenter">
<el-select v-model="cser_user_id" filterable placeholder="请选择客服">
<el-option v-for="item in userList" :key="item.zq_user_id" clearable :label="item.name" :value="item.zq_user_id">
<el-option
v-for="item in userList"
:key="item.zq_user_id"
clearable
:label="item.name"
:value="item.zq_user_id"
>
</el-option>
</el-select>
<el-button type="primary" style="margin-left: 10px;" size="small" @click="loginConfirm">点击登录</el-button>
<el-button
type="primary"
style="margin-left: 10px"
size="small"
@click="loginConfirm"
>点击登录</el-button
>
</div>
</div>
</div>
</template>
<script>
import * as ww from '@wecom/jssdk'
import { getOrganization, getAuthUser, getSignature,getUserList,cserSelected } from '@/api/user'
import Cookies from 'js-cookie'
import { getParams } from '@/utils/index'
import { mapMutations, mapState } from 'vuex'
import { getToken, setToken } from '@/utils/auth'
import jsApiList from '@/utils/jsApiList'
import * as ww from '@wecom/jssdk';
import {
getOrganization,
getAuthUser,
getSignature,
getUserList,
cserSelected,
} from '@/api/user';
import Cookies from 'js-cookie';
import { getParams } from '@/utils/index';
import { mapMutations, mapState } from 'vuex';
import { getToken, setToken } from '@/utils/auth';
import jsApiList from '@/utils/jsApiList';
export default {
name: 'login',
components: {
},
components: {},
data() {
return {
wecomUserInfo: null, // 企微用户信息
......@@ -39,120 +56,155 @@ export default {
hoveredOrg: null,
showRefresh: false, // 控制刷新按钮显示
qrLoading: false, // 控制二维码 loading
redirectUri: process.env.NODE_ENV === 'production' ? 'https://companywx.zwnet.cn/api/api/sidebar_login/ding' : 'https://companywx.zwwlkj03.top/api/api/sidebar_login/ding',
redirectUri:
process.env.NODE_ENV === 'production'
? 'https://companywx.zwnet.cn/api/api/sidebar_login/ding'
: 'https://companywx.zwwlkj03.top/api/api/sidebar_login/ding',
DDTestUrl: '',
token: getToken(),
userList: [],
cser_user_id: null,
}
};
},
async mounted() {
this.$nextTick(() => {
this.initLogin()
})
this.initLogin();
});
},
computed: {
...mapState('user', ['corp_id'])
...mapState('user', ['corp_id']),
},
methods: {
...mapMutations('user', ['set_corp_id', 'set_userid', 'set_userInfo', 'set_token', 'set_cser_info', 'set_signData', 'set_cser_id', 'set_cser_name', 'set_external_userid']),
...mapMutations('user', [
'set_corp_id',
'set_userid',
'set_userInfo',
'set_token',
'set_cser_info',
'set_signData',
'set_cser_id',
'set_cser_name',
'set_external_userid',
]),
async initLogin() {
const urlParams = getParams();
const userid = Cookies.get('userid');
if (this.token && userid) { // 已经钉钉扫码过 重新获取授权 获取签名 注册企微js-sdk
this.getUserList(userid)
if (this.token && userid) {
// 已经钉钉扫码过 重新获取授权 获取签名 注册企微js-sdk
this.getUserList(userid);
await this.getSignature();
} else if(!userid) {
} else if (!userid) {
await this.startWeComSilentAuth();
}else if(!this.token){
this.getUserList(userid)
} else if (!this.token) {
this.getUserList(userid);
}
},
async getUserList(userid) {
this.urlParams = getParams();
const corp_id = Cookies.get('corp_id') || this.urlParams.corp_id
const res = await getUserList({ userid: userid,corp_id:corp_id });
this.userList = res.data
const corp_id = Cookies.get('corp_id') || this.urlParams.corp_id;
const res = await getUserList({ userid: userid, corp_id: corp_id });
this.userList = res.data;
},
async userStartLogin(){
if(!this.cser_user_id){
this.$message.error('请选择客服人员')
return
async userStartLogin() {
if (!this.cser_user_id) {
this.$message.error('请选择客服人员');
return;
}
const cser_user = this.userList.find(item => item.zq_user_id === this.cser_user_id)
const corp_id = Cookies.get('corp_id')
const userid = Cookies.get('userid')
this.cacheCser(cser_user.zq_user_id, cser_user.name)
const cser_user = this.userList.find(
(item) => item.zq_user_id === this.cser_user_id
);
const corp_id = Cookies.get('corp_id');
const userid = Cookies.get('userid');
this.cacheCser(cser_user.zq_user_id, cser_user.name);
try {
const res = await cserSelected({ cser_id: cser_user.zq_user_id, corp_id: corp_id,userid:userid });
console.log(res, '选择客服人员登录')
if(res.status_code === 1 && res.data.tokens ){
const res = await cserSelected({
cser_id: cser_user.zq_user_id,
corp_id: corp_id,
userid: userid,
});
console.log(res, '选择客服人员登录');
if (res.status_code === 1 && res.data.tokens) {
this.$message({
type: 'warning',
message: `当前【${cser_user.name}】已上线,下班后请记得点击下线哦~`,
duration: 3 * 1000
})
duration: 3 * 1000,
});
setTimeout(() => {
this.handleDingCallback(res.data.tokens )
}, 2000)
}else{
this.$message.error(res.msg)
this.handleDingCallback(res.data.tokens);
}, 2000);
} else {
this.$message.error(res.msg);
setTimeout(() => {
window.location.href = window.location.origin + '/company_app/index.html?corp_id=' + corp_id + '&msg=cser_error'
}, 5000)
window.location.href =
window.location.origin +
'/company_app/index.html?corp_id=' +
corp_id +
'&msg=cser_error';
}, 5000);
}
} catch (error) {
console.log(error, '选择客服人员登录失败')
this.$message.error(error.msg)
console.log(error, '选择客服人员登录失败');
this.$message.error(error.msg);
setTimeout(() => {
window.location.href = window.location.origin + '/company_app/index.html?corp_id=' + corp_id + '&msg=cser_error'
}, 5000)
window.location.href =
window.location.origin +
'/company_app/index.html?corp_id=' +
corp_id +
'&msg=cser_error';
}, 5000);
}
},
loginConfirm(){
const cser_user = this.userList.find(item => item.zq_user_id === this.cser_user_id)
this.$confirm(`确认登录上线吗,上线后所有会话都会归属到客服【${cser_user.name}】`, '提示', {
loginConfirm() {
const cser_user = this.userList.find(
(item) => item.zq_user_id === this.cser_user_id
);
this.$confirm(
`确认登录上线吗,上线后所有会话都会归属到客服【${cser_user.name}】`,
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.userStartLogin()
}).catch(() => {
this.$message.info('已取消登录')
type: 'warning',
}
)
.then(() => {
this.userStartLogin();
})
.catch(() => {
this.$message.info('已取消登录');
});
},
// 设置缓存
cacheCorp_id(corp_id) {
Cookies.set('corp_id', corp_id, { expires: 7 })
this.set_corp_id(corp_id)
Cookies.set('corp_id', corp_id, { expires: 30 });
this.set_corp_id(corp_id);
},
cacheuserid(userid) {
Cookies.set('userid', userid, { expires: 7 })
this.set_userid(userid)
Cookies.set('userid', userid, { expires: 30 });
this.set_userid(userid);
},
cacheCser(cser_id, cser_name) {
Cookies.set('cser_id', cser_id, { expires: 7 })
Cookies.set('cser_name', cser_name, { expires: 7 })
Cookies.set('cser_id', cser_id, { expires: 30 });
Cookies.set('cser_name', cser_name, { expires: 30 });
this.set_cser_info({
cser_id: cser_id,
cser_name: cser_name
})
this.set_cser_id(cser_id)
this.set_cser_name(cser_name)
cser_name: cser_name,
});
this.set_cser_id(cser_id);
this.set_cser_name(cser_name);
},
cacheSignData(signData) {
Cookies.set('signData', JSON.stringify(signData), { expires: 7 })
this.set_signData(signData)
Cookies.set('signData', JSON.stringify(signData), { expires: 30 });
this.set_signData(signData);
},
// 进入的页面地址是 https://companywx.jianshuwenhua.com/company_app/index.html?corp_id=wweaefe716636df3d1
// 1. 企微静默授权
async startWeComSilentAuth() {
this.urlParams = getParams();
const corp_id = Cookies.get('corp_id') || this.urlParams.corp_id
const corp_id = Cookies.get('corp_id') || this.urlParams.corp_id;
if (!corp_id) {
this.$message.error('当前客服号信息异常,请切换会话后重试')
return
this.$message.error('当前客服号信息异常,请切换会话后重试');
return;
}
// 确定是第一次进入页面 没有 code 和 state
if (!this.urlParams.code && !this.urlParams.state) {
......@@ -163,61 +215,72 @@ export default {
return;
}
// 用code
const res = await getAuthUser({ code: this.urlParams.code, url: window.location.href, corp_id: corp_id });
const res = await getAuthUser({
code: this.urlParams.code,
url: window.location.href,
corp_id: corp_id,
});
if (res.status_code === 1) {
if(res.data.userid){
this.cacheuserid(res.data.userid)
this.getUserList(res.data.userid)
}else{
this.$message.error('获取用户id失败')
return
if (res.data.userid) {
this.cacheuserid(res.data.userid);
this.getUserList(res.data.userid);
} else {
this.$message.error('获取用户id失败');
return;
}
} else {
console.log('获取useid失败', res)
console.log('获取useid失败', res);
// 错误处理
}
},
async getSignature() {
console.log('获取签名', window.location.href)
const corp_id = Cookies.get('corp_id')
console.log('获取签名', window.location.href);
const corp_id = Cookies.get('corp_id');
try {
const res = await getSignature({ corp_id: corp_id, path: window.location.href });
const res = await getSignature({
corp_id: corp_id,
path: window.location.href,
});
if (res.status_code === 1) {
this.signData = res.data
this.cacheSignData(res.data)
this.signData = res.data;
this.cacheSignData(res.data);
try {
this.registerWeComSDK();
} catch (err) {
console.log(err, '初始化sdk 失败')
console.log(err, '初始化sdk 失败');
}
}
} catch (err) {
console.log(err, '获取签名失败')
window.location.href = window.location.origin + '/company_app/index.html?corp_id=' + corp_id + '&msg=signerror'
console.log(err, '获取签名失败');
window.location.href =
window.location.origin +
'/company_app/index.html?corp_id=' +
corp_id +
'&msg=signerror';
}
},
getCurExternalContact() {
this.$ww.getCurExternalContact({
success: (res) => {
if (res.err_msg === "getCurExternalContact:ok") {
console.log(res, '重新进入获取企微外部联系人')
this.set_external_userid(res.userId)
if (res.err_msg === 'getCurExternalContact:ok') {
console.log(res, '重新进入获取企微外部联系人');
this.set_external_userid(res.userId);
// 确保 Vuex 状态更新后再跳转
this.$nextTick(() => {
this.$router.replace('/')
console.log(window.location.href, 'window.location.hrefuserInfo')
})
this.$router.replace('/');
console.log(window.location.href, 'window.location.hrefuserInfo');
});
}
},
fail: (err) => {
console.log(err, '获取企微外部联系人失败')
console.log(err, '获取企微外部联系人失败');
// 错误处理
}
},
});
},
// 2. 注册企微JS-SDK
registerWeComSDK() {
console.log('删除企业签名', 1231)
console.log('删除企业签名', 1231);
this.$ww.register({
corpId: Cookies.get('corp_id'),
agentId: this.signData.agent_id,
......@@ -228,58 +291,60 @@ export default {
// signature: this.signData.corp_signature,
// }),
// 只用到应用的 api 可以只进行应用的签名
getAgentConfigSignature: () => Promise.resolve({
getAgentConfigSignature: () =>
Promise.resolve({
nonceStr: this.signData.nonce_str,
timestamp: this.signData.signature_time,
signature: this.signData.agent_signature,
}),
onAgentConfigSuccess: (res) => {
console.log('注册成功可以调用企微 js-sdk', res)
console.log('注册成功可以调用企微 js-sdk', res);
// 注册成功后不立即获取外部联系人,等钉钉扫码后再获取
this.getCurExternalContact()
this.getCurExternalContact();
},
onAgentConfigFail: (err) => {
console.log('注册失败不能使用企微js-sdk', err)
console.log('注册失败不能使用企微js-sdk', err);
// 错误处理123
}
},
});
},
// 3. 获取组织列表并选取默认组织
async initOrganization() {
const res = await getOrganization();
if (res.data.status_code === 1) {
this.orgList = res.data.data.data.filter(item => item.id <= this.organizationNum)
this.orgList = res.data.data.data.filter(
(item) => item.id <= this.organizationNum
);
// 默认组织逻辑:可根据业务自定义
this.initCurrentApp();
}
},
initCurrentApp() {
const currentApp = this.orgList.find(
(item) => item.app_key === "dingjigp0ksn9nbljdli"
(item) => item.app_key === 'dingjigp0ksn9nbljdli'
);
this.$set(this, "currentOrg", currentApp);
this.$set(this, 'currentOrg', currentApp);
},
// 7. 钉钉扫码回调页面处理
async handleDingCallback(token) {
// 在这里处理钉钉扫码成功的回调
const corp_id = Cookies.get('corp_id')
const corp_id = Cookies.get('corp_id');
if (token && token != 'undefined') {
setToken(token)
this.set_token(token)
setToken(token);
this.set_token(token);
// 获取签名
await this.getSignature();
} else {
window.location.href = window.location.origin + '/company_app/index.html?corp_id=' + corp_id + '&msg=notoken'
window.location.href =
window.location.origin +
'/company_app/index.html?corp_id=' +
corp_id +
'&msg=notoken';
}
},
},
}
};
</script>
<style lang="scss" scoped>
......@@ -294,12 +359,14 @@ export default {
align-items: center;
justify-content: center;
}
.loginContentTitle{
.loginContentTitle {
font-size: 14px;
line-height: 32px;
margin-right: 10px;
text-align: left;
}
.qr-contain {
margin: 0 auto;
/* margin-top: 20px; */
......@@ -329,7 +396,7 @@ export default {
i {
line-height: 40px;
font-size: 26px;
color: #3491FA;
color: #3491fa;
cursor: pointer;
}
}
......@@ -359,7 +426,7 @@ export default {
width: 40px;
height: 40px;
border: 4px solid #e0e0e0;
border-top: 4px solid #3491FA;
border-top: 4px solid #3491fa;
border-radius: 50%;
animation: spin 1s linear infinite;
}
......
<template>
<div v-loading="loading">
<div class="px-[20px] h-full space-y-[8px] rounded-[4px] overflow-y-auto">
<template v-if="list.length">
<div
class="bg-[#F7F8FA] min-h-[99px] p-[8px]"
v-for="item in list"
:key="item.id"
>
<div
class="text-[#131920] pb-[8px] text-[14px] border-b-[1px] border-solid border-[#E5E5E6]"
>
<div>{{ item.name }}活动</div>
<div class="text-[#86909C] text-[12px]">
主服 {{ item.main_server_day }} 天开启
</div>
</div>
<div class="text-[13px] flex pt-[8px]">
<!-- <div class="text-[#6D7176] mr-[16px] flex-shrink-0">活动详情</div> -->
<div class="text-[#131920]">{{ item.detail }}</div>
</div>
</div>
</template>
<svg-icon v-else icon-class="noContent" class="text-[280px]" />
</div>
</div>
</template>
<script>
import { mapState } from 'vuex';
import { getRecentActivityListApi } from '@/api/game';
export default {
name: 'ActivityConfigurationList',
components: {},
props: ['role_id'],
data() {
return {
list: [],
loading: false,
};
},
computed: {
...mapState('game', ['gameUserInfo']),
},
methods: {
async getRecentActivityList() {
try {
this.loading = true;
const { data } = await getRecentActivityListApi({
role_id: this.role_id,
main_game_id: this.gameUserInfo.main_game_id,
weixin_blongs_id: this.gameUserInfo.weixin_blongs_id,
});
this.list = data.data;
} catch (error) {
} finally {
this.loading = false;
}
},
},
created() {
this.getRecentActivityList();
},
};
</script>
<style lang="scss" scoped></style>
<!--
* @Author: maoxiya 937667504@qq.com
* @Date: 2025-09-03 14:05:20
* @LastEditors: maoxiya 937667504@qq.com
* @LastEditTime: 2025-09-05 16:35:19
* @FilePath: /company_app/src/views/popup/RecentActivitiesPopup/components/RecentActivitiesList.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<div v-loading="loading">
<div class="px-[20px] h-full gap-y-[8px] overflow-y-auto">
<template v-if="list.length">
<RecentActivities @handleUpdate="query" :item="item" v-for="item in list" :key="item.activity_rule_id" />
</template>
<svg-icon v-else icon-class="noContent" class="text-[280px]" />
</div>
</div>
</template>
<script>
import RecentActivities from '@/views/popup/RecentActivitiesPopup/templates/RecentActivities.vue';
import { getRoleRecentActivityListApi } from '@/api/game';
export default {
name: 'RecentActivitiesList',
components: { RecentActivities },
props: ['role_id'],
data() {
return {
list: [],
loading: false,
};
},
methods: {
async query() {
try {
this.loading = true;
const { data } = await getRoleRecentActivityListApi({
role_id: this.role_id,
});
this.list = data.data.reverse()
} catch (error) {
} finally {
this.loading = false;
}
},
},
created() {
this.query();
},
};
</script>
<style lang="scss" scoped></style>
// utils/componentHelper.js 或 useCreatePlayerDetails.js
import Vue from 'vue'
import RecentActivitiesPopup from './index.vue'
import store from '@/store' // 导入你的 Vuex store
export function createDetails(propsData = {}) {
const ComponentConstructor = Vue.extend(RecentActivitiesPopup)
const instance = new ComponentConstructor({
propsData,
// 手动注入 store
store
})
const mountNode = document.createElement('div')
document.querySelector('#recentActivitiesPopup').appendChild(mountNode)
instance.$mount(mountNode)
return {
instance,
destroy: () => {
instance.$destroy()
if (instance.$el && instance.$el.parentNode) {
instance.$el.parentNode.removeChild(instance.$el)
}
}
}
}
\ No newline at end of file
<template>
<div class="absolute z-10 top-0 left-0 h-full w-full bg-white" v-if="show">
<div
class="h-[60px] relative px-[18px] flex items-center border-b-[1px] border-solid border-[#e5e6eb]"
>
<i
class="el-icon-arrow-left text-[25px] hover:cursor-pointer"
@click="close"
></i>
<span
class="absolute left-1/2 top-1/2 transform -translate-x-1/2 -translate-y-1/2 text-[#323335] font-bold"
>{{ title }}</span
>
</div>
<el-tabs class="h-[40px]" v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="近期要开" name="0"> </el-tab-pane>
<el-tab-pane label="活动配置" name="1"> </el-tab-pane>
</el-tabs>
<RecentActivitiesList v-if="activeName === '0'" :role_id="role_id" />
<ActivityConfigurationList v-if="activeName === '1'" :role_id="role_id" />
</div>
</template>
<script>
import RecentActivitiesList from './components/RecentActivitiesList.vue';
import ActivityConfigurationList from './components/ActivityConfigurationList.vue';
export default {
name: 'RecentActivitiesPopup',
components: { RecentActivitiesList, ActivityConfigurationList },
data() {
return {
show: false,
activeName: '0',
role_id: '',
title: '',
};
},
methods: {
open(role_id, title) {
this.show = true;
this.role_id = role_id;
this.title = title;
},
handleClick() {},
close() {
this.show = false;
this.activeName = '0';
},
},
created() {},
};
</script>
<style lang="scss" scoped>
::v-deep .el-tabs__item {
padding: 0 20px !important;
}
</style>
<template>
<div
class="space-y-[12px] mt-[10px] !p-[8px] bg-[#F7F8FA] rounded-[4px] item"
>
<div>
<span class="label">近期要开:</span>
<el-popover
placement="top-start"
width="250"
trigger="hover"
:content="item.activity_rule_detail"
>
<span slot="reference">{{ item.activity_rule_name }}</span>
</el-popover>
</div>
<div>
<span class="label">开启时间:</span
><span>{{ item.open_activity_time }}</span>
</div>
<div>
<span class="label">关联客服:</span><span>{{ item.cser_name }}</span>
</div>
<div class="group flex items-center">
<span class="label flex-shrink-0">备注:</span
><span v-show="!editShow">{{ item.remark }}</span>
<el-input
@blur="updated"
v-show="editShow"
type="textarea"
:rows="2"
placeholder="请输入内容"
v-model.trim="textarea"
>
</el-input>
<svg-icon
icon-class="edit"
class="icon invisible group-hover:visible"
style="font-size: 14px"
@click="editRemark"
/>
</div>
<div class="flex items-center">
<span class="label flex-shrink-0">推送状态:</span>
<span v-if="item.is_push === '2'">已推送</span>
<el-select
v-else
class="w-[70px]"
:clearable="false"
:value="item.is_push"
@change="handleChange"
>
<el-option label="未推送" value="1"> </el-option>
<el-option label="已推送" value="2"> </el-option>
</el-select>
</div>
<div class="flex items-center">
<span class="label flex-shrink-0">推送话术:</span>
<span
class="group flex-1 w-0 flex items-center"
v-if="pushLanguageTechnique"
>
<el-popover
placement="bottom"
class="flex-1 flex w-0 speak"
width="250"
trigger="click"
>
<p class="max-h-[300px] overflow-y-auto">
{{ pushLanguageTechnique }}
</p>
<span class="truncate flex-1" slot="reference">{{
pushLanguageTechnique
}}</span>
</el-popover>
<i
class="el-icon-refresh mr-[8px] refreshList invisible group-hover:visible"
:class="isRefresh ? 'refreshListActive' : ''"
@click="refreshTag"
></i>
<svg-icon
icon-class="fuzhi"
class="icon invisible group-hover:visible"
style="font-size: 14px"
@click="copyText"
/>
</span>
<el-button
v-else
size="mini"
@click="queryGenerateProcedure(0)"
:loading="isRefresh"
>生成话术</el-button
>
</div>
<slot></slot>
</div>
</template>
<script>
import { getRoleRecentActivityEditApi } from '@/api/game.js';
import { getGenerateProcedureApi } from '@/api/skill';
import { mapState } from 'vuex';
import { queryRoleRecentActivityNotPushNum } from '@/views/hooks/useGetCount';
import { corp_activity_procedure_copyUsed } from '@/api/works';
const UpdateType = {
PUSH: 1, //修改推送
REMARK: 2, //修改备注
};
export default {
name: 'RecentActivitiesTemplate',
emits: ['handleUpdate'],
components: {},
props: ['item'],
data() {
return {
editShow: false,
textarea: '',
isRefresh: false,
pushLanguageTechnique: '', //推送话术
};
},
computed: {
...mapState('user', ['cser_id', 'cser_name']),
...mapState('game', ['accountSelect', 'bindGameUserList']),
nowGameUserInfo() {
return {
member_id: this.accountSelect,
username: this.bindGameUserList.find(
(item) => item.member_id == this.accountSelect
)?.username,
};
},
},
methods: {
editRemark() {
this.editShow = true;
this.textarea = this.item.remark;
},
async updated() {
this.editShow = false;
if (this.textarea === this.item.remark) return;
this.edit(UpdateType.REMARK);
},
handleChange() {
this.edit(UpdateType.PUSH);
},
async edit(type) {
try {
await getRoleRecentActivityEditApi({
type,
role_id: this.item.role_id,
open_activity_time: this.item.open_activity_time,
remark: this.textarea,
activity_rule_id: this.item.activity_rule_id,
is_push: 2,
user_id: this.cser_id,
user_name: this.cser_name,
});
this.$message.success('修改成功');
queryRoleRecentActivityNotPushNum(this.accountSelect);
this.$emit('handleUpdate');
} catch (error) {
this.$message.error(error);
}
},
async queryGenerateProcedure(is_regenerate) {
try {
this.isRefresh = true;
const { data } = await getGenerateProcedureApi({
...this.item,
...this.nowGameUserInfo,
is_regenerate,
});
this.pushLanguageTechnique = data.content;
this._id = data._id;
} catch (error) {
} finally {
this.isRefresh = false;
}
},
async copyText() {
try {
corp_activity_procedure_copyUsed({ _id: this._id });
await navigator.clipboard.writeText(this.pushLanguageTechnique);
this.$message.success('复制成功');
} catch (err) {
console.error('复制失败:', err);
}
},
refreshTag() {
this.queryGenerateProcedure(1);
},
},
created() {
console.log(this.nowGameUserInfo, 1111111);
},
};
</script>
<style lang="scss" scoped>
.item {
width: 100%;
height: auto;
font-size: 14px;
font-weight: 400;
color: #333333;
transition: all 0.5s;
position: relative;
cursor: pointer;
.label {
font-size: 14px;
color: #999999;
font-weight: 500;
margin-right: 8px;
}
.tag-icon {
cursor: pointer;
font-size: 14px;
color: #333333;
margin-right: 8px;
}
}
.refreshListActive {
animation: rotate 0.5s linear infinite;
}
.refreshList {
color: #3491fa;
cursor: pointer;
font-size: 18px;
}
::v-deep .el-input__inner {
background-color: transparent;
border: 0;
box-shadow: none;
padding: 0;
}
::v-deep .el-select .el-input.is-focus .el-input__inner {
border-color: transparent !important;
box-shadow: none;
}
::v-deep .speak .el-popover__reference-wrapper {
display: flex;
flex: 1;
width: 0;
}
</style>
<!--
* @Author: maoxiya 937667504@qq.com
* @Date: 2025-06-25 16:46:39
* @LastEditors: maoxiya 937667504@qq.com
* @LastEditTime: 2025-09-02 14:16:38
* @FilePath: /company_app/src/views/roleInfo.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<div class="roleTab">
<el-tabs v-model="roleActive">
<el-tab-pane label="角色信息" name="roleInfo">
<roleInfoPanel v-if="roleActive === 'roleInfo'" :chatUserDetails="chatUserInfo" />
</el-tab-pane>
<el-tab-pane label="举报信息" name="report">
<report v-if="roleActive === 'report'" />
<roleInfoPanel
v-if="roleActive === 'roleInfo'"
:chatUserDetails="chatUserInfo"
/>
</el-tab-pane>
<el-tab-pane label="申诉记录" name="approval">
<approval v-if="roleActive === 'approval'" />
</el-tab-pane>
<el-tab-pane label="违规记录" name="violation">
<violationRecord v-if="roleActive === 'violation'" />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import roleInfoPanel from './components/roleInfo/roleInfoPanel.vue'
import report from './components/roleInfo/report.vue'
import approval from './components/roleInfo/approval.vue'
import { mapState } from 'vuex'
import roleInfoPanel from './components/roleInfo/roleInfoPanel.vue';
import approval from './components/roleInfo/approval.vue';
import { mapState } from 'vuex';
import violationRecord from '@/views/ViolationRecord.vue';
export default {
name: 'roleInfo',
components: {
roleInfoPanel,
approval,
report
violationRecord,
},
computed: {
...mapState('game', ['chatUserInfo'])
...mapState('game', ['chatUserInfo']),
},
props: {
// report_is_send: {
......@@ -37,16 +49,13 @@ export default {
},
data() {
return {
roleActive: 'roleInfo'
}
roleActive: 'roleInfo',
};
},
methods: {
handleClick(value) {
}
}
}
handleClick(value) {},
},
};
</script>
<style lang="scss" scoped>
.roleTab {
......@@ -70,12 +79,12 @@ export default {
color: #333333;
&.is-active {
color: #3491FA;
color: #3491fa;
}
}
.el-tabs__active-bar {
background-color: #3491FA;
background-color: #3491fa;
height: 3px;
border-radius: 1.5px;
}
......@@ -92,7 +101,7 @@ export default {
.el-tabs__content {
height: calc(100% - 40px);
padding: 15px;
padding: 0 5px 5px;
}
}
}
......
<template>
<!-- 营销面板组件 -->
<div class="item">
<div class="rowFlex columnCenter">
<span class="label">营销面板:</span>
<i
v-if="recentInfo.role_id"
:class="['el-icon-arrow-' + (active ? 'down' : 'right'), 'tag-icon']"
@click="handleClick"
></i>
</div>
<RecentActivities
v-if="recentInfo.role_id"
:item="recentInfo"
v-show="active"
@handleUpdate="getRoleData"
>
<el-button
type="text"
size="mini"
@click="
() =>
recentActivitiesPopupInstance.instance.open(
recentInfo.role_id,
popupTitle
)
"
>
查看更多 >
</el-button>
</RecentActivities>
</div>
</template>
<script>
import RecentActivities from '@/views/popup/RecentActivitiesPopup/templates/RecentActivities.vue';
import { createDetails } from '@/views/popup/RecentActivitiesPopup/index.js';
import { getRoleRecentActivityOneApi } from '@/api/game';
import { getRoleHoLo } from '@/api/game';
import { mapState } from 'vuex';
export default {
name: 'MarketingPanel',
components: { RecentActivities },
data() {
return {
active: true,
recentActivitiesPopupInstance: null, //近期要开模块弹框
recentInfo: {},
roleInfoList: [],
};
},
computed: {
...mapState('game', ['accountSelect']),
popupTitle() {
const findItem = this.roleInfoList.find(
(item) => item.role_id == this.recentInfo.role_id
);
if (findItem) {
return `${findItem.role_name}-${findItem.server_name}-${findItem.recharge_total}元`;
}
return;
},
},
methods: {
async queryGetRoleHoLo() {
const { data } = await getRoleHoLo({
page_size: 100,
page: 1,
member_id: this.accountSelect,
search_type: 'list',
});
this.roleInfoList = data.data;
},
handleClick() {
this.active = !this.active;
},
async getRoleData() {
const { data } = await getRoleRecentActivityOneApi({
member_id: this.accountSelect,
});
this.recentInfo = data.data;
},
},
created() {
this.getRoleData();
this.queryGetRoleHoLo();
},
mounted() {
this.recentActivitiesPopupInstance = createDetails({
gameUserInfoInject: this.gameUserInfoInject,
});
},
beforeDestroy() {
this.recentActivitiesPopupInstance.destroy();
},
};
</script>
<style lang="scss" scoped>
.item {
width: 100%;
height: auto;
font-size: 14px;
padding: 16px;
font-weight: 400;
color: #333333;
padding: 10px 0;
transition: all 0.5s;
position: relative;
cursor: pointer;
.label {
font-size: 14px;
color: #999999;
font-weight: 500;
margin-right: 8px;
}
.tag-icon {
cursor: pointer;
font-size: 14px;
color: #333333;
margin-right: 8px;
}
}
.refreshListActive {
animation: rotate 0.5s linear infinite;
}
.refreshList {
color: #3491fa;
cursor: pointer;
font-size: 18px;
}
</style>
......@@ -3,9 +3,14 @@
<!-- 智能标签 -->
<div class="item rowFlex columnCenter">
<div class="rowFlex columnCenter">
<span class="label" style="min-width:60px;">智能标签:</span>
<span class="label" style="min-width: 60px">智能标签:</span>
<p class="text">
<el-tag v-for="(item,index) in chatUserDetails.intelligence_tag_group" :key="index" style="margin-right:5px;margin-bottom:5px;">{{ item.name }} </el-tag>
<el-tag
v-for="(item, index) in chatUserDetails.intelligence_tag_group"
:key="index"
style="margin-right: 5px; margin-bottom: 5px"
>{{ item.name }}
</el-tag>
</p>
</div>
<el-popover
......@@ -16,19 +21,24 @@
<i
slot="reference"
class="el-icon-refresh refreshList"
:class="isRefresh?'refreshListActive':''"
:class="isRefresh ? 'refreshListActive' : ''"
@click="refreshTag"
></i>
</el-popover>
</div>
<ZyouTag :game-user-info="gameUserInfo" :account-select="accountSelect" />
<div v-if="accountSelect && accountSelect!=='' && gameUserInfo.username">
<div v-if="accountSelect && accountSelect !== '' && gameUserInfo.username">
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">账号:</span>
<p class="text">{{ gameUserInfo.username }}</p> <span v-if="gameUserInfo.account_type==2" class="account_type"></span>
<p class="text">{{ gameUserInfo.username }}</p>
<span v-if="gameUserInfo.account_type == 2" class="account_type"
></span
>
</div>
</div>
<!-- 营销面板 -->
<MarketingPanel />
<!-- 充值金额 -->
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
......@@ -39,7 +49,7 @@
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">是否易主:</span>
<p class="text">{{ change_user==1?'是':'否' }}</p>
<p class="text">{{ change_user == 1 ? '是' : '否' }}</p>
<el-popconfirm
confirm-button-text="确定"
cancel-button-text="取消"
......@@ -62,7 +72,7 @@
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">白名单:</span>
<p class="text">{{ change_name==1?'是':'否' }}</p>
<p class="text">{{ change_name == 1 ? '是' : '否' }}</p>
<el-popconfirm
confirm-button-text="确定"
cancel-button-text="取消"
......@@ -84,7 +94,7 @@
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">异常账号:</span>
<p class="text">{{ change_risk==1?'是':'否' }}</p>
<p class="text">{{ change_risk == 1 ? '是' : '否' }}</p>
<el-popconfirm
confirm-button-text="确定"
cancel-button-text="取消"
......@@ -92,7 +102,11 @@
title="是否切换账号异常状态"
@confirm="changeRiskFn"
>
<div v-if="change_risk==0" slot="reference" class="rowFlex columnCenter changeUser">
<div
v-if="change_risk == 0"
slot="reference"
class="rowFlex columnCenter changeUser"
>
<p>
<i class="el-icon-sort-down"></i>
</p>
......@@ -103,22 +117,33 @@
</el-popconfirm>
</div>
</div>
<div v-if="gameUserInfo.role_info && gameUserInfo.role_info.role_level " class="item rowFlex columnCenter spaceBetween">
<div
v-if="gameUserInfo.role_info && gameUserInfo.role_info.role_level"
class="item rowFlex columnCenter spaceBetween"
>
<div class="rowFlex columnCenter">
<span class="label">等级:</span>
<p class="text">{{ gameUserInfo.role_info.role_level }}</p>
</div>
</div>
<div v-if="gameUserInfo.role_info && gameUserInfo.role_info.trans_check_status_text " class="item rowFlex columnCenter spaceBetween">
<div
v-if="
gameUserInfo.role_info &&
gameUserInfo.role_info.trans_check_status_text
"
class="item rowFlex columnCenter spaceBetween"
>
<div class="rowFlex columnCenter">
<span class="label">转端审核:</span>
<p class="text">{{ gameUserInfo.role_info.trans_check_status_text }}</p>
<p class="text">
{{ gameUserInfo.role_info.trans_check_status_text }}
</p>
</div>
</div>
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">近期是否被封禁:</span>
<p class="text">{{ gameUserInfo.is_banned==1?'是':'否' }}</p>
<p class="text">{{ gameUserInfo.is_banned == 1 ? '是' : '否' }}</p>
</div>
</div>
<div class="item rowFlex columnCenter spaceBetween">
......@@ -130,14 +155,22 @@
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">CP角色ID:</span>
<p v-if="gameUserInfo.role_info && gameUserInfo.role_info.cp_role_id" class="text">{{ gameUserInfo.role_info.cp_role_id }}</p>
<p
v-if="gameUserInfo.role_info && gameUserInfo.role_info.cp_role_id"
class="text"
>
{{ gameUserInfo.role_info.cp_role_id }}
</p>
</div>
</div>
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">是否愿意转端:</span>
<p class="text">
<el-radio-group v-model="chatUserDetails.transferred" @change="toTransfer">
<el-radio-group
v-model="chatUserDetails.transferred"
@change="toTransfer"
>
<el-radio :label="0"></el-radio>
<el-radio :label="1"></el-radio>
</el-radio-group>
......@@ -149,9 +182,19 @@
<span class="label">手机号:</span>
<p v-if="!showUserMobile" class="text">{{ gameUserInfo.mobile }}</p>
</div>
<el-input v-if="showUserMobile" v-model="newMobileValue" style="width: 120px; margin-left: 10px" @change="changeUserMobile" @blur="showUserMobile = false"></el-input>
<el-input
v-if="showUserMobile"
v-model="newMobileValue"
style="width: 120px; margin-left: 10px"
@change="changeUserMobile"
@blur="showUserMobile = false"
></el-input>
<!-- 暂时禁止用户修改手机号 -->
<i class="el-icon-edit icon" style="font-size: 14px" @click="editUserMobile"></i>
<i
class="el-icon-edit icon"
style="font-size: 14px"
@click="editUserMobile"
></i>
</div>
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
......@@ -171,33 +214,75 @@
<p class="text">{{ gameUserInfo.last_login_os }}</p>
</div>
</div>
<div v-if="gameUserInfo.service_wechat_number_info && gameUserInfo.service_wechat_number_info.length>0" class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter" style="width:100%;">
<div
v-if="
gameUserInfo.service_wechat_number_info &&
gameUserInfo.service_wechat_number_info.length > 0
"
class="item rowFlex columnCenter spaceBetween"
>
<div class="rowFlex columnCenter" style="width: 100%">
<span class="label">客服微信号:</span>
<div class="rowFlex columnCenter">
<!-- 显示第一个微信号 -->
<div class="rowFlex columnCenter">
<p class="hidden wxName">{{ gameUserInfo.service_wechat_number_info[0].service_wechat_number_name }}({{ gameUserInfo.service_wechat_number_info[0].service_type_name }})</p>
<span class="bradge">{{ gameUserInfo.service_wechat_number_info[0].type_name }}</span>
<div class="colorStatus rowFlex columnCenter" style="margin-left: 10px;">
<span v-if="gameUserInfo.service_wechat_number_info[0].loss_status==1" class="fail">{{ gameUserInfo.service_wechat_number_info[0].loss_status_text }}</span>
<p class="hidden wxName">
{{
gameUserInfo.service_wechat_number_info[0]
.service_wechat_number_name
}}({{
gameUserInfo.service_wechat_number_info[0].service_type_name
}})
</p>
<span class="bradge">{{
gameUserInfo.service_wechat_number_info[0].type_name
}}</span>
<div
class="colorStatus rowFlex columnCenter"
style="margin-left: 10px"
>
<span
v-if="
gameUserInfo.service_wechat_number_info[0].loss_status == 1
"
class="fail"
>{{
gameUserInfo.service_wechat_number_info[0].loss_status_text
}}</span
>
</div>
</div>
<!-- 如果有多个,显示 +n -->
<div v-if="gameUserInfo.service_wechat_number_info.length > 1">
<el-popover
placement="top"
trigger="hover"
width="300"
<el-popover placement="top" trigger="hover" width="300">
<div
v-for="(
item, index
) in gameUserInfo.service_wechat_number_info.slice(1)"
:key="index"
class="rowFlex columnCenter"
style="margin-bottom: 10px"
>
<div v-for="(item,index) in gameUserInfo.service_wechat_number_info.slice(1)" :key="index" class="rowFlex columnCenter" style="margin-bottom:10px;">
<p class="hidden wxName">{{ item.service_wechat_number_name }}({{ item.service_type_name }})</p>
<p class="hidden wxName">
{{ item.service_wechat_number_name }}({{
item.service_type_name
}})
</p>
<span class="bradge">{{ item.type_name }}</span>
<div class="colorStatus rowFlex columnCenter" style="margin-left: 10px;">
<span v-if="item.loss_status==1" class="fail">{{ item.loss_status_text }}</span>
<div
class="colorStatus rowFlex columnCenter"
style="margin-left: 10px"
>
<span v-if="item.loss_status == 1" class="fail">{{
item.loss_status_text
}}</span>
</div>
</div>
<el-button slot="reference" type="text" style="font-size: 14px;">+{{ gameUserInfo.service_wechat_number_info.length - 1 }}</el-button>
<el-button slot="reference" type="text" style="font-size: 14px"
>+{{
gameUserInfo.service_wechat_number_info.length - 1
}}</el-button
>
</el-popover>
</div>
</div>
......@@ -206,23 +291,27 @@
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">注册时间:</span>
<p class="text">{{ moment(gameUserInfo.reg_time * 1000).format('YYYY-MM-DD') }}</p>
<p class="text">
{{ moment(gameUserInfo.reg_time * 1000).format('YYYY-MM-DD') }}
</p>
</div>
</div>
</div>
</div>
</template>
<script>
import { bindMobile, getMemberLabel, editMemberLabel } from '@/api/game'
import { mapState, mapMutations } from 'vuex'
import { toTransfer, syncSessionIntelTag } from '@/api/works'
import moment from 'moment'
import ZyouTag from './ZyouTag.vue'
import { debounce } from '@/utils'
export default {
</template>
<script>
import { bindMobile, getMemberLabel, editMemberLabel } from '@/api/game';
import { mapState, mapMutations } from 'vuex';
import { toTransfer, syncSessionIntelTag } from '@/api/works';
import MarketingPanel from './MarketingPanel.vue';
import moment from 'moment';
import ZyouTag from './ZyouTag.vue';
import { debounce } from '@/utils';
export default {
name: 'gameUserInfo',
components: {
ZyouTag
ZyouTag,
MarketingPanel,
},
props: ['gameUserInfo', 'chatUserDetails'],
data() {
......@@ -235,54 +324,62 @@ import { debounce } from '@/utils'
change_appraisal: 0,
newMobileValue: '',
isRefresh: false,
showWxNumber: true
}
showWxNumber: true,
};
},
computed: {
...mapState('game', ['accountSelect'])
...mapState('game', ['accountSelect']),
},
watch: {
accountSelect: {
handler:debounce(function(newVal, oldVal) {
if (newVal && newVal !== "" && newVal !== oldVal) {
this.getMemberLabel()
}
},200),
immediate: false
handler: debounce(function (newVal, oldVal) {
if (newVal && newVal !== '' && newVal !== oldVal) {
this.getMemberLabel();
}
}, 200),
immediate: false,
},
},
mounted() {
this.$nextTick(() => {
if (this.accountSelect && this.accountSelect !== '') {
this.getMemberLabel()
this.getMemberLabel();
}
})
});
},
methods: {
getMemberLabel() {
const data = {
member_id: this.accountSelect,
label_type: [2, 3, 4, 6]
}
getMemberLabel(data).then(res => {
label_type: [2, 3, 4, 6],
};
getMemberLabel(data).then((res) => {
if (res?.data?.data?.length > 0) {
const change_user = res.data.data.find(item => item.label_type == 2)
const change_name = res.data.data.find(item => item.label_type == 3)
const change_risk = res.data.data.find(item => item.label_type == 4)// 风险用户
const change_appraisal = res.data.data.find(item => item.label_type == 6)// 石锤用户
this.change_user = change_user.label_value
this.change_name = change_name.label_value
this.change_risk = change_risk.label_value
this.change_appraisal = change_appraisal.label_value
this.$emit('changeAppraisal', this.change_appraisal)
const change_user = res.data.data.find(
(item) => item.label_type == 2
);
const change_name = res.data.data.find(
(item) => item.label_type == 3
);
const change_risk = res.data.data.find(
(item) => item.label_type == 4
); // 风险用户
const change_appraisal = res.data.data.find(
(item) => item.label_type == 6
); // 石锤用户
this.change_user = change_user.label_value;
this.change_name = change_name.label_value;
this.change_risk = change_risk.label_value;
this.change_appraisal = change_appraisal.label_value;
this.$emit('changeAppraisal', this.change_appraisal);
} else {
this.change_user = 0
this.change_name = 0
this.change_risk = 0
this.change_appraisal = 0
this.$emit('changeAppraisal', this.change_appraisal)
this.change_user = 0;
this.change_name = 0;
this.change_risk = 0;
this.change_appraisal = 0;
this.$emit('changeAppraisal', this.change_appraisal);
}
})
});
},
// 白名单
changeNameFn() {
......@@ -290,15 +387,17 @@ import { debounce } from '@/utils'
member_id: this.accountSelect,
create_user: this.cser_name,
label_type: 3,
label_value: this.change_name == 1 ? 0 : 1
}
label_value: this.change_name == 1 ? 0 : 1,
};
editMemberLabel(data).then((res) => {
if (res.status_code == 1) {
this.$message.success(res.msg)
this.change_name == 1 ? this.change_name = 0 : this.change_name = 1
this.$message.success(res.msg);
this.change_name == 1
? (this.change_name = 0)
: (this.change_name = 1);
}
this.$emit('update:show', false)
})
this.$emit('update:show', false);
});
},
// 异常账号
changeRiskFn() {
......@@ -306,100 +405,115 @@ import { debounce } from '@/utils'
member_id: this.accountSelect,
create_user: this.cser_name,
label_type: 4,
label_value: this.change_risk == 0 ? 1 : 0
}
label_value: this.change_risk == 0 ? 1 : 0,
};
editMemberLabel(data).then((res) => {
if (res.status_code == 1) {
this.$message.success(res.msg)
this.change_risk == 1 ? this.change_risk = 0 : this.change_risk = 1
this.$message.success(res.msg);
this.change_risk == 1
? (this.change_risk = 0)
: (this.change_risk = 1);
}
this.$emit('update:show', false)
})
this.$emit('update:show', false);
});
},
changeUserFn() {
const data = {
member_id: this.accountSelect,
create_user: this.cser_name,
label_type: 2,
label_value: this.change_user == 1 ? 0 : 1
}
label_value: this.change_user == 1 ? 0 : 1,
};
editMemberLabel(data).then((res) => {
if (res.status_code == 1) {
this.$message.success(res.msg)
this.change_user == 1 ? this.change_user = 0 : this.change_user = 1
this.$message.success(res.msg);
this.change_user == 1
? (this.change_user = 0)
: (this.change_user = 1);
}
this.$emit('update:show', false)
})
this.$emit('update:show', false);
});
},
toTransfer() {
const data = {
external_userid: this.chatUserDetails.external_userid,
userid: this.chatUserDetails.userid,
transferred: this.chatUserDetails.transferred
}
toTransfer(data).then(res => {
transferred: this.chatUserDetails.transferred,
};
toTransfer(data).then((res) => {
if (res.status_code == 1) {
this.$message.success(res.msg)
this.$message.success(res.msg);
}
})
});
},
// 修改用户手机号
changeUserMobile() {
if (!/^1((3[0-9])|(4[1579])|(5[0-9])|(6[6])|(7[0-9])|(8[0-9])|(9[0-9]))\d{8}$/.test(this.newMobileValue)) {
this.$message.warning('请填写正确的手机号')
return false
}
this.gameUserInfo.mobile = this.newMobileValue.substr(0, 3) + '****' + this.newMobileValue.substr(7)
this.showUserMobile = false
if (
!/^1((3[0-9])|(4[1579])|(5[0-9])|(6[6])|(7[0-9])|(8[0-9])|(9[0-9]))\d{8}$/.test(
this.newMobileValue
)
) {
this.$message.warning('请填写正确的手机号');
return false;
}
this.gameUserInfo.mobile =
this.newMobileValue.substr(0, 3) +
'****' +
this.newMobileValue.substr(7);
this.showUserMobile = false;
const data = {
member_id: this.accountSelect,
mobile: this.newMobileValue
}
mobile: this.newMobileValue,
};
bindMobile(data).then((res) => {
if (res.status_code == 1) {
this.$message.success(res.msg)
this.$message.success(res.msg);
}
})
});
},
editUserMobile() {
this.showUserMobile = true
this.showUserMobile = true;
},
async refreshTag() {
this.isRefresh = true
this.isRefresh = true;
const data = {
corp_id: this.chatUserDetails.corp_id,
userid: this.chatUserDetails.userid,
external_userid: this.chatUserDetails.external_userid
}
external_userid: this.chatUserDetails.external_userid,
};
try {
const res = await syncSessionIntelTag(data)
const res = await syncSessionIntelTag(data);
if (res.status_code === 1) {
if (res.data.is_can_sync == 1) {
this.$message.success(res.msg)
this.$set(this.chatUserDetails, 'intelligence_tag_group', res.data.intel_tag)
this.$message.success(res.msg);
this.$set(
this.chatUserDetails,
'intelligence_tag_group',
res.data.intel_tag
);
} else {
this.$message.warning('每个用户半个小时仅能更新一次')
this.$message.warning('每个用户半个小时仅能更新一次');
}
}
} catch (error) {
this.isRefresh = false
this.isRefresh = false;
} finally {
this.isRefresh = false
this.isRefresh = false;
}
}
}
}
</script>
<style lang="scss" scoped>
.gameUserDetails {
},
},
};
</script>
<style lang="scss" scoped>
.gameUserDetails {
width: 100%;
.changeUser{
.changeUser {
font-size: 18px;
transform: rotate(90deg);
color: #3491FA ;
color: #3491fa;
margin-left: 10px;
margin-top: -5px;
:first-child{
:first-child {
margin-right: -5px;
}
}
......@@ -419,10 +533,10 @@ import { debounce } from '@/utils'
border-radius: 6px;
margin-right: 5px;
}
.wxName{
.wxName {
max-width: 80%;
}
.bradge{
.bradge {
padding: 2px 5px;
border-radius: 3px;
background: #f4f4f5;
......@@ -434,7 +548,7 @@ import { debounce } from '@/utils'
margin-left: 10px;
}
.label {
color: #86909C;
color: #86909c;
font-size: 14px;
}
.text {
......@@ -453,11 +567,11 @@ import { debounce } from '@/utils'
width: 44px;
height: 22px;
border-radius: 4px;
border: 1px solid #3491FA ;
border: 1px solid #3491fa;
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #3491FA ;
color: #3491fa;
margin-left: 30px;
cursor: pointer;
}
......@@ -486,38 +600,37 @@ import { debounce } from '@/utils'
.item:hover .icon {
display: block;
}
.el-icon-sort-up{
.el-icon-sort-up {
font-size: 16px;
}
}
.refreshList {
color: #3491FA ;
}
.refreshList {
color: #3491fa;
cursor: pointer;
font-size: 18px;
margin-left: 20px;
}
.refreshListActive{
animation:rotate 0.5s linear infinite ;
}
@keyframes rotate {
0%{
}
.refreshListActive {
animation: rotate 0.5s linear infinite;
}
@keyframes rotate {
0% {
transform: rotate(0deg);
}
100%{
100% {
transform: rotate(360deg);
}
}
</style>
<style>
.wxName{
}
</style>
<style>
.wxName {
max-width: 80%;
}
.bradge{
}
.bradge {
padding: 2px 5px;
border-radius: 3px;
background: #f4f4f5;
color: #909399;
margin-left: 10px;
}
}
</style>
\ No newline at end of file
<template>
<div class="userInfo-content">
<div class="userInfo-content relative" id="recentActivitiesPopup">
<el-tabs v-model="activeTab" class="user-tabs">
<el-tab-pane label="客户信息" name="info">
<Info :chatUserDetails="chatUserInfo"/>
<Info :chatUserDetails="chatUserInfo" />
</el-tab-pane>
<el-tab-pane label="角色信息" name="role">
<template #label v-if="totalNum">
<el-badge :value="totalNum" class="text-center">
<p>角色信息</p>
</el-badge>
</template>
<roleInfo v-if="activeTab === 'role'" />
</el-tab-pane>
<el-tab-pane label="订单信息" name="order">
<orderList v-if="activeTab === 'order'" />
</el-tab-pane>
<el-tab-pane label="违规记录" name="violation">
<violationRecord v-if="activeTab === 'violation'" />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import Info from './components/Info.vue'
import roleInfo from '@/views/roleInfo.vue'
import orderList from '@/views/orderList.vue'
import violationRecord from '@/views/ViolationRecord.vue'
import { mapState, mapMutations } from 'vuex'
import Cookies from 'js-cookie'
import Info from './components/Info.vue';
import roleInfo from '@/views/roleInfo.vue';
import orderList from '@/views/orderList.vue';
import { mapState, mapMutations } from 'vuex';
import { createRoleRecentActivityNotPushNum } from '@/views/hooks/useGetCount';
import Cookies from 'js-cookie';
export default {
name: 'userInfo',
components: {
Info,
roleInfo,
orderList,
violationRecord
},
mounted() {
watch: {
async accountSelect(newVal) {
await this.initInstance();
},
},
data() {
return {
activeTab: 'info'
}
activeTab: 'info',
instance: null,
totalNum: 0,
};
},
computed: {
...mapState('game', ['chatUserInfo']),
...mapState('game', ['chatUserInfo', 'accountSelect']),
},
created() {
// 初始化 vuex 中的值
this.initInstance();
},
mounted() {
this.$nextTick(() => {
this.initVuexValue()
})
this.initVuexValue();
});
},
methods: {
...mapMutations('user', ['set_userInfo']),
initVuexValue(){
async initInstance() {
this.instance = await createRoleRecentActivityNotPushNum(
this.accountSelect
);
this.totalNum = this.instance.getTotalNum();
this.instance.roleRecentActivitySubscription(() => {
this.totalNum = this.instance.getTotalNum();
}, this);
},
initVuexValue() {
const userinfo = {
cser_id: Cookies.get('cser_id'),
cser_name: Cookies.get('cser_name'),
username: Cookies.get('cser_name'),
id: Cookies.get('cser_id'),
}
this.set_userInfo(userinfo)
}
}
}
};
this.set_userInfo(userinfo);
},
},
beforeDestroy() {
this.instance && this.instance.destroy();
},
};
</script>
<style lang="scss" scoped>
......@@ -99,4 +118,9 @@ export default {
}
}
}
::v-deep .el-badge__content.is-fixed {
top: 8px;
right: 6px;
}
</style>
/*
* @Author: maoxiya 937667504@qq.com
* @Date: 2025-08-30 10:54:21
* @LastEditors: maoxiya 937667504@qq.com
* @LastEditTime: 2025-08-30 10:54:29
* @FilePath: /company_app/tailwind.config.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
module.exports = {
mode: 'jit', // 关键配置
purge: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
darkMode: false,
theme: {
extend: {}
},
variants: {
extend: {}
},
plugins: [
function({ addUtilities }) {
const newUtilities = {
'.truncate-2': {
display: '-webkit-box',
'-webkit-box-orient': 'vertical',
'-webkit-line-clamp': '2',
'overflow': 'hidden',
'text-overflow': 'ellipsis',
'word-wrap': 'break-word',
'word-break': 'break-word',
},
'.truncate-3': {
display: '-webkit-box',
'-webkit-box-orient': 'vertical',
'-webkit-line-clamp': '3',
'overflow': 'hidden',
'text-overflow': 'ellipsis',
'word-wrap': 'break-word',
'word-break': 'break-word',
}
}
addUtilities(newUtilities, ['responsive', 'hover'])
}
],
corePlugins: {
container: false // 禁用默认的 container
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论