提交 8b8a07a6 作者: 施汉文

Merge branch '6.8' into shw-uiOptimize

...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
"vconsole": "^3.15.1", "vconsole": "^3.15.1",
"vue": "^2.6.14", "vue": "^2.6.14",
"vue-router": "^3.5.1", "vue-router": "^3.5.1",
"autoprefixer": "^10.4.0",
"tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.2.17",
"vuex": "^3.6.2" "vuex": "^3.6.2"
}, },
"devDependencies": { "devDependencies": {
...@@ -44,6 +46,11 @@ ...@@ -44,6 +46,11 @@
"@vue/cli-plugin-vuex": "~5.0.0", "@vue/cli-plugin-vuex": "~5.0.0",
"@vue/cli-service": "~5.0.0", "@vue/cli-service": "~5.0.0",
"element-theme-chalk": "^2.15.14", "element-theme-chalk": "^2.15.14",
"html-webpack-plugin": "3.2.0",
"script-ext-html-webpack-plugin": "2.1.3",
"serve-static": "1.13.2",
"svg-sprite-loader": "6.0.9",
"svgo": "1.2.2",
"vue-template-compiler": "^2.6.14" "vue-template-compiler": "^2.6.14"
} }
} }
This source diff could not be displayed because it is too large. You can view the blob instead.
/*
* @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
No preview for this file type
...@@ -12,7 +12,8 @@ ...@@ -12,7 +12,8 @@
<!-- Prevent caching at the proxy server --> <!-- Prevent caching at the proxy server -->
<meta http-equiv="expires" content="0"> <meta http-equiv="expires" content="0">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" /> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />
<title><%= htmlWebpackPlugin.options.title %></title> <!-- <title><%= htmlWebpackPlugin.options.title %></title> -->
<title>企微侧边栏</title>
<!-- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0,shrink-to-fit=no,user-scalable=no"> --> <!-- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0,shrink-to-fit=no,user-scalable=no"> -->
<script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script> <script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script>
</head> </head>
......
...@@ -4,16 +4,9 @@ ...@@ -4,16 +4,9 @@
<div class="mobile-menu-bar" v-if="token && external_userid && showMemberId"> <div class="mobile-menu-bar" v-if="token && external_userid && showMemberId">
<!-- 临时调试信息 --> <!-- 临时调试信息 -->
<div class="menu-container"> <div class="menu-container">
<el-menu <el-menu :default-active="selectedPath" mode="horizontal" class="mobile-el-menu"
:default-active="selectedPath" :class="{ 'collapsed': !isMenuExpanded && shouldShowToggle }" background-color="#fff" router
mode="horizontal" @select="handleSelect" ref="menuRef">
class="mobile-el-menu"
:class="{ 'collapsed': !isMenuExpanded && shouldShowToggle }"
background-color="#fff"
router
@select="handleSelect"
ref="menuRef"
>
<el-menu-item v-for="item in menuList" :key="item.path" :index="item.path" class="mobile-menu-item"> <el-menu-item v-for="item in menuList" :key="item.path" :index="item.path" class="mobile-menu-item">
<!-- 任务列表菜单项显示红点 --> <!-- 任务列表菜单项显示红点 -->
<div v-if="item.path === '/taskList' && hasTaskRedDot" class="menu-item-with-badge"> <div v-if="item.path === '/taskList' && hasTaskRedDot" class="menu-item-with-badge">
...@@ -29,13 +22,7 @@ ...@@ -29,13 +22,7 @@
</el-menu> </el-menu>
<!-- 展开收起按钮 --> <!-- 展开收起按钮 -->
<el-button <el-button type="text" size="mini" v-if="shouldShowToggle" class="menu-toggle-btn" @click="toggleMenu">
type="text"
size="mini"
v-if="shouldShowToggle"
class="menu-toggle-btn"
@click="toggleMenu"
>
<i :class="isMenuExpanded ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i> <i :class="isMenuExpanded ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
<span>{{ isMenuExpanded ? '收起' : '展开' }}</span> <span>{{ isMenuExpanded ? '收起' : '展开' }}</span>
</el-button> </el-button>
...@@ -112,6 +99,10 @@ export default { ...@@ -112,6 +99,10 @@ export default {
path: '/taskList', path: '/taskList',
hasRedDot: false // 红点状态 hasRedDot: false // 红点状态
}, },
{
label: '微言助手',
path: '/aiChat'
},
// { // {
// label: '通讯录', // label: '通讯录',
// path: '/addressBook' // path: '/addressBook'
...@@ -210,7 +201,7 @@ export default { ...@@ -210,7 +201,7 @@ export default {
...mapActions('game', ['getTaskUnReadData']), ...mapActions('game', ['getTaskUnReadData']),
// 设置缓存 // 设置缓存
cacheCorp_id(corp_id) { cacheCorp_id(corp_id) {
Cookies.set('corp_id', corp_id, { expires: 7 }) Cookies.set('corp_id', corp_id, { expires: 30 })
this.set_corp_id(corp_id) this.set_corp_id(corp_id)
}, },
initVuexValue() { initVuexValue() {
......
import request from '@/utils/request'
// 清除上下文
export function corp_beta_question_session_clearTag(data) {
return request({
url: '/sidebar/corp_beta_question_session/clearTag',
method: 'post',
data
})
}
// 侧边栏-重试
export function retry(data) {
return request({
url: '/sidebar/corp_beta_question_log/retry',
method: 'post',
data
})
}
// 聊天记录
export function corp_beta_question_log_index(data) {
return request({
url: '/sidebar/corp_beta_question_log/index',
method: 'post',
data
})
}
// 发送欢迎语
export function welcomemsg(data) {
return request({
url: '/sidebar/corp_beta_question_session/welcome',
method: 'post',
data
})
}
// 配置-聊天
export function corp_beta_question_log_chat(data) {
return request({
url: '/sidebar/corp_beta_question_log/chat',
method: 'post',
data
})
}
// 配置-列表
export function corp_beta_question_config(data) {
return request({
url: '/sidebar/corp_beta_question_config/index',
method: 'post',
data
})
}
// 问答模块
export function getAiResponse(data) {
return request({
url: '/sidebar/corp_beta_question_log/chat',
method: 'post',
data
})
}
// 赞同模块
export function answerComment(data) {
return request({
url: '/sidebar/corp_beta_question_log/answerComment',
method: 'post',
data
})
}
import request from '@/utils/request' import request from '@/utils/request';
import store from '@/store/index' import store from '@/store/index';
import Cookies from 'js-cookie' import Cookies from 'js-cookie';
// 获取用户ID的函数,避免在模块加载时访问可能未初始化的 store // 获取用户ID的函数,避免在模块加载时访问可能未初始化的 store
function getZwUserId() { function getZwUserId() {
return Cookies.get('cser_id') || return (
(store.state?.user?.userInfo?.id) || Cookies.get('cser_id') ||
(store.state?.user?.cser_id) store.state?.user?.userInfo?.id ||
store.state?.user?.cser_id
);
} }
// 游戏业务所属的接口信息 // 游戏业务所属的接口信息
// 所属分组下拉 // 所属分组下拉
function returnApi(api){ function returnApi(api) {
return '/sidebar' + api return '/sidebar' + api;
} }
export function cross_systemRequest(data) { export function cross_systemRequest(data) {
!data.noApi ? data.api = '/api' + data.api : '' !data.noApi ? (data.api = '/api' + data.api) : '';
return request({ return request({
url: '/sidebar/cross_system/request', url: '/sidebar/cross_system/request',
method: 'post', method: 'post',
data data,
}) });
} }
// 请求角色详情 // 请求角色详情
export function memberView(data) { export function memberView(data) {
...@@ -27,11 +29,11 @@ export function memberView(data) { ...@@ -27,11 +29,11 @@ export function memberView(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/view', api: '/member/view',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 修改手机号 // 修改手机号
...@@ -40,11 +42,11 @@ export function bindMobile(data) { ...@@ -40,11 +42,11 @@ export function bindMobile(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/bindMobile', api: '/member/bindMobile',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 角色列表 // 角色列表
...@@ -53,11 +55,11 @@ export function roleList(data) { ...@@ -53,11 +55,11 @@ export function roleList(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/role/getList', api: '/role/getList',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 绑定掌游账号 // 绑定掌游账号
...@@ -65,8 +67,8 @@ export function zyouBind(data) { ...@@ -65,8 +67,8 @@ export function zyouBind(data) {
return request({ return request({
url: returnApi('/external_user/zyouBind'), url: returnApi('/external_user/zyouBind'),
method: 'post', method: 'post',
data data,
}) });
} }
// 订单列表 // 订单列表
...@@ -75,11 +77,11 @@ export function orderList(data) { ...@@ -75,11 +77,11 @@ export function orderList(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/order/list', api: '/order/list',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 订单金额 // 订单金额
export function todayOrder(data) { export function todayOrder(data) {
...@@ -87,11 +89,11 @@ export function todayOrder(data) { ...@@ -87,11 +89,11 @@ export function todayOrder(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/todayOrder', api: '/member/todayOrder',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 补单和补回调 // 补单和补回调
export function completionOrder(data) { export function completionOrder(data) {
...@@ -99,11 +101,11 @@ export function completionOrder(data) { ...@@ -99,11 +101,11 @@ export function completionOrder(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/order/completionOrder', api: '/order/completionOrder',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 退款提交申请 // 退款提交申请
export function refundRequest(data) { export function refundRequest(data) {
...@@ -111,11 +113,11 @@ export function refundRequest(data) { ...@@ -111,11 +113,11 @@ export function refundRequest(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/order/addRefundRequest', api: '/order/addRefundRequest',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 退款申请记录 // 退款申请记录
export function refundRecord(data) { export function refundRecord(data) {
...@@ -123,11 +125,11 @@ export function refundRecord(data) { ...@@ -123,11 +125,11 @@ export function refundRecord(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/order/getRefundRequestList', api: '/order/getRefundRequestList',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 退款详情 // 退款详情
export function refundRequestLog(data) { export function refundRequestLog(data) {
...@@ -135,11 +137,11 @@ export function refundRequestLog(data) { ...@@ -135,11 +137,11 @@ export function refundRequestLog(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/order/refundRequestProcess', api: '/order/refundRequestProcess',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 下拉请求 // 下拉请求
export function selectSearch(data) { export function selectSearch(data) {
...@@ -147,11 +149,11 @@ export function selectSearch(data) { ...@@ -147,11 +149,11 @@ export function selectSearch(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/searchcondition/search', api: '/searchcondition/search',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 账号维度推广游戏列表 // 账号维度推广游戏列表
...@@ -160,11 +162,11 @@ export function memberExtensionGameList(data) { ...@@ -160,11 +162,11 @@ export function memberExtensionGameList(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/memberExtensionGameList', api: '/member/memberExtensionGameList',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 充值 // 充值
// 账号维度推广游戏列表 // 账号维度推广游戏列表
...@@ -173,11 +175,11 @@ export function getAmountByTime(data) { ...@@ -173,11 +175,11 @@ export function getAmountByTime(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/getAmountByTime', api: '/member/getAmountByTime',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 违规记录 // 违规记录
...@@ -186,11 +188,11 @@ export function violationList(data) { ...@@ -186,11 +188,11 @@ export function violationList(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/violationList', api: '/member/violationList',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 重置密码 // 重置密码
export function autoResetPassword(data) { export function autoResetPassword(data) {
...@@ -198,19 +200,19 @@ export function autoResetPassword(data) { ...@@ -198,19 +200,19 @@ export function autoResetPassword(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/autoResetPassword', api: '/member/autoResetPassword',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 重置密码加密 // 重置密码加密
export function passwardEncryption(data) { export function passwardEncryption(data) {
return request({ return request({
url: '/sidebar/session/zyouAutoResetPassword', url: '/sidebar/session/zyouAutoResetPassword',
method: 'post', method: 'post',
data data,
}) });
} }
// VIP自助工具 // VIP自助工具
...@@ -219,11 +221,11 @@ export function createVipUrl(data) { ...@@ -219,11 +221,11 @@ export function createVipUrl(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/createVipUrl', api: '/member/createVipUrl',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 活动类型 // 活动类型
...@@ -232,11 +234,11 @@ export function giftTypeList(data) { ...@@ -232,11 +234,11 @@ export function giftTypeList(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/searchcondition/search', api: '/searchcondition/search',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 充值活动列表 // 充值活动列表
export function activeList(data) { export function activeList(data) {
...@@ -244,11 +246,11 @@ export function activeList(data) { ...@@ -244,11 +246,11 @@ export function activeList(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/getVipBagCodeRuleListByRole', api: '/member/getVipBagCodeRuleListByRole',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 活动详情 // 活动详情
export function giftDetailsData(data) { export function giftDetailsData(data) {
...@@ -256,11 +258,11 @@ export function giftDetailsData(data) { ...@@ -256,11 +258,11 @@ export function giftDetailsData(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/getRoleConditionByRuleAndRole', api: '/member/getRoleConditionByRuleAndRole',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 申请礼包 // 申请礼包
...@@ -269,11 +271,11 @@ export function giftBagApply(data) { ...@@ -269,11 +271,11 @@ export function giftBagApply(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/giftBagApply', api: '/member/giftBagApply',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 礼包检测 // 礼包检测
export function checkRoleReceivedBag(data) { export function checkRoleReceivedBag(data) {
...@@ -281,11 +283,11 @@ export function checkRoleReceivedBag(data) { ...@@ -281,11 +283,11 @@ export function checkRoleReceivedBag(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/role_gift_bag/checkRoleReceivedBag', api: '/role_gift_bag/checkRoleReceivedBag',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 礼包列表 // 礼包列表
export function emailGiftList(data) { export function emailGiftList(data) {
...@@ -293,11 +295,11 @@ export function emailGiftList(data) { ...@@ -293,11 +295,11 @@ export function emailGiftList(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/giftBagApplyIndex', api: '/member/giftBagApplyIndex',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 易主标签查询 // 易主标签查询
...@@ -306,11 +308,11 @@ export function getMemberLabel(data) { ...@@ -306,11 +308,11 @@ export function getMemberLabel(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/getMemberLabel', api: '/member/getMemberLabel',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 修改易主标签 // 修改易主标签
export function editMemberLabel(data) { export function editMemberLabel(data) {
...@@ -318,11 +320,11 @@ export function editMemberLabel(data) { ...@@ -318,11 +320,11 @@ export function editMemberLabel(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/editMemberLabel', api: '/member/editMemberLabel',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// // 转端接口 // // 转端接口
// export function getMemberLink(data) { // export function getMemberLink(data) {
...@@ -343,11 +345,11 @@ export function getMemberLink(data) { ...@@ -343,11 +345,11 @@ export function getMemberLink(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/getMemberLink', api: '/member/getMemberLink',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 转游接口 // 转游接口
export function getLandingPageMemberLink(data) { export function getLandingPageMemberLink(data) {
...@@ -355,11 +357,11 @@ export function getLandingPageMemberLink(data) { ...@@ -355,11 +357,11 @@ export function getLandingPageMemberLink(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/getLandingPageMemberLink', api: '/member/getLandingPageMemberLink',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 转游接口 // 转游接口
export function getLandingPageConfig(data) { export function getLandingPageConfig(data) {
...@@ -367,11 +369,11 @@ export function getLandingPageConfig(data) { ...@@ -367,11 +369,11 @@ export function getLandingPageConfig(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/getLandingPageConfig', api: '/member/getLandingPageConfig',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 渠道列表单独渠道KEY // 渠道列表单独渠道KEY
...@@ -380,850 +382,959 @@ export function channelList(data) { ...@@ -380,850 +382,959 @@ export function channelList(data) {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/channel/channelList', api: '/channel/channelList',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 工单 // 工单
// 任务列表 // 任务列表
export function taskIndex(data) { export function taskIndex(data) {
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/operator_task/index', api: '/operator_task/index',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 任务详情 // 任务详情
export function taskDetails(data) { export function taskDetails(data) {
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/operator_task/info', api: '/operator_task/info',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 分配 // 分配
export function taskAssign(data) { export function taskAssign(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/operator_task/assign', api: '/operator_task/assign',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 完成任务 // 完成任务
export function taskTrack(data) { export function taskTrack(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/operator_task/track', api: '/operator_task/track',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 结果列表 // 结果列表
export function taskRecord(data) { export function taskRecord(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/operator_task/logs', api: '/operator_task/logs',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 备注 // 备注
export function logsSave(data) { export function logsSave(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/operator_task_log/save', api: '/operator_task_log/save',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 角色累充 // 角色累充
export function RoleTodayOrder(data) { export function RoleTodayOrder(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/role/todayOrder', api: '/role/todayOrder',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 用户充值 // 用户充值
export function memberOrder(data) { export function memberOrder(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member/memberOrder', api: '/member/memberOrder',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 下拉加载 // 下拉加载
export function searchcondition(data) { export function searchcondition(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/searchcondition/search', api: '/searchcondition/search',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 误操作列表 // 误操作列表
export function misoperationIndex(data) { export function misoperationIndex(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/mistake_operation_request/list', api: '/mistake_operation_request/list',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 添加误操作 // 添加误操作
export function addErrorHandle(data) { export function addErrorHandle(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/mistake_operation_request/add', api: '/mistake_operation_request/add',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
export function updateErrorHandle(data) { export function updateErrorHandle(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/misoperation/update', api: '/misoperation/update',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 操作数量 // 操作数量
export function numErrorHandle(data) { export function numErrorHandle(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/misoperation/num', api: '/misoperation/num',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 操作数量新 // 操作数量新
export function operationCount(data) { export function operationCount(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/mistake_operation_request/operationCount', api: '/mistake_operation_request/operationCount',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 任务消息读取 // 任务消息读取
export function taskRead(data) { export function taskRead(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/operator_task/read', api: '/operator_task/read',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 任务消息状态 // 任务消息状态
export function taskReadStatus(data) { export function taskReadStatus(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/operator_task/readStatus', api: '/operator_task/readStatus',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 撤回消息 // 撤回消息
export function cancelRefundRequest(data) { export function cancelRefundRequest(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/order/cancelRefundRequest', api: '/order/cancelRefundRequest',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 举报列表 // 举报列表
export function reportIndex(data) { export function reportIndex(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/admin/report_request/list', api: '/admin/report_request/list',
params: data, params: data,
noApi: true noApi: true,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 玩家举报 // 玩家举报
export function playerReport(data) { export function playerReport(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/report_request/waitList', api: '/api/report_request/waitList',
params: data, params: data,
noApi: true noApi: true,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 审批记录 // 审批记录
export function reportProcess(data) { export function reportProcess(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/report_request/process', api: '/report_request/process',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 撤销举报 // 撤销举报
export function reportCancel(data) { export function reportCancel(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/report_request/cancel', api: '/report_request/cancel',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 新增举报 // 新增举报
export function reportAdd(data) { export function reportAdd(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/report_request/add', api: '/report_request/add',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 申诉列表 // 申诉列表
export function appealList(data) { export function appealList(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/appeal_request/list', api: '/appeal_request/list',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 新增申诉 // 新增申诉
export function appealAdd(data) { export function appealAdd(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/appeal_request/add', api: '/appeal_request/add',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 撤销申诉 // 撤销申诉
export function appealCancel(data) { export function appealCancel(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/appeal_request/cancel', api: '/appeal_request/cancel',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 申诉记录 // 申诉记录
export function appealProcess(data) { export function appealProcess(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/appeal_request/process', api: '/appeal_request/process',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 玩家举报审批记录 // 玩家举报审批记录
export function gamerReportProcess(data) { export function gamerReportProcess(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/report_request/process', api: '/api/report_request/process',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 角色列表Holo 实时性较高 // 角色列表Holo 实时性较高
export function getRoleHoLo(data) { export function getRoleHoLo(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/role/getListHoLo', api: '/role/getListHoLo',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 角色列表 待请求 // 角色列表 待请求
export function memberTaskStatus(data) { export function memberTaskStatus(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/operator_task/memberTaskStatus', api: '/operator_task/memberTaskStatus',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 举报申请列表 // 举报申请列表
export function report_request_list(data) { export function report_request_list(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/report_request/list', api: '/api/report_request/list',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 举报申请驳回或者通过 // 举报申请驳回或者通过
export function report_request_approval(data) { export function report_request_approval(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/report_request/approval', api: '/api/report_request/approval',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 游戏类型下的游戏列表 游戏类型:安卓 h5 ios // 游戏类型下的游戏列表 游戏类型:安卓 h5 ios
export function getTransferRecallGameList(data) { export function getTransferRecallGameList(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/member/getTransferRecallGameList', api: '/api/member/getTransferRecallGameList',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 转端和召回 游戏类型列表 // 转端和召回 游戏类型列表
export function getGameConfig(data) { export function getGameConfig(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/game/getGameConfig', api: '/api/game/getGameConfig',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 召回的时候染色 // 召回的时候染色
export function recallChannelSeq(data) { export function recallChannelSeq(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/channel/recallChannelSeq', api: '/api/channel/recallChannelSeq',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 获取游戏信息 // 获取游戏信息
export function getGameInfo(data) { export function getGameInfo(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/game/info', api: '/api/game/info',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 新增渠道 // 新增渠道
export function addChannel(data) { export function addChannel(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/channel/addDistributorChannelByZm', api: '/api/channel/addDistributorChannelByZm',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 一键发送召回渠道链接 // 一键发送召回渠道链接
export function quickRecallChannelLink(data) { export function quickRecallChannelLink(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/channel/quickRecallChannelLink', api: '/api/channel/quickRecallChannelLink',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 转端发送落地页 // 转端发送落地页
export function getLandingPageTransfer(data) { export function getLandingPageTransfer(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/member/getLandingPageTransfer', api: '/api/member/getLandingPageTransfer',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 工作台关联客服 // 工作台关联客服
export function bindUserSelfAdd(data) { export function bindUserSelfAdd(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/member_bind_cser/selfAdd', api: '/api/member_bind_cser/selfAdd',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 关联客服列表 // 关联客服列表
export function bindUserList(data) { export function bindUserList(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/member_bind_cser/list', api: '/api/member_bind_cser/list',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 新增关联客服 // 新增关联客服
export function bindUserAdd(data) { export function bindUserAdd(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/member_bind_cser/add', api: '/api/member_bind_cser/add',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 删除关联客服 // 删除关联客服
export function bindUserDelete(data) { export function bindUserDelete(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/member_bind_cser/delete', api: '/api/member_bind_cser/delete',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 调用掌游的日志中心 // 调用掌游的日志中心
export function getSystemModelLog(data) { export function getSystemModelLog(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/member_bind_cser/getSystemModelLog', api: '/api/member_bind_cser/getSystemModelLog',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
export function getMemberTransStatus(data) { export function getMemberTransStatus(data) {
// 转端文档 获取W账号的转端状态 如果状态是 false 表示不允许转端 在工作台 发送游戏 里面转端里 点开发送的时候 提示 当前w账号不满足转端要求,请联系组长处理 // 转端文档 获取W账号的转端状态 如果状态是 false 表示不允许转端 在工作台 发送游戏 里面转端里 点开发送的时候 提示 当前w账号不满足转端要求,请联系组长处理
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/member/getMemberTransStatus', api: '/api/member/getMemberTransStatus',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
export function getTaskTracer(data) { export function getTaskTracer(data) {
// 获取运营任务的跟进人 参数 member_id // 获取运营任务的跟进人 参数 member_id
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/operator_task/getTaskTracer', api: '/api/operator_task/getTaskTracer',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 用户触达 发送客服号添加消息的日志 // 用户触达 发送客服号添加消息的日志
export function getTaskTracerTouch(data) { export function getTaskTracerTouch(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/operator_task_log/touch', api: '/api/operator_task_log/touch',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 添加一条任务跟进记录 // 添加一条任务跟进记录
export function getTaskTracerTouchAdd(data) { export function getTaskTracerTouchAdd(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/operator_task_log/add', api: '/api/operator_task_log/add',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 审批组流程下拉 // 审批组流程下拉
export function approval_group_flow_list(data) { export function approval_group_flow_list(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/approval_group_flow/options', api: '/api/approval_group_flow/options',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 审批人员表格 // 审批人员表格
export function approval_group_flow_user(data) { export function approval_group_flow_user(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/approval_group_flow/users', api: '/api/approval_group_flow/users',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 保存转端提交 // 保存转端提交
export function approval_group_flow_add(data) { export function approval_group_flow_add(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/member_trans_request/add', api: '/api/member_trans_request/add',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 转端申请列表 // 转端申请列表
export function member_trans_request_list(data) { export function member_trans_request_list(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/member_trans_request/list', api: '/api/member_trans_request/list',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 转端申请审批记录 // 转端申请审批记录
export function member_trans_request_process(data) { export function member_trans_request_process(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/member_trans_request/process', api: '/api/member_trans_request/process',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 转区列表 // 转区列表
export function transfer_server_request_list(data) { export function transfer_server_request_list(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/transfer_server_request/list', api: '/api/transfer_server_request/list',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 转区申请 // 转区申请
export function transfer_server_request_add(data) { export function transfer_server_request_add(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/transfer_server_request/add', api: '/api/transfer_server_request/add',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 转区申请节点 // 转区申请节点
export function transfer_server_request_process(data) { export function transfer_server_request_process(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/transfer_server_request/process', api: '/api/transfer_server_request/process',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
export function getMainGameInfo(data) { export function getMainGameInfo(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/service_wechat/getMainGameInfo', api: '/api/service_wechat/getMainGameInfo',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 掌游标签搜索 // 掌游标签搜索
export function roleLabelSearch(data) { export function roleLabelSearch(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/role/labelSearch', api: '/role/labelSearch',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 掌游标签列表 // 掌游标签列表
export function roleGetRoleLabel(data) { export function roleGetRoleLabel(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/role/getRoleLabel', api: '/role/getRoleLabel',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 编辑角色标签 // 编辑角色标签
export function editRoleLabel(data) { export function editRoleLabel(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/role/editRoleLabel', api: '/role/editRoleLabel',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 编辑角色标签 // 编辑角色标签
export function getRoleLabelCreate(data) { export function getRoleLabelCreate(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/role/getRoleLabelCreate', api: '/role/getRoleLabelCreate',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
export function ruleList(data) { export function ruleList(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/member_trans_request/ruleList', api: '/member_trans_request/ruleList',
params: data params: data,
}).then((res) => { }).then((res) => {
resovle(res) resovle(res);
}) });
}) });
} }
// 查询客服未完成任务 // 查询客服未完成任务
export function getTaskTotal(data) { export function getTaskTotal(data) {
data.zw_user_id = getZwUserId() data.zw_user_id = getZwUserId();
return new Promise((resovle, reject) => { return new Promise((resovle, reject) => {
cross_systemRequest({ cross_systemRequest({
system: 'zhangyou', system: 'zhangyou',
api: '/api/operator_task/getTaskTotal', api: '/api/operator_task/getTaskTotal',
params: data params: data,
}).then((res) => { }).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 request from '@/utils/request';
import store from '@/store/index' import store from '@/store/index';
// 所属分组下拉 // 所属分组下拉
function returnApi(api){ function returnApi(api) {
return '/sidebar' + api return '/sidebar' + api;
} }
export function procedure_group(data) { export function procedure_group(data) {
return request({ return request({
url: returnApi('/procedure_group/index'), url: returnApi('/procedure_group/index'),
method: 'post', method: 'post',
data data,
}) });
} }
// 话术列表 // 话术列表
export function procedureList(data) { export function procedureList(data) {
return request({ return request({
url: returnApi('/procedure/index'), url: returnApi('/procedure/index'),
method: 'post', method: 'post',
data data,
}) });
} }
// 删除话术 // 删除话术
...@@ -25,8 +25,8 @@ export function proceduredel(data) { ...@@ -25,8 +25,8 @@ export function proceduredel(data) {
return request({ return request({
url: returnApi('/procedure/del'), url: returnApi('/procedure/del'),
method: 'post', method: 'post',
data data,
}) });
} }
// 批量移动 // 批量移动
...@@ -34,8 +34,8 @@ export function proceduremove(data) { ...@@ -34,8 +34,8 @@ export function proceduremove(data) {
return request({ return request({
url: returnApi('/procedure/move'), url: returnApi('/procedure/move'),
method: 'post', method: 'post',
data data,
}) });
} }
// 新增话术 // 新增话术
...@@ -43,8 +43,8 @@ export function procedureadd(data) { ...@@ -43,8 +43,8 @@ export function procedureadd(data) {
return request({ return request({
url: returnApi('/procedure/add'), url: returnApi('/procedure/add'),
method: 'post', method: 'post',
data data,
}) });
} }
// 分组添加/修改 // 分组添加/修改
...@@ -52,8 +52,8 @@ export function procedure_groupAdd(data) { ...@@ -52,8 +52,8 @@ export function procedure_groupAdd(data) {
return request({ return request({
url: returnApi('/procedure_group/add'), url: returnApi('/procedure_group/add'),
method: 'post', method: 'post',
data data,
}) });
} }
// 分组删除 // 分组删除
...@@ -61,8 +61,8 @@ export function procedure_groupDel(data) { ...@@ -61,8 +61,8 @@ export function procedure_groupDel(data) {
return request({ return request({
url: returnApi('/procedure_group/del'), url: returnApi('/procedure_group/del'),
method: 'post', method: 'post',
data data,
}) });
} }
// 个人话术移到企业库 // 个人话术移到企业库
...@@ -70,8 +70,8 @@ export function addCompany(data) { ...@@ -70,8 +70,8 @@ export function addCompany(data) {
return request({ return request({
url: returnApi('/procedure/addCompany'), url: returnApi('/procedure/addCompany'),
method: 'post', method: 'post',
data data,
}) });
} }
// 个人话术详情 // 个人话术详情
...@@ -79,8 +79,8 @@ export function procedureInfo(data) { ...@@ -79,8 +79,8 @@ export function procedureInfo(data) {
return request({ return request({
url: returnApi('/procedure/info'), url: returnApi('/procedure/info'),
method: 'post', method: 'post',
data data,
}) });
} }
// 个人话术排序 // 个人话术排序
...@@ -88,8 +88,8 @@ export function procedureSort(data) { ...@@ -88,8 +88,8 @@ export function procedureSort(data) {
return request({ return request({
url: returnApi('/procedure/sort'), url: returnApi('/procedure/sort'),
method: 'post', method: 'post',
data data,
}) });
} }
// 个人话术租排序 // 个人话术租排序
...@@ -97,8 +97,8 @@ export function procedureGroupSort(data) { ...@@ -97,8 +97,8 @@ export function procedureGroupSort(data) {
return request({ return request({
url: returnApi('/procedure_group/sort'), url: returnApi('/procedure_group/sort'),
method: 'post', method: 'post',
data data,
}) });
} }
// 企业话术增至个人 // 企业话术增至个人
...@@ -106,8 +106,8 @@ export function addToPersonal(data) { ...@@ -106,8 +106,8 @@ export function addToPersonal(data) {
return request({ return request({
url: returnApi('/procedure/addToPersonal'), url: returnApi('/procedure/addToPersonal'),
method: 'post', method: 'post',
data data,
}) });
} }
// 话术使用次数 // 话术使用次数
...@@ -115,8 +115,8 @@ export function skillQuote(data) { ...@@ -115,8 +115,8 @@ export function skillQuote(data) {
return request({ return request({
url: '/admin/procedure/quote', url: '/admin/procedure/quote',
method: 'post', method: 'post',
data data,
}) });
} }
/* ----------- 知识库的接口 ---------- */ /* ----------- 知识库的接口 ---------- */
...@@ -125,16 +125,16 @@ export function groupList(data) { ...@@ -125,16 +125,16 @@ export function groupList(data) {
return request({ return request({
url: returnApi('/knowledge_group/index'), url: returnApi('/knowledge_group/index'),
method: 'post', method: 'post',
data data,
}) });
} }
// 知识库分组下拉 // 知识库分组下拉
export function libraryIndex(data) { export function libraryIndex(data) {
return request({ return request({
url: returnApi('/knowledge_base/index'), url: returnApi('/knowledge_base/index'),
method: 'post', method: 'post',
data data,
}) });
} }
// 新增和编辑 // 新增和编辑
...@@ -142,8 +142,8 @@ export function groupHandle(data) { ...@@ -142,8 +142,8 @@ export function groupHandle(data) {
return request({ return request({
url: returnApi('/knowledge_group/add'), url: returnApi('/knowledge_group/add'),
method: 'post', method: 'post',
data data,
}) });
} }
// 删除分组 // 删除分组
...@@ -151,81 +151,63 @@ export function groupDel(data) { ...@@ -151,81 +151,63 @@ export function groupDel(data) {
return request({ return request({
url: returnApi('/knowledge_group/del'), url: returnApi('/knowledge_group/del'),
method: 'post', method: 'post',
data data,
}) });
} }
// 新增知识库任务 // 新增知识库任务
export function addLibraryTask(data) { export function addLibraryTask(data) {
return request({ return request({
url: returnApi('/knowledge_base/add'), url: returnApi('/knowledge_base/add'),
method: 'post', method: 'post',
data data,
}) });
} }
// 详情 // 详情
export function libraryTaskView(data) { export function libraryTaskView(data) {
return request({ return request({
url: returnApi('/knowledge_base/view'), url: returnApi('/knowledge_base/view'),
method: 'post', method: 'post',
data data,
}) });
} }
// 编辑 // 编辑
export function libraryTaskEdit(data) { export function libraryTaskEdit(data) {
return request({ return request({
url: returnApi('/knowledge_base/edit'), url: returnApi('/knowledge_base/edit'),
method: 'post', method: 'post',
data data,
}) });
} }
// 删除 // 删除
export function libraryTaskDel(data) { export function libraryTaskDel(data) {
return request({ return request({
url: returnApi('/knowledge_base/del'), url: returnApi('/knowledge_base/del'),
method: 'post', method: 'post',
data data,
}) });
} }
// 批量删除 // 批量删除
export function multipleDel(data) { export function multipleDel(data) {
return request({ return request({
url: returnApi('/knowledge_base/batchDel'), url: returnApi('/knowledge_base/batchDel'),
method: 'post', method: 'post',
data data,
}) });
} // 导入 } // 导入
export function importData(data) { export function importData(data) {
return request({ return request({
url: returnApi('/knowledge_base/importKnowledgeBase'), url: returnApi('/knowledge_base/importKnowledgeBase'),
method: 'post', method: 'post',
data data,
}) });
} }
// 知识库计数 // 知识库计数
export function logClickTime(data) { export function logClickTime(data) {
return request({ return request({
url: returnApi('/knowledge_base/logClickTime'), url: returnApi('/knowledge_base/logClickTime'),
method: 'post', method: 'post',
data data,
}) });
}
// 大模型 ai
export function getCorpBetaConfig(data) {
return request({
url: '/admin/corp_beta_config/getCorpBetaConfig',
method: 'post',
data
})
}
// 问答模块
export function getAiResponse(data) {
return request({
url: returnApi('/corp_beta_question_log/getAiResponse'),
method: 'post',
data
})
} }
// 问答模块 // 问答模块
...@@ -233,43 +215,18 @@ export function Aihistory(data) { ...@@ -233,43 +215,18 @@ export function Aihistory(data) {
return request({ return request({
url: returnApi('/corp_beta_question_log/history'), url: returnApi('/corp_beta_question_log/history'),
method: 'post', method: 'post',
data data,
}) });
}
// 赞同模块
export function answerComment(data) {
return request({
url: returnApi('/corp_beta_question_log/answerComment'),
method: 'post',
data
})
} }
// 复制次数统计
export function calAnswerClickTime(data) {
return request({
url: returnApi('/corp_beta_question_log/calAnswerClickTime'),
method: 'post',
data
})
}
// 获取来源
export function getQuoteData(data) {
return request({
url: returnApi('/corp_beta_question_log/getQuoteData'),
method: 'post',
data
})
}
// 同步知识库 // 同步知识库
export function asyncKnowledge(data) { export function asyncKnowledge(data) {
return request({ return request({
url: returnApi('/knowledge_base/syncToCorp'), url: returnApi('/knowledge_base/syncToCorp'),
method: 'post', method: 'post',
data data,
}) });
} }
/* -------------------- 机器人知识库 ----------------------- */ /* -------------------- 机器人知识库 ----------------------- */
// 新增机器人知识库任务 // 新增机器人知识库任务
...@@ -277,8 +234,8 @@ export function corp_robot_knowledge_add(data) { ...@@ -277,8 +234,8 @@ export function corp_robot_knowledge_add(data) {
return request({ return request({
url: returnApi('/corp_robot_knowledge_base/add'), url: returnApi('/corp_robot_knowledge_base/add'),
method: 'post', method: 'post',
data data,
}) });
} }
// 机器人知识库列表 // 机器人知识库列表
...@@ -286,48 +243,48 @@ export function corp_robot_knowledge_list(data) { ...@@ -286,48 +243,48 @@ export function corp_robot_knowledge_list(data) {
return request({ return request({
url: returnApi('/corp_robot_knowledge_base/index'), url: returnApi('/corp_robot_knowledge_base/index'),
method: 'post', method: 'post',
data data,
}) });
} }
// 机器人知识库编辑 // 机器人知识库编辑
export function corp_robot_knowledge_edit(data) { export function corp_robot_knowledge_edit(data) {
return request({ return request({
url: returnApi('/corp_robot_knowledge_base/edit'), url: returnApi('/corp_robot_knowledge_base/edit'),
method: 'post', method: 'post',
data data,
}) });
} }
// 机器人知识库详情 // 机器人知识库详情
export function corp_robot_knowledge_view(data) { export function corp_robot_knowledge_view(data) {
return request({ return request({
url: returnApi('/corp_robot_knowledge_base/view'), url: returnApi('/corp_robot_knowledge_base/view'),
method: 'post', method: 'post',
data data,
}) });
} }
// 机器人知识库删除 // 机器人知识库删除
export function corp_robot_knowledge_del(data) { export function corp_robot_knowledge_del(data) {
return request({ return request({
url: returnApi('/corp_robot_knowledge_base/delete'), url: returnApi('/corp_robot_knowledge_base/delete'),
method: 'post', method: 'post',
data data,
}) });
} }
// 机器人知识库批量删除 // 机器人知识库批量删除
export function corp_robot_knowledge_batchDelete(data) { export function corp_robot_knowledge_batchDelete(data) {
return request({ return request({
url: returnApi('/corp_robot_knowledge_base/batchDelete'), url: returnApi('/corp_robot_knowledge_base/batchDelete'),
method: 'post', method: 'post',
data data,
}) });
} }
// 机器人知识库批量导入 // 机器人知识库批量导入
export function corp_robot_knowledge_import(data) { export function corp_robot_knowledge_import(data) {
return request({ return request({
url: returnApi('/corp_robot_knowledge_base/import'), url: returnApi('/corp_robot_knowledge_base/import'),
method: 'post', method: 'post',
data data,
}) });
} }
/* --------------------机器人知识库分组-----------------------*/ /* --------------------机器人知识库分组-----------------------*/
// 知识库分组列表 // 知识库分组列表
...@@ -335,32 +292,32 @@ export function corp_robot_knowledge_group_index(data) { ...@@ -335,32 +292,32 @@ export function corp_robot_knowledge_group_index(data) {
return request({ return request({
url: returnApi('/corp_robot_knowledge_group/index'), url: returnApi('/corp_robot_knowledge_group/index'),
method: 'post', method: 'post',
data data,
}) });
} }
// 知识库分组新增 // 知识库分组新增
export function corp_robot_knowledge_group_add(data) { export function corp_robot_knowledge_group_add(data) {
return request({ return request({
url: returnApi('/corp_robot_knowledge_group/add'), url: returnApi('/corp_robot_knowledge_group/add'),
method: 'post', method: 'post',
data data,
}) });
} }
// 知识库分组编辑 // 知识库分组编辑
export function corp_robot_knowledge_group_edit(data) { export function corp_robot_knowledge_group_edit(data) {
return request({ return request({
url: returnApi('/corp_robot_knowledge_group/edit'), url: returnApi('/corp_robot_knowledge_group/edit'),
method: 'post', method: 'post',
data data,
}) });
} }
// 知识库分组删除 // 知识库分组删除
export function corp_robot_knowledge_group_del(data) { export function corp_robot_knowledge_group_del(data) {
return request({ return request({
url: returnApi('/corp_robot_knowledge_group/delete'), url: returnApi('/corp_robot_knowledge_group/delete'),
method: 'post', method: 'post',
data data,
}) });
} }
// AI问答对列表 // AI问答对列表
...@@ -368,8 +325,8 @@ export function AI_list(data) { ...@@ -368,8 +325,8 @@ export function AI_list(data) {
return request({ return request({
url: returnApi('/corp_ai_question_answer/index'), url: returnApi('/corp_ai_question_answer/index'),
method: 'post', method: 'post',
data data,
}) });
} }
// 业务下拉 // 业务下拉
...@@ -377,8 +334,8 @@ export function search_condition(data) { ...@@ -377,8 +334,8 @@ export function search_condition(data) {
return request({ return request({
url: '/admin/search_condition', url: '/admin/search_condition',
method: 'post', method: 'post',
data data,
}) });
} }
// 智能体列表 // 智能体列表
...@@ -386,8 +343,8 @@ export function corp_beta_config(data) { ...@@ -386,8 +343,8 @@ export function corp_beta_config(data) {
return request({ return request({
url: '/admin/corp_beta_config/index', url: '/admin/corp_beta_config/index',
method: 'post', method: 'post',
data data,
}) });
} }
// 标记有用/无用 // 标记有用/无用
...@@ -395,22 +352,30 @@ export function markUseful(data) { ...@@ -395,22 +352,30 @@ export function markUseful(data) {
return request({ return request({
url: returnApi('/corp_ai_question_answer/markUseful'), url: returnApi('/corp_ai_question_answer/markUseful'),
method: 'post', method: 'post',
data data,
}) });
} }
// 跨主体分组列表 // 跨主体分组列表
export function cross_corp_robot_knowledge_group_index(data) { export function cross_corp_robot_knowledge_group_index(data) {
return request({ return request({
url: returnApi('/corp_cross_knowledge_group/index'), url: returnApi('/corp_cross_knowledge_group/index'),
method: 'post', method: 'post',
data data,
}) });
} }
// 跨主体知识库分组列表 // 跨主体知识库分组列表
export function cross_corp_robot_knowledge_group_getList(data) { export function cross_corp_robot_knowledge_group_getList(data) {
return request({ return request({
url: returnApi('/corp_cross_knowledge_base/getList'), url: returnApi('/corp_cross_knowledge_base/getList'),
method: 'post', method: 'post',
data data,
}) });
}
// 营销面板-话术生成
export function getGenerateProcedureApi(data) {
return request({
url: returnApi('/corp_activity_procedure/generateProcedure'),
method: 'post',
data,
});
} }
...@@ -141,4 +141,3 @@ export function cserSelected(data) { ...@@ -141,4 +141,3 @@ export function cserSelected(data) {
data data
}) })
} }
...@@ -259,3 +259,13 @@ export function shareInfoDel(data) { ...@@ -259,3 +259,13 @@ export function shareInfoDel(data) {
data data
}) })
} }
// 跟进总结列表
export function corp_follow_up_summary_index(data) {
return request({
url: returnApi('/corp_follow_up_summary/index'),
method: 'post',
data
})
}
\ No newline at end of file
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="zhinengkefu(1)">
<rect id="&#231;&#159;&#169;&#229;&#189;&#162;" opacity="0.01" width="30" height="30" fill="#00BF8A"/>
<path id="&#229;&#189;&#162;&#231;&#138;&#182;" fill-rule="evenodd" clip-rule="evenodd" d="M27.0653 10.3441C25.5488 6.28958 21.6797 3.59819 17.3509 3.58671H12.6536C8.32641 3.60169 4.45971 6.29199 2.9414 10.3441C2.91233 10.3533 2.88393 10.3645 2.8564 10.3776L2.74232 5.69825C3.19914 5.51413 3.49954 5.07237 3.50283 4.57985V2.19318C3.50283 1.52362 2.96005 0.980835 2.29049 0.980835C1.62093 0.980835 1.07814 1.52362 1.07814 2.19318V4.5709C1.08106 5.06287 1.38048 5.50448 1.83642 5.6893L1.70892 11.0129C0.631358 11.8411 -0.000118498 13.1231 0 14.4822V18.1215C0.00549071 19.9831 1.18143 21.64 2.93692 22.2595C4.45561 26.3136 8.3244 29.005 12.6536 29.0192H17.3509C21.6795 29.0048 25.5474 26.3133 27.0653 22.2595C28.8195 21.6386 29.9942 19.9823 30 18.1215V14.4822C29.9962 12.6207 28.8208 10.9633 27.0653 10.3441ZM25.9715 17.8016C25.9629 20.261 23.9707 22.2522 21.5113 22.2595H8.49985C6.03525 22.2596 4.03487 20.2662 4.02625 17.8016V14.8065C4.03364 12.3411 6.03438 10.3463 8.49985 10.3463H21.5248C23.985 10.3537 25.9776 12.3463 25.9849 14.8065L25.9715 17.8016ZM15.8992 17.9761L18.5834 13.5673L20.4981 16.6586L24.0255 17.2334L19.9993 17.428L18.6572 15.7929L15.9283 20.6244L12.5462 14.2876L10.7053 17.3923L5.99016 17.22L9.97614 16.6161L12.5753 11.4714L15.8992 17.9761Z" fill="#00BF8A"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><defs><linearGradient id="a" y2="75.742%" x2="89.14%" y1="0%" x1="17.97%"><stop offset="0%" stop-color="#00EEAC"/><stop offset="53.553%" stop-color="#A9DD00"/><stop offset="100%" stop-color="#F7B500"/></linearGradient></defs><path fill="url(#a)" d="M10.673 5.201a2.604 2.604 0 0 1-2.6-2.6C8.072 1.167 9.238 0 10.672 0c1.434 0 2.6 1.167 2.6 2.6 0 1.434-1.166 2.601-2.6 2.601ZM5.137 7.266A2.378 2.378 0 0 1 2.76 4.89a2.378 2.378 0 0 1 2.376-2.376A2.378 2.378 0 0 1 7.512 4.89a2.378 2.378 0 0 1-2.375 2.376ZM2.784 12.64A2.097 2.097 0 0 1 .69 10.545 2.097 2.097 0 0 1 2.784 8.45a2.097 2.097 0 0 1 2.094 2.095 2.097 2.097 0 0 1-2.094 2.095Zm2.353 5.324a1.778 1.778 0 0 1-1.776-1.776 1.779 1.779 0 0 1 1.776-1.776c.98.001 1.774.796 1.776 1.776 0 .98-.797 1.776-1.776 1.776ZM10.673 20a1.553 1.553 0 0 1-1.552-1.552c0-.856.697-1.551 1.552-1.551.857 0 1.55.695 1.551 1.551 0 .856-.695 1.552-1.551 1.552Zm5.62-2.623a1.254 1.254 0 0 1-1.252-1.252c0-.692.56-1.252 1.252-1.253a1.254 1.254 0 0 1 0 2.505Zm2.302-5.795a1.029 1.029 0 0 1 0-2.055c.567 0 1.027.46 1.028 1.027a1.03 1.03 0 0 1-1.028 1.028Zm-3.1-6.615a.797.797 0 1 0 1.596 0 .797.797 0 0 0-1.595 0Z" fill-rule="nonzero"/></svg>
\ No newline at end of file
<?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
<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>发送备份</title>
<defs>
<linearGradient x1="14.2586009%" y1="0%" x2="93.6750771%" y2="75.7420422%" id="linearGradient-1">
<stop stop-color="#00EEAC" offset="0%"></stop>
<stop stop-color="#A9DD00" offset="53.5526729%"></stop>
<stop stop-color="#F7B500" offset="100%"></stop>
</linearGradient>
</defs>
<g id="游戏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="游戏-快捷回复AI" transform="translate(-1727, -981)" fill-rule="nonzero">
<g id="编组-4备份-2" transform="translate(1378, 169.68)">
<g id="4.数据展示/10.Popover气泡卡片/⬅️右上备份-16" transform="translate(0, 798.32)">
<g id="发送备份" transform="translate(349, 13)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="20" height="20"></rect>
<polygon id="路径" fill="url(#linearGradient-1)" points="0 20 2.08 10.74 13.58 10.02 2.08 9.24 0 0 20 10"></polygon>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?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(-1093.000000, -386.000000)" fill-rule="nonzero">
<g id="编组-6" transform="translate(1086.000000, 379.000000)">
<g id="复制" transform="translate(6.000000, 6.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="20" height="20"></rect>
<path d="M13,4.375 L4.00976562,4.375 C2.80273438,4.375 1.82226562,5.35546875 1.82226562,6.5625 L1.82226562,16.5625 C1.82226562,17.7695312 2.80273438,18.75 4.00976562,18.75 L13,18.75 C14.2070312,18.75 15.1875,17.7695312 15.1875,16.5625 L15.1875,6.5625 C15.1875,5.35546875 14.2070312,4.375 13,4.375 Z M13.9375,16.5625 C13.9375,17.0800781 13.5175781,17.5 13,17.5 L4.00976562,17.5 C3.4921875,17.5 3.07226562,17.0800781 3.07226562,16.5625 L3.07226562,6.5625 C3.07226562,6.04492188 3.4921875,5.625 4.00976562,5.625 L13,5.625 C13.5175781,5.625 13.9375,6.04492188 13.9375,6.5625 L13.9375,16.5625 Z M16.0292969,1.25 L5.88476562,1.25 C4.67773438,1.25 3.69726562,2.23046875 3.69726562,3.4375 L4.94726562,3.4375 C4.94726562,2.91992188 5.3671875,2.5 5.88476562,2.5 L16.0292969,2.5 C16.546875,2.5 16.9667969,2.91992188 16.9667969,3.4375 L16.9667969,14.6875 C16.9667969,15.2050781 16.546875,15.625 16.0292969,15.625 L16.0292969,16.875 C17.2363281,16.875 18.2167969,15.8945312 18.2167969,14.6875 L18.2167969,3.4375 C18.2167969,2.23046875 17.2363281,1.25 16.0292969,1.25 Z M4.75585938,7.8125 L12.2558594,7.8125 L12.2558594,9.0625 L4.75585938,9.0625 L4.75585938,7.8125 Z M4.75585938,10.9375 L12.2558594,10.9375 L12.2558594,12.1875 L4.75585938,12.1875 L4.75585938,10.9375 Z M4.75585937,14.0625 L9.57617188,14.0625 L9.57617188,15.3125 L4.75585937,15.3125 L4.75585937,14.0625 Z" id="形状" fill="#8CA4BA"></path>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>不点赞</title>
<g id="游戏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="游戏-快捷回复AI" transform="translate(-1476, -617)" fill-rule="nonzero">
<g id="编组-4备份-2" transform="translate(1378, 169.68)">
<g id="不点赞" transform="translate(106, 455.32) scale(-1, 1) rotate(180) translate(-106, -455.32)translate(98, 447.32)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path d="M13.395,5.3905 L9.257,5.3905 C9.4535,4.699 9.553,4.0845 9.553,3.5435 C9.553,2.316 8.431,1.1405 7.357,1.2965 C6.41,1.434 5.958,2.2325 5.958,3.258 L5.958,4.1845 C5.958,5.373 5.0485,6.3865 3.892,6.498 L2.0525,6.495 C1.4712203,6.495 1,6.9662203 1,7.5475 L1,13.625 C1,14.2065 1.471,14.6775 2.0525,14.6775 L12.243,14.6775 C13.0141535,14.6775 13.6763396,14.1291539 13.82,13.3715 L14.972,7.294 C15.0608892,6.82439182 14.9358631,6.3395998 14.6309458,5.97155283 C14.3260285,5.60350586 13.8729468,5.39049941 13.395,5.3905 Z M2,13.625 L2,7.5475 C2,7.5185 2.0235,7.495 2.0525,7.495 L3.25,7.495 L3.25,13.6775 L2.0525,13.6775 C2.02350505,13.6775 2,13.6539949 2,13.625 L2,13.625 Z M13.9895,7.108 L12.8375,13.1855 C12.7832202,13.4709991 12.5336132,13.6775 12.243,13.6775 L4.25,13.6775 L4.25,7.451 C5.8188449,7.15150285 6.95470437,5.78117313 6.958,4.184 L6.958,3.258 C6.958,2.671 7.1465,2.3375 7.5005,2.2865 C7.923,2.225 8.553,2.8855 8.553,3.544 C8.553,4.127 8.4045,4.8565 8.102,5.727 C8.04891415,5.87989332 8.07311785,6.0490253 8.16695458,6.1808932 C8.2607913,6.31276111 8.41265293,6.39105216 8.5745,6.391 L13.395,6.391 C13.5750607,6.3910127 13.7457587,6.47122841 13.8606881,6.60983965 C13.9756175,6.74845089 14.0228335,6.93105165 13.9895,7.108 Z" id="形状" fill="#8CA4BA"></path>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>不够好</title>
<g id="游戏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="游戏-快捷回复AI" transform="translate(-1528, -617)" fill-rule="nonzero">
<g id="编组-4备份-2" transform="translate(1378, 169.68)">
<g id="不够好" transform="translate(158, 455.32) scale(-1, 1) rotate(180) translate(-158, -455.32)translate(150, 447.32)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path d="M1,7.5475 L1,13.625 C1,14.2065 1.471,14.6775 2.0525,14.6775 L3,14.6775 L3,6.505 L2.0525,6.495 C1.4712203,6.495 1,6.9662203 1,7.5475 Z M13.395,5.3905 L9.2105,5.417 C9.407,4.7255 9.5065,4.111 9.5065,3.57 C9.5065,2.3425 8.431,1.1405 7.357,1.2965 C6.41,1.434 6.306,2.2525 6.306,3.278 L6.306,4.204 C6.306,5.3925 5.3085,6.405 4.152,6.5165 L4,6.515 L4,14.6775 L12.243,14.6775 C13.0141535,14.6775 13.6763396,14.1291539 13.82,13.3715 L14.972,7.294 C15.0608892,6.82439182 14.9358631,6.3395998 14.6309458,5.97155283 C14.3260285,5.60350586 13.8729468,5.39049941 13.395,5.3905 L13.395,5.3905 Z" id="形状" fill="#8CA4BA"></path>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>点赞</title>
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path d="M13.395,5.3905 L9.257,5.3905 C9.4535,4.699 9.553,4.0845 9.553,3.5435 C9.553,2.316 8.431,1.1405 7.357,1.2965 C6.41,1.434 5.958,2.2325 5.958,3.258 L5.958,4.1845 C5.958,5.373 5.0485,6.3865 3.892,6.498 L2.0525,6.495 C1.4712203,6.495 1,6.9662203 1,7.5475 L1,13.625 C1,14.2065 1.471,14.6775 2.0525,14.6775 L12.243,14.6775 C13.0141535,14.6775 13.6763396,14.1291539 13.82,13.3715 L14.972,7.294 C15.0608892,6.82439182 14.9358631,6.3395998 14.6309458,5.97155283 C14.3260285,5.60350586 13.8729468,5.39049941 13.395,5.3905 Z M2,13.625 L2,7.5475 C2,7.5185 2.0235,7.495 2.0525,7.495 L3.25,7.495 L3.25,13.6775 L2.0525,13.6775 C2.02350505,13.6775 2,13.6539949 2,13.625 L2,13.625 Z M13.9895,7.108 L12.8375,13.1855 C12.7832202,13.4709991 12.5336132,13.6775 12.243,13.6775 L4.25,13.6775 L4.25,7.451 C5.8188449,7.15150285 6.95470437,5.78117313 6.958,4.184 L6.958,3.258 C6.958,2.671 7.1465,2.3375 7.5005,2.2865 C7.923,2.225 8.553,2.8855 8.553,3.544 C8.553,4.127 8.4045,4.8565 8.102,5.727 C8.04891415,5.87989332 8.07311785,6.0490253 8.16695458,6.1808932 C8.2607913,6.31276111 8.41265293,6.39105216 8.5745,6.391 L13.395,6.391 C13.5750607,6.3910127 13.7457587,6.47122841 13.8606881,6.60983965 C13.9756175,6.74845089 14.0228335,6.93105165 13.9895,7.108 Z" id="形状" fill="#8CA4BA"></path>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>已点赞</title>
<g id="游戏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="游戏-快捷回复AI" transform="translate(-1502, -617)" fill-rule="nonzero">
<g id="编组-4备份-2" transform="translate(1378, 169.68)">
<g id="已点赞" transform="translate(124, 447.32)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path d="M1,7.5475 L1,13.625 C1,14.2065 1.471,14.6775 2.0525,14.6775 L3,14.6775 L3,6.505 L2.0525,6.495 C1.4712203,6.495 1,6.9662203 1,7.5475 Z M13.395,5.3905 L9.2105,5.417 C9.407,4.7255 9.5065,4.111 9.5065,3.57 C9.5065,2.3425 8.431,1.1405 7.357,1.2965 C6.41,1.434 6.306,2.2525 6.306,3.278 L6.306,4.204 C6.306,5.3925 5.3085,6.405 4.152,6.5165 L4,6.515 L4,14.6775 L12.243,14.6775 C13.0141535,14.6775 13.6763396,14.1291539 13.82,13.3715 L14.972,7.294 C15.0608892,6.82439182 14.9358631,6.3395998 14.6309458,5.97155283 C14.3260285,5.60350586 13.8729468,5.39049941 13.395,5.3905 L13.395,5.3905 Z" id="形状" fill="#8CA4BA"></path>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" 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(-1147.000000, -762.000000)" fill-rule="nonzero">
<g id="4.数据展示/10.Popover气泡卡片/上左⬇️" transform="translate(1136.000000, 649.000000)">
<g id="怒" transform="translate(11.000000, 113.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="14" height="14"></rect>
<path d="M12.768,4.83 C12.8986667,5.166 12.9966667,5.51366667 13.062,5.873 C13.1273333,6.23233333 13.16,6.608 13.16,7 C13.16,7.84 12.999,8.63333333 12.677,9.38 C12.355,10.1266667 11.9163333,10.7753333 11.361,11.326 C10.8056667,11.8766667 10.157,12.313 9.415,12.635 C8.673,12.957 7.87733333,13.118 7.028,13.118 C6.188,13.118 5.39466667,12.957 4.648,12.635 C3.90133333,12.313 3.25266667,11.8766667 2.702,11.326 C2.15133333,10.7753333 1.715,10.1266667 1.393,9.38 C1.071,8.63333333 0.91,7.84 0.91,7 C0.91,6.61733333 0.942666667,6.24633333 1.008,5.887 C1.07333333,5.52766667 1.17133333,5.18 1.302,4.844 C1.302,4.77138003 1.80645408,3.67280698 2.058,3.416 C2.618,2.64133333 3.32966667,2.023 4.193,1.561 C5.05633333,1.099 6.00133333,0.868 7.028,0.868 C8.05466667,0.868 8.99733333,1.09666667 9.856,1.554 C10.7146667,2.01133333 11.424,2.62266667 11.984,3.388 C12.1504838,3.56624497 12.768,4.80553547 12.768,4.83 Z" id="形状" fill="#FFD840"></path>
<path d="M3.416,3.752 C3.53733333,4.15333333 3.668,4.51733333 3.808,4.844 C3.92933333,5.124 4.06466667,5.39466667 4.214,5.656 C4.36333333,5.91733333 4.51733333,6.09 4.676,6.174 C4.83466667,6.258 5.00266667,6.26266667 5.18,6.188 C5.35733333,6.11333333 5.52066667,6.01533333 5.67,5.894 C5.838,5.754 6.01066667,5.58133333 6.188,5.376 L3.416,3.752 Z" id="路径" fill="#873618"></path>
<path d="M9.9100167,10.630065 C9.97364586,10.6075526 10.0233561,10.5775361 10.0591476,10.5400154 C10.094939,10.5024948 10.1187999,10.4612221 10.1307304,10.4161973 C10.1426608,10.3711726 10.1486261,10.3298999 10.1486261,10.2923792 C10.1486261,10.2548586 10.1446492,10.2248421 10.1366956,10.2023297 C10.1207883,10.164809 10.1088578,10.1385446 10.1009042,10.1235363 C10.0929505,10.1085281 10.0889737,10.0935198 10.0889737,10.0785116 C9.89808623,9.66578455 9.53818376,9.33185086 9.00926632,9.07671052 C8.48034888,8.82157017 7.85002246,8.694 7.11828706,8.694 C6.75241936,8.694 6.40444736,8.73152064 6.07437106,8.80656192 C5.74429476,8.88160319 5.44802146,8.98478495 5.18555115,9.11610719 C4.92308085,9.24742942 4.69839035,9.40501611 4.51147968,9.58886724 C4.32456901,9.77271837 4.19532226,9.96970172 4.12373945,10.1798173 C4.12373945,10.1873214 4.11976263,10.1948256 4.11180898,10.2023297 C4.09590169,10.2473545 4.09987852,10.3242718 4.12373945,10.4330816 C4.14760039,10.5418915 4.2191832,10.6075526 4.33848789,10.630065 C4.52142174,10.4199494 4.74412382,10.2285941 5.00659413,10.0559992 C5.23724985,9.90591664 5.5235811,9.77084234 5.86558786,9.65077629 C6.20759463,9.53071025 6.61720738,9.47067723 7.09442612,9.47067723 C7.57164486,9.47067723 7.98722285,9.53071025 8.34116008,9.65077629 C8.69509732,9.77084234 8.9873938,9.90591664 9.21804952,10.0559992 C9.48847348,10.2285941 9.7191292,10.4199494 9.9100167,10.630065 L9.9100167,10.630065 Z" id="路径" fill="#873618"></path>
<path d="M9.338,6.174 C9.49666667,6.09 9.65066667,5.91733333 9.8,5.656 C9.94933333,5.39466667 10.0846667,5.124 10.206,4.844 C10.346,4.51733333 10.4766667,4.15333333 10.598,3.752 L7.826,5.376 C8.00333333,5.58133333 8.176,5.754 8.344,5.894 C8.49333333,6.01533333 8.65666667,6.11333333 8.834,6.188 C9.01133333,6.26266667 9.17933333,6.258 9.338,6.174 L9.338,6.174 Z" id="路径" fill="#873618"></path>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11 10">
<defs>
<linearGradient id="a" y2="50%" x2="100%" y1="50%" x1="0%">
<stop offset="0%" stop-color="#6EE7E9" />
<stop offset="47.431%" stop-color="#9FF2CD" />
<stop offset="100%" stop-color="#E3FDB2" />
</linearGradient>
</defs>
<path fill="url(#a)"
d="M8.995 4.884a.141.141 0 0 1-.009.264c-.726.247-2.33.82-2.696 1.188-.447.447-.932 1.887-1.154 2.607a.14.14 0 0 1-.267.006c-.255-.714-.807-2.144-1.275-2.613-.348-.348-1.892-.936-2.58-1.188a.141.141 0 0 1-.01-.261c.668-.295 2.166-.985 2.59-1.408.402-.403 1.006-1.785 1.277-2.437a.141.141 0 0 1 .263.007c.234.655.755 2.029 1.156 2.43.423.422 1.996 1.11 2.705 1.405Z"
transform="translate(.157)" fill-rule="nonzero" />
</svg>
\ No newline at end of file
<svg t="1756195887325" class="icon" viewBox="0 0 1034 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7768" width="200" height="200"><path d="M1011.982 842.518 606.673 140.565c-49.575-85.822-130.595-85.822-180.157 0L21.205 842.518c-49.562 85.91-9.015 155.99 90.04 155.99l810.693 0C1020.997 998.507 1061.502 928.423 1011.982 842.518zM460.924 339.737c14.565-15.747 33.082-23.622 55.665-23.622 22.595 0 41.095 7.792 55.675 23.307 14.485 15.55 21.725 34.997 21.725 58.382 0 20.12-30.235 168.07-40.32 275.704l-72.825 0c-8.845-107.635-41.652-255.584-41.652-275.704C439.194 374.774 446.446 355.407 460.924 339.737zM571.244 851.538c-15.32 14.92-33.55 22.355-54.65 22.355-21.095 0-39.33-7.435-54.647-22.355-15.275-14.885-22.867-32.915-22.867-54.09 0-21.065 7.592-39.29 22.867-54.565 15.317-15.28 33.552-22.92 54.647-22.92 21.1 0 39.33 7.64 54.65 22.92 15.265 15.275 22.875 33.5 22.875 54.565C594.119 818.623 586.509 836.653 571.244 851.538z" p-id="7769"></path></svg>
\ No newline at end of file
import Vue from 'vue'
import SvgIcon from '@/components/svgIcon'// svg component
// register globally
Vue.component('svg-icon', SvgIcon)
// 只批量导入,交由 svg-sprite-loader 处理生成与注入 sprite
const req = require.context('./icon/svg', false, /\.svg$/)
req.keys().forEach(req)
<!--
# 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
<template>
<div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
<svg v-else :class="svgClass" aria-hidden="true" :style="{ display: iconClass || svgName ? '' : 'none' }"
v-on="$listeners">
<use :xlink:href="iconName" />
</svg>
</template>
<script lang="jsx">
// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage
import { isExternal } from '@/utils/validate'
export default {
name: 'SvgIcon',
props: {
iconClass: {
type: String,
default: ''
},
svgName: {
type: String,
default: ''
},
className: {
type: String,
default: ''
}
},
computed: {
isExternal() {
return isExternal(this.iconClass)
},
iconName() {
if (this.svgName) {
return `#${this.svgName}`
}
return `#icon-${this.iconClass}`
},
svgClass() {
if (this.className) {
return 'svg-icon ' + this.className
} else {
return 'svg-icon'
}
},
styleExternalIcon() {
return {
mask: `url(${this.iconClass}) no-repeat 50% 50%`,
'-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
}
}
}
}
</script>
<style scoped>
.svg-icon {
width: 1em;
height: 1em;
/* vertical-align: -0.15em; */
fill: currentColor;
overflow: hidden;
}
.svg-external-icon {
background-color: currentColor;
mask-size: cover !important;
display: inline-block;
}
</style>
...@@ -7,10 +7,13 @@ import _ from 'lodash'; ...@@ -7,10 +7,13 @@ import _ from 'lodash';
import ElementUI from 'element-ui'; import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css'; import 'element-ui/lib/theme-chalk/index.css';
import 'lib-flexible/flexible.js' import 'lib-flexible/flexible.js'
// 引入 SVG 图标系统
import '@/assets/index.js'
Vue.use(ElementUI); Vue.use(ElementUI);
// import '@/styles/element-theme-colors.css'; // import '@/styles/element-theme-colors.css';
import '@/styles/index.scss'; import '@/styles/index.scss';
import moment from 'moment' import moment from 'moment'
import '@/styles/tailwind.css'
import VConsole from 'vconsole'; import VConsole from 'vconsole';
import uploading from '@/utils/cos-upload' import uploading from '@/utils/cos-upload'
import errorHandle from '@/utils/errorHandle' import errorHandle from '@/utils/errorHandle'
...@@ -26,27 +29,26 @@ Vue.use(globalComponent).use(permission).use(clickagain).use(loadmore).use(scrol ...@@ -26,27 +29,26 @@ Vue.use(globalComponent).use(permission).use(clickagain).use(loadmore).use(scrol
import '@/utils/vconsoleCleanup' import '@/utils/vconsoleCleanup'
// 开发环境下初始化 stagewise 工具栏 // 开发环境下初始化 stagewise 工具栏
if (process.env.NODE_ENV === 'development') { // if (process.env.NODE_ENV === 'development') {
import('@stagewise/toolbar-vue').then(({ StagewiseToolbar }) => { // import('@stagewise/toolbar-vue').then(({ StagewiseToolbar }) => {
import('@stagewise-plugins/vue').then(({ VuePlugin }) => { // import('@stagewise-plugins/vue').then(({ VuePlugin }) => {
const stagewiseConfig = { // const stagewiseConfig = {
plugins: [VuePlugin] // plugins: [VuePlugin]
}; // };
// 动态创建并挂载 StagewiseToolbar 组件 // // 动态创建并挂载 StagewiseToolbar 组件
const ToolbarConstructor = Vue.extend({ // const ToolbarConstructor = Vue.extend({
render(h) { // render(h) {
return h(StagewiseToolbar, { props: { config: stagewiseConfig } }); // return h(StagewiseToolbar, { props: { config: stagewiseConfig } });
} // }
}); // });
const toolbarInstance = new ToolbarConstructor(); // const toolbarInstance = new ToolbarConstructor();
toolbarInstance.$mount(); // toolbarInstance.$mount();
document.body.appendChild(toolbarInstance.$el); // document.body.appendChild(toolbarInstance.$el);
}); // });
}).catch(err => { // }).catch(err => {
console.error('Failed to initialize stagewise toolbar:', err); // console.error('Failed to initialize stagewise toolbar:', err);
}); // });
} // }
// 开发环境不收集日志 // 开发环境不收集日志
if (process.env.NODE_ENV !== 'development') { if (process.env.NODE_ENV !== 'development') {
errorHandle.onload() errorHandle.onload()
......
...@@ -12,6 +12,7 @@ import taskRecord from '../views/taskRecord.vue' ...@@ -12,6 +12,7 @@ import taskRecord from '../views/taskRecord.vue'
import mailList from '@/views/mailList.vue' import mailList from '@/views/mailList.vue'
import quickSendGame from '@/views/quickSendGame.vue' import quickSendGame from '@/views/quickSendGame.vue'
import taskList from '@/views/taskList.vue' import taskList from '@/views/taskList.vue'
import aiChat from '@/views/components/aiChat/aiChat.vue'
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
import store from '@/store' import store from '@/store'
Vue.use(VueRouter) Vue.use(VueRouter)
...@@ -84,10 +85,16 @@ const routes = [ ...@@ -84,10 +85,16 @@ const routes = [
component: taskList component: taskList
}, },
{ {
path: '/aiChat',
name: 'aiChat',
component: aiChat
},
{
path: '/login', path: '/login',
name: 'login', name: 'login',
component: () => import('../views/newLogin.vue') component: () => import('../views/newLogin.vue')
}, },
] ]
const router = new VueRouter({ const router = new VueRouter({
/* 这里用 hash 模式 因为本项目是在企微 服务器下的一个二级页面 如果用 history 模式 需要修改 nginx 配置 在 nginx 配置中 需要添加 location /company_app/ { /* 这里用 hash 模式 因为本项目是在企微 服务器下的一个二级页面 如果用 history 模式 需要修改 nginx 配置 在 nginx 配置中 需要添加 location /company_app/ {
......
@tailwind base;
@tailwind components;
@tailwind utilities;
/*
* @Author: maoxiya 937667504@qq.com
* @Date: 2025-05-27 11:32:14
* @LastEditors: maoxiya 937667504@qq.com
* @LastEditTime: 2025-09-01 16:17:04
* @FilePath: /company_app/src/utils/auth.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
import store from '@/store/index' import store from '@/store/index'
const TokenKey = 'token' const TokenKey = 'token'
......
...@@ -71,11 +71,16 @@ service.interceptors.response.use( ...@@ -71,11 +71,16 @@ service.interceptors.response.use(
// cancelPending(response.config) // cancelPending(response.config)
// 如果状态码不是成功,则判断为错误 // 如果状态码不是成功,则判断为错误
if (res.status_code !== STATUS_CODE_SUCCESS) { if (res.status_code !== STATUS_CODE_SUCCESS) {
// 如果请求参数中 有 noMessage 则不显示错误信息
if (response.config.data && JSON.parse(response.config.data) && JSON.parse(response.config.data).noMessage) {
return res
}else{
Message({ Message({
message: res.msg || 'Error', message: res.msg || 'Error',
type: 'error', type: 'error',
duration: 2 * 1000 duration: 2 * 1000
}) })
}
if (res.status_code === -100) { if (res.status_code === -100) {
// 登录 过期 重新去登录 // 登录 过期 重新去登录
setTimeout(() => { setTimeout(() => {
......
/**
* @param {string} str
* @returns {Boolean}
*/
export function isExternal(str) {
return /^(https?:|mailto:|tel:)/.test(str)
}
/**
* @param {string} str
* @returns {Boolean}
*/
export function validUsername(str) {
const valid_map = ['admin', 'editor']
return valid_map.indexOf(str.trim()) >= 0
}
/**
* @param {string} url
* @returns {Boolean}
*/
export function validURL(url) {
const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
return reg.test(url)
}
/**
* @param {string} str
* @returns {Boolean}
*/
export function validLowerCase(str) {
const reg = /^[a-z]+$/
return reg.test(str)
}
/**
* @param {string} str
* @returns {Boolean}
*/
export function validUpperCase(str) {
const reg = /^[A-Z]+$/
return reg.test(str)
}
/**
* @param {string} str
* @returns {Boolean}
*/
export function validAlphabets(str) {
const reg = /^[A-Za-z]+$/
return reg.test(str)
}
/**
* @param {string} email
* @returns {Boolean}
*/
export function validEmail(email) {
const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
return reg.test(email)
}
/**
* @param {string} str
* @returns {Boolean}
*/
export function isString(str) {
if (typeof str === 'string' || str instanceof String) {
return true
}
return false
}
/**
* @param {Array} arg
* @returns {Boolean}
*/
export function isArray(arg) {
if (typeof Array.isArray === 'undefined') {
return Object.prototype.toString.call(arg) === '[object Array]'
}
return Array.isArray(arg)
}
<template> <template>
<div class="violationRecord"> <div class="violationRecord">
<el-form <el-form v-loading="loading" class="violationRecordContent" label-width="90px">
v-loading="loading"
class="violationRecordContent"
label-width="90px"
>
<div v-if="violationList.length > 0"> <div v-if="violationList.length > 0">
<div <div v-for="(item, index) in violationList" :key="index" class="contentItem">
v-for="(item, index) in violationList"
:key="index"
class="contentItem"
>
<el-form-item label="违规时间:"> <el-form-item label="违规时间:">
<p>{{ item.violation_time }}</p> <p>{{ item.violation_time }}</p>
</el-form-item> </el-form-item>
...@@ -31,15 +23,9 @@ ...@@ -31,15 +23,9 @@
<el-form-item label="是否允许申诉:"> <el-form-item label="是否允许申诉:">
<p class="error">{{ item.appeal_name }}</p> <p class="error">{{ item.appeal_name }}</p>
</el-form-item> </el-form-item>
<el-form-item <el-form-item v-if="item.remake != ''" label="详情:">
v-if="item.remake != ''"
label="详情:"
>
<!-- AI自动封禁 --> <!-- AI自动封禁 -->
<div <div v-if="item.information_type === 6" class="remarkType">
v-if="item.information_type === 6"
class="remarkType"
>
<p> <p>
<span class="label">所属项目:</span><span>{{ item.newRemake.project || "" }}</span> <span class="label">所属项目:</span><span>{{ item.newRemake.project || "" }}</span>
</p> </p>
...@@ -66,29 +52,16 @@ ...@@ -66,29 +52,16 @@
</p> </p>
</div> </div>
<!-- 其他类型 --> <!-- 其他类型 -->
<div <div v-else class="remarkType">
v-else <div v-if="item.remake.indexOf('src=') !== -1" class="remakeImage">
class="remarkType"
>
<div
v-if="item.remake.indexOf('src=') !== -1"
class="remakeImage"
>
<p class="watchDetails"> <p class="watchDetails">
<el-button <el-button type="text" icon="el-icon-view" size="medium"
type="text"
icon="el-icon-view"
size="medium"
style="z-index: 1; position: relative; margin-left: 5px" style="z-index: 1; position: relative; margin-left: 5px"
@click="showRemake(item.remake)" @click="showRemake(item.remake)">查看大图</el-button>
>查看大图</el-button>
</p> </p>
<p class="remakeDetails" v-html="item.remake"></p> <p class="remakeDetails" v-html="item.remake"></p>
</div> </div>
<div <div v-else class="remakeImage">
v-else
class="remakeImage"
>
<p class="remakeDetails" v-html="item.remake"></p> <p class="remakeDetails" v-html="item.remake"></p>
</div> </div>
</div> </div>
...@@ -96,38 +69,14 @@ ...@@ -96,38 +69,14 @@
<!-- 命中统计表格 --> <!-- 命中统计表格 -->
<div v-if="item && item.newRemake && item.newRemake.hit"> <div v-if="item && item.newRemake && item.newRemake.hit">
<div <div class="title" style="font-weight: 600; margin-bottom: 10px">
class="title"
style="font-weight: 600; margin-bottom: 10px"
>
命中统计 命中统计
</div> </div>
<el-table <el-table :data="item.newRemake.hit" size="medium" style="width: 100%" class="hit-statistics-table">
:data="item.newRemake.hit" <el-table-column prop="content" label="文本内容" show-overflow-tooltip />
size="medium" <el-table-column prop="type" label="命中类型" width="120" />
style="width: 100%" <el-table-column prop="key" label="关键字" width="120" show-overflow-tooltip />
class="hit-statistics-table" <el-table-column label="时间" width="180">
>
<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 }"> <template slot-scope="{ row }">
<span>{{ $moment(row.time).format("YYYY-MM-DD HH:mm:ss") }}</span> <span>{{ $moment(row.time).format("YYYY-MM-DD HH:mm:ss") }}</span>
</template> </template>
...@@ -138,27 +87,14 @@ ...@@ -138,27 +87,14 @@
</div> </div>
<!-- 无数据状态 --> <!-- 无数据状态 -->
<div <div v-if="!loading && violationList.length == 0" class="noContent rowFlex allCenter">
v-if="!loading && violationList.length == 0"
class="noContent rowFlex allCenter"
>
<noContent title="暂无数据" description="当前没有任何数据,请稍后再试或联系管理员" /> <noContent title="暂无数据" description="当前没有任何数据,请稍后再试或联系管理员" />
</div> </div>
</el-form> </el-form>
<!-- 查看大图弹窗 --> <!-- 查看大图弹窗 -->
<el-dialog <el-dialog title="查看大图" :visible.sync="imageLayer" width="320px" center append-to-body @close="imageLayer = false">
title="查看大图" <div v-html="imageSrc" class="layerImage"></div>
:visible.sync="imageLayer"
width="320px"
center
append-to-body
@close="imageLayer = false"
>
<div
v-html="imageSrc"
class="layerImage"
></div>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
...@@ -274,7 +210,8 @@ export default { ...@@ -274,7 +210,8 @@ export default {
border-bottom: 1px dashed #ebeef5; border-bottom: 1px dashed #ebeef5;
margin-bottom: 20px; margin-bottom: 20px;
padding-bottom: 20px; padding-bottom: 20px;
::v-deep .el-form-item__label{
::v-deep .el-form-item__label {
line-height: 40px; line-height: 40px;
} }
...@@ -362,6 +299,7 @@ export default { ...@@ -362,6 +299,7 @@ export default {
.remakeDetails { .remakeDetails {
word-break: break-all; word-break: break-all;
::v-deep img { ::v-deep img {
max-width: 200px; max-width: 200px;
max-height: 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> <template>
<div class="gift-tab-container-errorHanledle"> <div class="gift-tab-container-errorHanledle">
<el-tabs v-model="activeTab"> <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"> <el-tab-pane label="误操作" name="errorHandle">
<errorHandle v-if="activeTab=='errorHandle'"></errorHandle> <errorHandle v-if="activeTab == 'errorHandle'"></errorHandle>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="转区申请" name="serve"> <el-tab-pane label="转区申请" name="serve">
<AreaTransferApply v-if="activeTab=='serve'" /> <AreaTransferApply v-if="activeTab == 'serve'" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="转端申请" name="terminal"> <el-tab-pane label="转端申请" name="terminal">
<TerminalTransfer v-if="activeTab=='terminal'" /> <TerminalTransfer v-if="activeTab == 'terminal'" />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
...@@ -17,43 +28,51 @@ ...@@ -17,43 +28,51 @@
import AreaTransferApply from './components/ApplyRecords/AreaTransferApply.vue' import AreaTransferApply from './components/ApplyRecords/AreaTransferApply.vue'
import errorHandle from './components/ApplyRecords/errorHandle.vue' import errorHandle from './components/ApplyRecords/errorHandle.vue'
import TerminalTransfer from './components/ApplyRecords/TerminaTranfer.vue' import TerminalTransfer from './components/ApplyRecords/TerminaTranfer.vue'
import report from './components/roleInfo/report.vue'
export default { export default {
name: 'applyRecord', name: 'applyRecord',
components: { components: {
AreaTransferApply, AreaTransferApply,
errorHandle, errorHandle,
TerminalTransfer TerminalTransfer,
report
}, },
data() { data() {
return { return {
activeTab: 'errorHandle' activeTab: 'report'
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.gift-tab-container-errorHanledle { .gift-tab-container-errorHanledle {
//padding: 20px; //padding: 20px;
width: 100%; width: 100%;
height: 100%; height: 100%;
padding-top: 10px; padding-top: 10px;
background: #fff; background: #fff;
::v-deep .el-tabs{
::v-deep .el-tabs {
height: calc(100% - 40px); height: calc(100% - 40px);
} }
::v-deep .el-tabs__content{
::v-deep .el-tabs__content {
height: 100%; height: 100%;
} }
::v-deep .el-tab-pane{
::v-deep .el-tab-pane {
height: 100%; height: 100%;
} }
::v-deep .el-tabs .el-tabs__header{
::v-deep .el-tabs .el-tabs__header {
margin: 0; margin: 0;
// height: 60px; // 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; line-height: 50px;
} }
} }
</style> </style>
\ No newline at end of file \ No newline at end of file
...@@ -2,123 +2,57 @@ ...@@ -2,123 +2,57 @@
<div class="terminaListArea" v-scroll="paperScroll"> <div class="terminaListArea" v-scroll="paperScroll">
<div class="addApply rowFlex spaceBetween"> <div class="addApply rowFlex spaceBetween">
<span></span> <span></span>
<el-button <el-button type="primary" size="small" icon="el-icon-plus"
type="primary" @click="showaddAreaTransfer = true, areaTransferItem = {}">新增转区申请</el-button>
size="small"
icon="el-icon-plus"
@click="showaddAreaTransfer = true,areaTransferItem = {}"
>新增转区申请</el-button>
</div> </div>
<el-form <el-form ref="taskForm" :model="terminaForm" class="taskForm" label-position="top" label-width="85px">
ref="taskForm"
:model="terminaForm"
class="taskForm"
label-position="top"
label-width="85px"
>
<el-form-item label="审批状态"> <el-form-item label="审批状态">
<el-select <el-select v-model="terminaForm.approval_status" style="width:95%;" clearable placeholder="请选择审批状态"
v-model="terminaForm.approval_status" @change="filterChange">
style="width:95%;" <el-option v-for="item in approvalList" :key="item.value" :label="item.label" :value="item.value">
clearable
placeholder="请选择审批状态"
@change="filterChange"
>
<el-option
v-for="item in approvalList"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="创建时间"> <el-form-item label="创建时间">
<selectDate <selectDate :default-value="dateValue" :type="true" :no-clearable="true" style="width: 95%"
:default-value="dateValue" @result="createResult" />
:type="true"
:no-clearable="true"
style="width: 95%"
@result="createResult"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div <div class="terminaListAreaList">
class="terminaListAreaList"
>
<!-- 举报申请 --> <!-- 举报申请 -->
<div class="scrollMain" v-if="terminaList.length > 0"> <div class="scrollMain" v-if="terminaList.length > 0">
<div <div v-for="(item, index) in terminaList" :key="item.id || index" class="terminaContent"
v-for="(item, index) in terminaList" @click="terminaProcess(item, index)">
:key="item.id || index"
class="terminaContent"
@click="terminaProcess(item, index)"
>
<div class="terminaItem rowFlex spaceBetween columnCenter"> <div class="terminaItem rowFlex spaceBetween columnCenter">
<i :class=" item.showStep?'el-icon-arrow-down':'el-icon-arrow-right'" class="svgicon"></i> <i :class="item.showStep ? 'el-icon-arrow-down' : 'el-icon-arrow-right'" class="svgicon"></i>
<div class="terminaItemLeft"> <div class="terminaItemLeft">
<p><span class="label">新区角色:</span><span class="value">{{ item.role_name }}({{ item.server_name }})</span></p> <p><span class="label">新区角色:</span><span class="value">{{ item.role_name }}({{ item.server_name }})</span>
<p><span class="label">老区角色:</span><span class="value">{{ item.old_role_name }} ({{ item.old_server_name }}) </span></p> </p>
<p><span class="label">老区角色:</span><span class="value">{{ item.old_role_name }} ({{ item.old_server_name
}}) </span></p>
<p> <p>
<span class="label">登记时间:</span><span class="value">{{ item.create_time || '' }}</span> <span class="label">登记时间:</span><span class="value">{{ item.create_time || '' }}</span>
</p> </p>
</div> </div>
<div class="terminaItemRight columnFlex columnCenter"> <div class="terminaItemRight columnFlex columnCenter">
<el-button <el-button v-if="item.approval_status == 4 && item.related_request_id == 0" type="primary" size="mini"
v-if="item.approval_status == 4 && item.related_request_id == 0" style="margin-bottom:15px;" @click.stop="resubmitApproval(item)">重新提交</el-button>
type="primary" <!-- 改成 svg-icon 图标 -->
size="mini" <svg-icon v-if="item.approval_status == 1" icon-class="shenpi1" class="icon" />
style="margin-bottom:15px;" <svg-icon v-else-if="item.approval_status == 2" icon-class="shenpi2" class="icon" />
@click.stop="resubmitApproval(item)" <svg-icon v-else-if="item.approval_status == 3" icon-class="shenpi3" class="icon" />
>重新提交</el-button> <svg-icon v-else-if="item.approval_status == 4" icon-class="shenpi4" class="icon" />
<img <svg-icon v-else-if="item.approval_status == 5" icon-class="shenpi5" class="icon" />
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"
/>
</div> </div>
</div> </div>
<!-- 审批进度 --> <!-- 审批进度 -->
<el-collapse-transition> <el-collapse-transition>
<div <div v-if="item.showStep" class="terminaProcessList">
v-if="item.showStep" <el-steps direction="vertical" :active="item.current" finish-status="success">
class="terminaProcessList" <el-step v-for="(items, indexs) in item.terminaProcessList" :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.terminaProcessList"
:key="'trans_item_' + indexs"
:title="items.node_name"
>
<template slot="description"> <template slot="description">
<div <div v-if="items" class="trans-follow-1 card-style">
v-if="items"
class="trans-follow-1 card-style"
>
<div class="follow-item"> <div class="follow-item">
<span class="follow-info-label label-font"> <span class="follow-info-label label-font">
{{ items.node_sort !== '0' ? '审批人:' : '登记人:' }} {{ items.node_sort !== '0' ? '审批人:' : '登记人:' }}
...@@ -126,32 +60,21 @@ ...@@ -126,32 +60,21 @@
<span class="info-value value-font"> <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> </span>
<el-tooltip <el-tooltip v-if="Array.isArray(items.user_name) && items.user_name.length > 1" class="item"
v-if="Array.isArray(items.user_name) && items.user_name.length > 1" effect="dark" :content="items.user_name.slice(1).join('、')" placement="top">
class="item"
effect="dark"
:content="items.user_name.slice(1).join('、')"
placement="top"
>
<span class="info-value value-font info-value-color"> <span class="info-value value-font info-value-color">
{{ `+${items.user_name.length - 1}` }} {{ `+${items.user_name.length - 1}` }}
</span> </span>
</el-tooltip> </el-tooltip>
</div> </div>
<div <div v-if="items.node_sort !== '0' || items.node_name === '系统'" class="follow-item">
v-if="items.node_sort !== '0' || items.node_name === '系统'"
class="follow-item"
>
<span class="follow-info-label label-font"> <span class="follow-info-label label-font">
审批结果: 审批结果:
</span> </span>
<span <span class="info-value value-font"
class="info-value value-font" :class="items.current < indexs ? '' : switchStateTag(items.approval_result)">
:class="items.current < indexs ? '' : switchStateTag(items.approval_result)" {{ items.current < indexs ? '' : items.approval_result_text }} </span>
>
{{ items.current < indexs ? '' : items.approval_result_text }}
</span>
</div> </div>
<div class="follow-item"> <div class="follow-item">
<span class="follow-info-label label-font"> <span class="follow-info-label label-font">
...@@ -161,10 +84,8 @@ ...@@ -161,10 +84,8 @@
{{ items.node_sort === '0' ? items.create_time : items.update_time }} {{ items.node_sort === '0' ? items.create_time : items.update_time }}
</span> </span>
</div> </div>
<div <div v-if="(items.node_sort !== '0' || items.node_name === '系统') && items.approval_result === '2'"
v-if="(items.node_sort !== '0' || items.node_name === '系统') && items.approval_result === '2'" class="follow-item">
class="follow-item"
>
<span class="follow-info-label label-font"> <span class="follow-info-label label-font">
驳回原因: 驳回原因:
</span> </span>
...@@ -173,8 +94,7 @@ ...@@ -173,8 +94,7 @@
</div> </div>
<div <div
v-if="items.node_sort === item.terminaProcessList[item.terminaProcessList.length - 1].node_sort + '' && items.approval_result === '1' && items.node_sort !== '0'" v-if="items.node_sort === item.terminaProcessList[item.terminaProcessList.length - 1].node_sort + '' && items.approval_result === '1' && items.node_sort !== '0'"
class="follow-item-remark follow-item" class="follow-item-remark follow-item">
>
<span class="follow-info-label label-font"> <span class="follow-info-label label-font">
处理结果: 处理结果:
</span> </span>
...@@ -182,24 +102,17 @@ ...@@ -182,24 +102,17 @@
{{ items.extra_attribution.banned_text }} {{ items.extra_attribution.banned_text }}
</span> </span>
</div> </div>
<div <div v-if="items.node_name !== '系统' && items.extra_attribution && items.extra_attribution.remark"
v-if="items.node_name !== '系统' && items.extra_attribution && items.extra_attribution.remark" class="info-item-remark">
class="info-item-remark"
>
<div style="display: flex;"> <div style="display: flex;">
<span class="info-label remark-label">详情:</span> <span class="info-label remark-label">详情:</span>
<span <span class="preview-btn" @click.stop="previewRemark(items.extra_attribution.remark)">
class="preview-btn"
@click.stop="previewRemark(items.extra_attribution.remark)"
>
<i class="el-icon-view"></i> <i class="el-icon-view"></i>
点击查看大图 点击查看大图
</span> </span>
</div> </div>
<div <div class="remark-value"
class="remark-value" v-html="formatImg(items.extra_attribution && items.extra_attribution.remark ? items.extra_attribution.remark : '')">
v-html="formatImg(items.extra_attribution && items.extra_attribution.remark ? items.extra_attribution.remark : '')"
>
</div> </div>
</div> </div>
</div> </div>
...@@ -212,23 +125,14 @@ ...@@ -212,23 +125,14 @@
</div> </div>
<noContent v-else /> <noContent v-else />
</div> </div>
<el-dialog <el-dialog :visible.sync="dialogRemarkVisible" append-to-body title="查看大图" custom-class="remake-dialog">
:visible.sync="dialogRemarkVisible"
append-to-body
title="查看大图"
custom-class="remake-dialog"
>
<div class="remake-box"> <div class="remake-box">
<div v-html="dialogRemake"></div> <div v-html="dialogRemake"></div>
</div> </div>
</el-dialog> </el-dialog>
<!-- 编辑误操作 --> <!-- 编辑误操作 -->
<AreaTransferDialog <AreaTransferDialog v-if="showaddAreaTransfer" :visible.sync="showaddAreaTransfer"
v-if="showaddAreaTransfer" :area-transfer-item="areaTransferItem" @updateList="updateList" />
:visible.sync="showaddAreaTransfer"
:area-transfer-item="areaTransferItem"
@updateList="updateList"
/>
</div> </div>
</template> </template>
<script> <script>
...@@ -238,11 +142,11 @@ import { removeDp, formatNumber, debounce } from '@/utils/index' ...@@ -238,11 +142,11 @@ import { removeDp, formatNumber, debounce } from '@/utils/index'
import AreaTransferDialog from './AreaTransferDialog.vue' import AreaTransferDialog from './AreaTransferDialog.vue'
import selectDate from '@/components/selectDate.vue' import selectDate from '@/components/selectDate.vue'
// 导入审批状态图标 // 导入审批状态图标
import shenpi1 from '@/assets/icon/shenpi1.svg' import shenpi1 from '@/assets/icon/svg/shenpi1.svg'
import shenpi2 from '@/assets/icon/shenpi2.svg' import shenpi2 from '@/assets/icon/svg/shenpi2.svg'
import shenpi3 from '@/assets/icon/shenpi3.svg' import shenpi3 from '@/assets/icon/svg/shenpi3.svg'
import shenpi4 from '@/assets/icon/shenpi4.svg' import shenpi4 from '@/assets/icon/svg/shenpi4.svg'
import shenpi5 from '@/assets/icon/shenpi5.svg' import shenpi5 from '@/assets/icon/svg/shenpi5.svg'
import noContent from '@/components/noContent.vue' import noContent from '@/components/noContent.vue'
export default { export default {
name: 'AreaTransferApply', name: 'AreaTransferApply',
...@@ -291,9 +195,9 @@ export default { ...@@ -291,9 +195,9 @@ export default {
shenpi5 shenpi5
} }
}, },
watch:{ watch: {
accountSelect(newVal, oldVal) { accountSelect(newVal, oldVal) {
console.log(newVal,'newVal') console.log(newVal, 'newVal')
if (newVal && newVal !== '') { if (newVal && newVal !== '') {
this.pageInfo = { this.pageInfo = {
page: 0, page: 0,
...@@ -463,9 +367,11 @@ export default { ...@@ -463,9 +367,11 @@ export default {
height: 100%; height: 100%;
overflow: auto; overflow: auto;
overflow-x: hidden; overflow-x: hidden;
::v-deep .el-form-item__label{
::v-deep .el-form-item__label {
font-weight: 400; font-weight: 400;
} }
.addApply { .addApply {
margin-top: 15px; margin-top: 15px;
} }
...@@ -524,6 +430,7 @@ export default { ...@@ -524,6 +430,7 @@ export default {
.terminaListAreaList { .terminaListAreaList {
width: 100%; width: 100%;
.scrollMain { .scrollMain {
width: 100%; width: 100%;
height: auto; height: auto;
...@@ -533,7 +440,8 @@ export default { ...@@ -533,7 +440,8 @@ export default {
width: calc(100% - 20px); width: calc(100% - 20px);
margin-left: 10px; margin-left: 10px;
position: relative; position: relative;
.svgicon{
.svgicon {
position: absolute; position: absolute;
bottom: 12px; bottom: 12px;
right: 2px; right: 2px;
...@@ -635,7 +543,7 @@ export default { ...@@ -635,7 +543,7 @@ export default {
width: 1px; width: 1px;
} }
::v-deep .el-step > .is-success { ::v-deep .el-step>.is-success {
color: #409EFF; color: #409EFF;
border-color: #409EFF; border-color: #409EFF;
...@@ -644,11 +552,11 @@ export default { ...@@ -644,11 +552,11 @@ export default {
} }
} }
::v-deep .el-step__main > .is-success { ::v-deep .el-step__main>.is-success {
color: #409EFF; color: #409EFF;
} }
::v-deep .el-step > .is-process { ::v-deep .el-step>.is-process {
color: #409EFF; color: #409EFF;
border-color: #409EFF; border-color: #409EFF;
...@@ -657,7 +565,7 @@ export default { ...@@ -657,7 +565,7 @@ export default {
} }
} }
::v-deep .el-step__main > .is-process { ::v-deep .el-step__main>.is-process {
color: #409EFF; color: #409EFF;
} }
...@@ -783,7 +691,7 @@ export default { ...@@ -783,7 +691,7 @@ export default {
height: 80px; height: 80px;
} }
&:hover > .preview-pic { &:hover>.preview-pic {
z-index: 100; z-index: 100;
} }
} }
......
...@@ -2,58 +2,26 @@ ...@@ -2,58 +2,26 @@
<div class="terminaListContent" v-scroll="paperScroll"> <div class="terminaListContent" v-scroll="paperScroll">
<div class="addApply rowFlex spaceBetween"> <div class="addApply rowFlex spaceBetween">
<span></span> <span></span>
<el-button <el-button type="primary" icon="el-icon-plus" size="small"
type="primary" @click="(showaddAreaTransfer = true, areaTransferItem = {})">新增转端申请</el-button>
icon="el-icon-plus"
size="small"
@click="(showaddAreaTransfer = true,areaTransferItem = {})"
>新增转端申请</el-button>
</div> </div>
<el-form <el-form ref="taskForm" :model="terminaForm" label-position="top" class="terminaListForm" label-width="85px">
ref="taskForm"
:model="terminaForm"
label-position="top"
class="terminaListForm"
label-width="85px"
>
<el-form-item label="审批状态"> <el-form-item label="审批状态">
<el-select <el-select v-model="terminaForm.approval_status" style="width:95%;" clearable placeholder="请选择审批状态"
v-model="terminaForm.approval_status" @change="filterChange">
style="width:95%;" <el-option v-for="item in approvalList" :key="item.value" :label="item.label" :value="item.value">
clearable
placeholder="请选择审批状态"
@change="filterChange"
>
<el-option
v-for="item in approvalList"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="创建时间"> <el-form-item label="创建时间">
<selectDate <selectDate :default-value="dateValue" :type="true" style="width: 95%" @result="createResult" />
:default-value="dateValue"
:type="true"
style="width: 95%"
@result="createResult"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div <div class="terminaListContentList">
class="terminaListContentList"
>
<!-- 举报申请 --> <!-- 举报申请 -->
<div v-if="terminaList.length>0" class="scrollMain"> <div v-if="terminaList.length > 0" class="scrollMain">
<div <div v-for="(item, index) in terminaList" :key="index" class="terminaContent"
v-for="(item, index) in terminaList" @click="terminaProcess(item, index)">
:key="index"
class="terminaContent"
@click="terminaProcess(item, index)"
>
<div class="terminaItem rowFlex spaceBetween columnCenter"> <div class="terminaItem rowFlex spaceBetween columnCenter">
<div class="terminaItemLeft"> <div class="terminaItemLeft">
<p><span class="label">角色名称:</span><span class="value">{{ item.role_name }}</span></p> <p><span class="label">角色名称:</span><span class="value">{{ item.role_name }}</span></p>
...@@ -64,7 +32,8 @@ ...@@ -64,7 +32,8 @@
<p> <p>
<span class="label">登记时间:</span><span class="value">{{ item.create_time || '' }}</span> <span class="label">登记时间:</span><span class="value">{{ item.create_time || '' }}</span>
</p> </p>
<p><span class="label">转端状态:</span><span class="value">{{ item.trans_check_status_text || '-' }}</span></p> <p><span class="label">转端状态:</span><span class="value">{{ item.trans_check_status_text || '-' }}</span>
</p>
</div> </div>
<!-- 审批进度 --> <!-- 审批进度 -->
<el-collapse-transition> <el-collapse-transition>
...@@ -171,11 +140,11 @@ import { removeDp, formatNumber, debounce } from '@/utils/index' ...@@ -171,11 +140,11 @@ import { removeDp, formatNumber, debounce } from '@/utils/index'
import TerminalTransferDialog from './TerminalTransferDialog.vue' import TerminalTransferDialog from './TerminalTransferDialog.vue'
import selectDate from '@/components/selectDate.vue' import selectDate from '@/components/selectDate.vue'
// 导入审批状态图标 // 导入审批状态图标
import shenpi1 from '@/assets/icon/shenpi1.svg' import shenpi1 from '@/assets/icon/svg/shenpi1.svg'
import shenpi2 from '@/assets/icon/shenpi2.svg' import shenpi2 from '@/assets/icon/svg/shenpi2.svg'
import shenpi4 from '@/assets/icon/shenpi4.svg' import shenpi4 from '@/assets/icon/svg/shenpi4.svg'
import shenpi5 from '@/assets/icon/shenpi5.svg' import shenpi5 from '@/assets/icon/svg/shenpi5.svg'
import shenpi6 from '@/assets/icon/shenpi6.svg' import shenpi6 from '@/assets/icon/svg/shenpi6.svg'
import noContent from '@/components/noContent.vue' import noContent from '@/components/noContent.vue'
export default { export default {
name: 'terminaTranfer', name: 'terminaTranfer',
...@@ -392,12 +361,14 @@ export default { ...@@ -392,12 +361,14 @@ export default {
.terminaListContent { .terminaListContent {
width: 100%; width: 100%;
height: 100%; height: 100%;
.TerminaTranferContent{
.TerminaTranferContent {
width: 100%; width: 100%;
height: 100%; height: 100%;
overflow: auto; overflow: auto;
overflow-x: hidden; overflow-x: hidden;
} }
.terminaListForm { .terminaListForm {
::v-deep .el-form-item__label { ::v-deep .el-form-item__label {
font-weight: 400; font-weight: 400;
...@@ -462,6 +433,7 @@ export default { ...@@ -462,6 +433,7 @@ export default {
.terminaListContentList { .terminaListContentList {
width: 100%; width: 100%;
.scrollMain { .scrollMain {
width: 100%; width: 100%;
height: auto; height: auto;
......
...@@ -3,38 +3,31 @@ ...@@ -3,38 +3,31 @@
<div class="detailsErrorHandleContent" v-scroll="requestOrderList"> <div class="detailsErrorHandleContent" v-scroll="requestOrderList">
<div class="addApply rowFlex spaceBetween"> <div class="addApply rowFlex spaceBetween">
<span></span> <span></span>
<el-button <el-button type="primary" size="small" icon="el-icon-plus"
type="primary" @click="showAddErrorHandle = true, info = null">新增误操作</el-button>
size="small"
icon="el-icon-plus"
@click="showAddErrorHandle = true,info = null"
>新增误操作</el-button>
</div> </div>
<el-form class="filterList" label-position="top" size="small"> <el-form class="filterList" label-position="top" size="small">
<el-form-item label="角色名称" style="margin-bottom:15px;"> <el-form-item label="角色名称" style="margin-bottom:15px;">
<searchSelect :account-change="accountChange" style="width:100%;" placeholder="请输入角色名称" @result="selectResult" /> <searchSelect :account-change="accountChange" style="width:100%;" placeholder="请输入角色名称"
@result="selectResult" />
</el-form-item> </el-form-item>
<el-form-item label="状态" style="margin-bottom:15px;"> <el-form-item label="状态" style="margin-bottom:15px;">
<el-select v-model="pay_type" clearable placeholder="状态" style="width:100%;" @change="payTypeResult"> <el-select v-model="pay_type" clearable placeholder="状态" style="width:100%;" @change="payTypeResult">
<el-option <el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value">
v-for="item in statusList"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="创建时间" style="margin-bottom:15px;"> <el-form-item label="创建时间" style="margin-bottom:15px;">
<el-date-picker v-model="searchDate" type="daterange" clearable style="width:100%;" value-format="yyyy-MM-dd" range-separator="~" start-placeholder="开始日期" end-placeholder="结束日期" @change="dateResult"> </el-date-picker> <el-date-picker v-model="searchDate" type="daterange" clearable style="width:100%;" value-format="yyyy-MM-dd"
range-separator="~" start-placeholder="开始日期" end-placeholder="结束日期" @change="dateResult"> </el-date-picker>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="list"> <div class="list">
<!-- 过滤条件 --> <!-- 过滤条件 -->
<!-- 订单列表 --> <!-- 订单列表 -->
<div class="orderDetailsScroll"> <div class="orderDetailsScroll">
<div v-if="orderList.length>0" class="orderDetailsScrollContent"> <div v-if="orderList.length > 0" class="orderDetailsScrollContent">
<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"> <div class="orderDetailsList">
<el-collapse v-model="collapseValue" @change="handleChange"> <el-collapse v-model="collapseValue" @change="handleChange">
<el-collapse-item :name="item.order_id"> <el-collapse-item :name="item.order_id">
...@@ -61,18 +54,26 @@ ...@@ -61,18 +54,26 @@
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex"> <div class="rowFlex">
<span class="label">状态</span> <span class="label">状态</span>
<p v-if="item.approval_status==1" class="unhandle" style="margin-left:10px;">{{ item.approval_status_text }}</p> <p v-if="item.approval_status == 1" class="unhandle" style="margin-left:10px;">{{
<p v-else-if="item.approval_status==2" style="margin-left:10px;" class="noSend">{{ item.approval_status_text }}</p> item.approval_status_text }}</p>
<p v-else-if="item.approval_status==3" style="margin-left:10px;" class="sended">{{ item.approval_status_text }}</p> <p v-else-if="item.approval_status == 2" style="margin-left:10px;" class="noSend">{{
<p v-else-if="item.approval_status==4" style="margin-left:10px;" class="sendFail">{{ item.approval_status_text }}</p> item.approval_status_text }}</p>
<p v-else-if="item.approval_status==5" style="margin-left:10px;" class="handled">{{ item.approval_status_text }}</p> <p v-else-if="item.approval_status == 3" style="margin-left:10px;" class="sended">{{
item.approval_status_text }}</p>
<p v-else-if="item.approval_status == 4" style="margin-left:10px;" class="sendFail">{{
item.approval_status_text }}
</p>
<p v-else-if="item.approval_status == 5" style="margin-left:10px;" class="handled">{{
item.approval_status_text }}</p>
</div> </div>
</div> </div>
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex"> <div class="rowFlex">
<span class="label">补发道具</span> <span class="label">补发道具</span>
<div v-if="item.reissue_prop.length" style="width:75%;"> <div v-if="item.reissue_prop.length" style="width:75%;">
<p v-for="(items,indexs) in item.reissue_prop" :key="indexs" class="text">{{ items.name }}{{ `(${items.num})` }}</p> <p v-for="(items, indexs) in item.reissue_prop" :key="indexs" class="text">{{ items.name }}{{
`(${items.num})` }}
</p>
</div> </div>
</div> </div>
</div> </div>
...@@ -80,7 +81,9 @@ ...@@ -80,7 +81,9 @@
<div class="rowFlex"> <div class="rowFlex">
<span class="label">返回道具</span> <span class="label">返回道具</span>
<div v-if="item.return_prop.length" style="width:75%;"> <div v-if="item.return_prop.length" style="width:75%;">
<p v-for="(items,indexs) in item.return_prop" :key="indexs" class="text">{{ items.name }}{{ `(${items.num})` }}</p> <p v-for="(items, indexs) in item.return_prop" :key="indexs" class="text">{{ items.name }}{{
`(${items.num})` }}
</p>
</div> </div>
</div> </div>
</div> </div>
...@@ -97,7 +100,8 @@ ...@@ -97,7 +100,8 @@
</div> </div>
<!-- 编辑误操作 --> <!-- 编辑误操作 -->
<addErrorHandle v-if="showAddErrorHandle" :show.sync="showAddErrorHandle" :info="info" title="玩家误操作" width="320px" @updateList="updateList" /> <addErrorHandle v-if="showAddErrorHandle" :show.sync="showAddErrorHandle" :info="info" title="玩家误操作" width="320px"
@updateList="updateList" />
</div> </div>
</template> </template>
...@@ -288,8 +292,8 @@ export default { ...@@ -288,8 +292,8 @@ export default {
this.orderList.map(item => { this.orderList.map(item => {
!item.remarks || item.remarks.length === 0 ? item.remarks = [{ remark: '' }] : '' !item.remarks || item.remarks.length === 0 ? item.remarks = [{ remark: '' }] : ''
}) })
if (res.status_code == 1 && msg) { if (res.status_code == 1 && !msg) {
this.$message.success(res.msg) // this.$message.success(res.msg)
} }
}) })
} }
...@@ -303,6 +307,7 @@ export default { ...@@ -303,6 +307,7 @@ export default {
background: #fff; background: #fff;
margin-left: 2px; margin-left: 2px;
position: relative; position: relative;
.detailsTitle { .detailsTitle {
width: 100%; width: 100%;
padding: 0 10px; padding: 0 10px;
...@@ -313,22 +318,26 @@ export default { ...@@ -313,22 +318,26 @@ export default {
color: #333333; color: #333333;
border-bottom: 1px solid #ebeef5; border-bottom: 1px solid #ebeef5;
border-left: 1px solid #ebeef5; border-left: 1px solid #ebeef5;
p { p {
color: #333333; color: #333333;
} }
} }
.detailsErrorHandleContent { .detailsErrorHandleContent {
width: 100%; width: 100%;
height:100%; height: 100%;
padding: 20px 10px; padding: 20px 10px;
overflow: auto; overflow: auto;
overflow-x: hidden; overflow-x: hidden;
.tabSelect{
.tabSelect {
width: 100%; width: 100%;
height: 60px; height: 60px;
border-bottom: 1px solid #EBEEF5; border-bottom: 1px solid #EBEEF5;
cursor: pointer; cursor: pointer;
.tabSelectItem{
.tabSelectItem {
font-size: 18px; font-size: 18px;
font-family: PingFangSC-Medium, PingFang SC; font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500; font-weight: 500;
...@@ -337,18 +346,22 @@ export default { ...@@ -337,18 +346,22 @@ export default {
line-height: 47px; line-height: 47px;
cursor: pointer; cursor: pointer;
} }
.tabSelectItemActive{
.tabSelectItemActive {
color: #409EFF; color: #409EFF;
border-bottom: 2px solid #409EFF; border-bottom: 2px solid #409EFF;
} }
} }
.list{
.list {
width: 100%; width: 100%;
height: auto; height: auto;
} }
.contentItem{
.contentItem {
position: relative; position: relative;
.title{
.title {
position: absolute; position: absolute;
left: 10px; left: 10px;
top: 14px; top: 14px;
...@@ -356,6 +369,7 @@ export default { ...@@ -356,6 +369,7 @@ export default {
color: #999999; color: #999999;
} }
} }
.item { .item {
width: 100%; width: 100%;
height: auto; height: auto;
...@@ -367,50 +381,59 @@ export default { ...@@ -367,50 +381,59 @@ export default {
position: relative; position: relative;
padding-left: 10px; padding-left: 10px;
cursor: pointer; cursor: pointer;
div{
div {
width: 100%; width: 100%;
} }
.remark{
::v-deep .el-textarea__inner{ .remark {
::v-deep .el-textarea__inner {
height: 80px; height: 80px;
} }
} }
.tableImage { .tableImage {
width: 40px; width: 40px;
height: 40px; height: 40px;
border-radius: 6px; border-radius: 6px;
margin-right: 10px; margin-right: 10px;
} }
.label { .label {
color: #999999; color: #999999;
} }
.text { .text {
color: #333333; color: #333333;
margin-left: 10px; margin-left: 10px;
word-break: break-all; word-break: break-all;
max-width: 80%; max-width: 80%;
} }
.icon { .icon {
display: none; display: none;
position: absolute; position: absolute;
right: 0; right: 0;
top: 12px; top: 12px;
} }
.dianFail{
.dianFail {
display: inline-block; display: inline-block;
width: 8px; width: 8px;
height: 8px; height: 8px;
background: #F45454; background: #F45454;
border-radius: 5px; border-radius: 5px;
} }
.dian{
.dian {
display: inline-block; display: inline-block;
width: 8px; width: 8px;
height: 8px; height: 8px;
background: #409EFF; background: #409EFF;
border-radius: 5px; border-radius: 5px;
} }
.dian2{
.dian2 {
display: inline-block; display: inline-block;
width: 8px; width: 8px;
height: 8px; height: 8px;
...@@ -419,60 +442,72 @@ export default { ...@@ -419,60 +442,72 @@ export default {
} }
} }
.orderMoney{ .orderMoney {
width: calc(100% + 40px); width: calc(100% + 40px);
height: 80px; height: 80px;
// margin-left: -20px; // margin-left: -20px;
padding: 10px 0; padding: 10px 0;
.orderMoneyItem{
.orderMoneyItem {
width: 50%; width: 50%;
text-align: center; text-align: center;
margin-top:5px; margin-top: 5px;
span{
span {
font-size: 14px; font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC; font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500; font-weight: 500;
color: #333333; color: #333333;
} }
p{
p {
font-size: 22px; font-size: 22px;
color: #409EFF; color: #409EFF;
} }
} }
} }
.filterList{
.filterList {
margin-bottom: 10px; margin-bottom: 10px;
.filterListInput{
.filterListInput {
width: 60%; width: 60%;
margin-left: 15px; margin-left: 15px;
margin-bottom:10px; margin-bottom: 10px;
} }
.filterListDate{
width:150px; .filterListDate {
margin-bottom:10px; width: 150px;
margin-bottom: 10px;
} }
::v-deep .search-item .item-label{
::v-deep .search-item .item-label {
margin-right: 20px; margin-right: 20px;
} }
} }
.orderDetailsScroll{
.orderDetailsScroll {
width: 100%; width: 100%;
.orderDetailsScrollContent{
.orderDetailsScrollContent {
margin-bottom: 50px; margin-bottom: 50px;
} }
} }
.orderDetails{
.orderDetails {
width: 100%; width: 100%;
height: auto; height: auto;
margin-bottom: 10px; margin-bottom: 10px;
position: relative; position: relative;
.bridgeMain{
.bridgeMain {
position: absolute; position: absolute;
top: 0px; top: 0px;
right:0px; right: 0px;
width:50px; width: 50px;
height:50px; height: 50px;
.text{
.text {
font-size: 8px; font-size: 8px;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
...@@ -480,12 +515,13 @@ export default { ...@@ -480,12 +515,13 @@ export default {
transform: rotate(48deg); transform: rotate(48deg);
z-index: 100; z-index: 100;
position: absolute; position: absolute;
right:-6px; right: -6px;
top: 10px; top: 10px;
width: 50px; width: 50px;
text-align: center; text-align: center;
} }
.bridge{
.bridge {
font-size: 50px; font-size: 50px;
position: absolute; position: absolute;
top: 0; top: 0;
...@@ -493,17 +529,20 @@ export default { ...@@ -493,17 +529,20 @@ export default {
} }
} }
.orderDetailsTitle{ .orderDetailsTitle {
width: 100%; width: 100%;
background: #F9FAFF; background: #F9FAFF;
.money{
.money {
width: 100%; width: 100%;
height: auto; height: auto;
padding-left: 10px; padding-left: 10px;
.btns{
.btns {
padding-right: 40px; padding-right: 40px;
} }
.btn{
.btn {
background: #fff; background: #fff;
border-radius: 4px; border-radius: 4px;
padding: 2px 5px; padding: 2px 5px;
...@@ -513,21 +552,24 @@ export default { ...@@ -513,21 +552,24 @@ export default {
color: #333333; color: #333333;
cursor: pointer; cursor: pointer;
} }
.btnnot{
.btnnot {
background: #FFDDDD; background: #FFDDDD;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
color: #F56C6C; color: #F56C6C;
border: none; border: none;
} }
.btnsuccess{
.btnsuccess {
background: #E1FFF0; background: #E1FFF0;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
color: #409EFF; color: #409EFF;
border: none; border: none;
} }
.sended{
.sended {
padding: 0 8px; padding: 0 8px;
height: 20px; height: 20px;
line-height: 20px; line-height: 20px;
...@@ -538,7 +580,8 @@ export default { ...@@ -538,7 +580,8 @@ export default {
font-weight: 400; font-weight: 400;
color: #409EFF; color: #409EFF;
} }
.noSend{
.noSend {
padding: 0 8px; padding: 0 8px;
height: 20px; height: 20px;
line-height: 20px; line-height: 20px;
...@@ -550,26 +593,31 @@ export default { ...@@ -550,26 +593,31 @@ export default {
color: #FFA81D; color: #FFA81D;
} }
} }
.text{
.text {
font-size: 14px; font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
color: #333333; color: #333333;
max-width: 200px; max-width: 200px;
overflow: hidden; overflow: hidden;
white-space: nowrap; /* 防止文字换行 */ white-space: nowrap;
text-overflow: ellipsis; /* 超出部分显示省略号 */ /* 防止文字换行 */
text-overflow: ellipsis;
/* 超出部分显示省略号 */
} }
} }
.orderDetailsList{
.orderDetailsList {
width: 100%; width: 100%;
height: auto; height: auto;
background: #FFFFFF; background: #FFFFFF;
border: 1px solid #EBEEF5; border: 1px solid #EBEEF5;
position: relative; position: relative;
.titleFix{
.titleFix {
position: absolute; position: absolute;
left:10px; left: 10px;
top: 20px; top: 20px;
color: #999999; color: #999999;
} }
...@@ -577,7 +625,8 @@ export default { ...@@ -577,7 +625,8 @@ export default {
} }
} }
::v-deep .el-tabs__item{
::v-deep .el-tabs__item {
line-height: 26px; line-height: 26px;
font-size: 16px; font-size: 16px;
font-weight: 500; font-weight: 500;
...@@ -585,11 +634,11 @@ export default { ...@@ -585,11 +634,11 @@ export default {
/* 已移除局部 el-collapse 样式,使用全局样式 */ /* 已移除局部 el-collapse 样式,使用全局样式 */
.noContent{ .noContent {
width: 100%; width: 100%;
height: 100%; height: 100%;
font-size: 300px; font-size: 300px;
} }
} }
</style> </style>
\ No newline at end of file
<template>
<div class="AiLibrary">
<div class="aiLibraryContent" v-if="knowledge_search_list.length > 0">
<div class="aiLibraryHeader">
<div class="aiLibraryHeader_content columnFlex">
<div class="rowFlex rowCenter spaceBetween">
<p class="aiLibraryHeader_content_tag_title">当前知识库:
<el-popover placement="top" style="width: auto;" title="当前知识库:" trigger="click"
content="这是一段内容">
<div class="aiLibraryHeader_content_tag columnFlex">
<p v-for="(name, index) in knowledge_search_list" style="margin-bottom:10px;"
:key="index">
<el-tag size="mini">{{ name
}}</el-tag>
</p>
</div>
<el-button type="text" size="medium" slot="reference">{{ knowledge_search_list.length
}}</el-button>
</el-popover>
</p>
<el-button type="text" @click="clearContextComfion" class="clearContext">清除上下文</el-button>
</div>
</div>
</div>
<div class="AiChatList">
<!-- v-loadingChat="loading" -->
<div ref="ai-box" v-debounce="paperScroll" class="msg-box columnFlex flex1">
<div>
<div class="rowFlex rowCenter linkStyle">
<div class="rowFlex columnCenter">
<div class="line"></div>
<svg-icon icon-class="start" style="margin-left:5px;" />
</div>
<el-link type="primary" class="moreLink" @click="Aihistory">加载更多问答记录</el-link>
<div class="rowFlex columnCenter">
<svg-icon icon-class="start" />
<div class="line"></div>
</div>
</div>
<div v-for="(i, index) in recordMessage" :key="i._id" class="item">
<div class="msgBoxItem">
<div v-if="i._id && i.message" class="msg rowFlex columnCenter"
:style="i.send_type == 1 ? 'flex-direction:row-reverse' : ''">
<div class="columnFlex userHead">
<div class="user-head columnFlex">
<el-image class="image" fit="fill"
:src="i.send_type == 2 ? i.from.robot.avatar : i.from.cser.avatar"></el-image>
</div>
</div>
<div class="user-msg columnFlex"
:style="i.send_type == 1 ? 'margin-right:10px;' : 'margin-left:10px;'">
<p class="time" :style="i.send_type == 1 ? 'text-align: right;' : ' '">
{{ i.create_time }}
<el-popover v-if="i._id && i.quote_list.length > 0" placement="top"
width="300" trigger="click">
<div class="comeIngText" style="max-height:500px;overflow:auto">
<div v-for="(item, index) in i.quote_list" :key="index"
style="margin-bottom:15px;">
<span style="color:#000;font-weight:bold">来源{{ index + 1
}}:</span>
<p>问题:{{ item.question }}</p>
<p>答案:{{ item.answer }}</p>
</div>
</div>
<el-button style="margin-bottom: -10px;" slot="reference"
type="text">回答来源</el-button>
</el-popover>
</p>
<!-- 文字 -->
<div class="rowFlex resizeBtn chatItemBox"
:class="i.send_type == 1 ? 'rowEnd' : 'rowStart'">
<!-- 客服发的消息 -->
<div v-if="i.message.msgtype == 'text' && i.message.text && i.message.text.content && !i.loading"
class="chatItem" :style="i.send_type == 1 ? 'float: right;' : ''"
:class="[i.send_type == 1 ? 'right' : 'left chatItemleft chatItemWidth']"
v-html="i.message.text && i.message.text.content ? i.message.text.content.trim() : '不识别的消息类型'">
</div>
<!-- 图片 -->
<div v-else-if="i.message.msgtype == 'image' && i.message.image && i.message.image.picurl && !i.loading"
class="chatItem" :style="i.send_type == 1 ? 'float: right;' : ''"
:class="[i.send_type == 1 ? 'right' : 'left chatItemleft chatItemWidth']">
<el-image class="aiImage" fit="contain" :src="i.message.image.picurl"
@click="watchImage(i)"></el-image>
</div>
<!-- 加在 loading -->
<div v-else-if="i.loading" class="chatItem"
:style="i.send_type == 1 ? 'float: right;' : ''"
:class="[i.send_type == 1 ? 'right' : 'left chatItemWidth']">
<div class="rowFlex columnCenter chatItemLoading">
<svg-icon icon-class="answer" class="loadingRotage" />
<i class="loadingRotage"></i>
<p style="margin-left:5px;">答案整理中....</p>
</div>
</div>
<!-- 复制客户的消息 -->
<div class=" rowFlex likeBtn spanceBetween" v-if="i.send_type == 2">
<span v-if="!i.loading && i.response_time"
style="color:#87909c;font-size:12px;margin-right:5px;">{{
i.response_time }} ms</span>
<span>
<svg-icon v-if="i.like_status == 0" class="copy likeIcon"
icon-class="like" @click.stop="likeAnswer(i, 1, index)" />
<svg-icon v-else-if="i.like_status == 1" class="copy likeIcon"
icon-class="likeActive" />
<svg-icon v-if="i.like_status == 0" class="copy likeIcon"
icon-class="hate" @click.stop="likeAnswer(i, 2, index)" />
<svg-icon v-else-if="i.like_status == 2" class="copy likeIcon"
icon-class="hateActive" />
<i class="el-icon-refresh-right copy likeIcon"
v-if="i._id && !i.is_msg && !i.loading"
:class="i.is_retry ? 'loadingRotageReply' : ''"
@click.stop="retryAnswer(i, index)"></i>
<svg-icon
v-if="i.message.msgtype == 'text' && !i.loading && !i.is_msg"
class="copy copyIcon"
:data-clipboard-text="i.message.text.content" icon-class="fuzhi"
@click="copyText(i, index)" />
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<el-input v-model="aiText" class="aiText" placeholder="请输入你的问题" @keydown.enter.native="submitEntry">
<svg-icon slot="suffix" icon-class="fasong" class="addIcon"
:class="aiText.length == 0 ? 'addIconOpcity' : ''" @click="submitEntry" />
</el-input>
<el-dialog :visible.sync="dialogRemarkVisible" append-to-body title="查看大图" custom-class="remake-dialog">
<div class="remake-box">
<el-image :src="watchImageUrl" style="max-width:600px;" fit="contain">
</el-image>
</div>
</el-dialog>
</div>
<NoSummaryContent v-else />
</div>
</template>
<script>
import { mapState } from 'vuex'
import Clipboard from 'clipboard'
import debounce from '@/directive/debounce/index'
import NoSummaryContent from './noSummary.vue'
import { corp_beta_question_config, corp_beta_question_session_clearTag, corp_beta_question_log_chat, corp_beta_question_log_index, answerComment, welcomemsg, retry } from '@/api/aiChat'
export default {
name: 'AiLibrary',
components: {
NoSummaryContent
},
directives: {
debounce,
},
props: {
messageSource: {
type: String,
default: ''
},
},
computed: {
...mapState('game', ['chatUserInfo']),
...mapState('user', ['userInfo', 'userid'])
},
data() {
return {
loading: false,
answerLoading: false,
dialogRemarkVisible: false,
watchImageUrl: '',
session_id: '',
recordMessage: [],
aiText: '',
aiAnswer: {},
knowledge_search_list: [],
page_info: {
page: 1,
page_size: 20
},
answerItem: {
session_id: '',
create_time: '',
quote_list: [],
fail_msg: '',
from: {
robot: {
avatar: 'https://companywx-1300623068.cos.ap-nanjing.myqcloud.com/zhangsheng/service/avatars/20240530/YMYZyis7hKP7tDEznsk5dhKzjkDctMa81717052051104.png',
name: '机器人',
robot_id: ''
},
cser: {
avatar: '',
name: '',
zq_user_id: ''
}
},
to: {
robot: {
avatar: 'https://companywx-1300623068.cos.ap-nanjing.myqcloud.com/zhangsheng/service/avatars/20240530/YMYZyis7hKP7tDEznsk5dhKzjkDctMa81717052051104.png',
name: '机器人',
robot_id: ''
},
cser: {
avatar: '',
name: '',
zq_user_id: ''
}
},
message: {
msgtype: 'text',
text: {
content: ''
}
},
send_type: '',
_id: ''
}
}
},
mounted() {
this.getAiArgenInfo()
this.getWelcomeMsg()
console.log(this.chatUserInfo, 'this.chatUserInfo')
this.initanswerItem()
this.clearContext(false)
},
methods: {
async getWelcomeMsg() {
const user = {
userid: this.chatUserInfo.userid,
session_type: 3
}
const res = await welcomemsg({ user: user, noMessage: true })
if (res.status_code === 1) {
this.welcomeMsg = res.data.msg
const welcomeItem = JSON.parse(JSON.stringify(this.answerItem))
welcomeItem.send_type = 2
welcomeItem.message.text.content = res.data
welcomeItem.loading = false
welcomeItem.create_time = this.$moment().format('YYYY-MM-DD HH:mm:ss')
welcomeItem._id = this.$moment() + ''
welcomeItem.is_msg = true
welcomeItem.quote_list = []
welcomeItem.is_retry = false
this.recordMessage.unshift(welcomeItem)
}
},
async clearContextComfion() {
this.$confirm('确定清除上下文吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.clearContext(true)
}).catch(() => {
this.$message.info('取消清除上下文')
})
},
async clearContext(showMsg) {
try {
const res = await corp_beta_question_session_clearTag()
if (res.status_code === 1) {
showMsg ? this.$message.success('清除上下文成功') : ''
}
} catch (error) {
showMsg ? this.$message.error('清除上下文失败') : ''
}
},
async getAiArgenInfo() {
const res = await corp_beta_question_config({
user: {
userid: this.chatUserInfo.userid,
session_type: 3
}, page: 1, page_size: 10
})
console.log(res, '123')
if (res.status_code === 1 && res?.data?.data?.length > 0) {
this.knowledge_search_list = res?.data?.data[0]?.knowledge_search?.doc_name || []
}
},
initanswerItem() {
this.answerItem.to.cser.avatar = this.chatUserInfo.user.avatar
this.answerItem.to.cser.name = this.userInfo.cser_name
this.answerItem.to.cser.zq_user_id = this.userInfo.cser_id
this.answerItem.zq_user_id = this.userInfo.cser_id
this.answerItem.from.cser = this.answerItem.to.cser
},
watchImage(i) {
this.watchImageUrl = i.message.image.picurl
this.dialogRemarkVisible = true
},
async retryAnswer(i, index) {
if (i.is_retry) {
return false
}
const data = {
_id: i._id,
user: {
userid: this.chatUserInfo.userid,
session_type: 3
},
question: i.message.question
}
try {
this.$set(this.recordMessage[index], 'is_retry', true)
const res = await retry(data)
if (res.status_code === 1) {
this.$message.success(res.msg)
this.$set(this.recordMessage[index], 'message', res.data.message)
this.$set(this.recordMessage[index], 'is_retry', false)
this.$set(this.recordMessage[index], 'quote_list', res.data.quote_list || [])
this.$set(this.recordMessage[index], 'request_id', res.data.request_id)
this.$set(this.recordMessage[index], 'session_id', this.aiAnswer.session_id)
this.$set(this.recordMessage[index], 'create_time', this.aiAnswer.create_time)
}
} catch (error) {
this.$set(this.recordMessage[index], 'is_retry', false)
}
},
async Aihistory() {
const data = {
cser_id: this.userInfo.cser_id,
...this.page_info
}
const res = await corp_beta_question_log_index(data)
if (res.status_code === 1 && res?.data?.data?.length > 0) {
this.page_info.page++
res.data.data.forEach(item => {
item.to = {
cser: {
avatar: this.chatUserInfo.avatar,
name: this.userInfo.cser_name,
zq_user_id: this.userInfo.cser_id
},
robot: {
avatar: 'https://companywx-1300623068.cos.ap-nanjing.myqcloud.com/zhangsheng/service/avatars/20240530/YMYZyis7hKP7tDEznsk5dhKzjkDctMa81717052051104.png',
name: '机器人',
robot_id: ''
},
}
item.from = item.to
item.loading = false
item.is_retry = false
})
this.recordMessage = res.data.data.reverse().concat(this.recordMessage)
if (this.page_info.page == 1) {
this.scrollBottm()
}
} else {
this.$message.warning('没有更多数据了')
}
},
// 复制消息
copyText(i, index) {
const clipboard = new Clipboard('.copy')
clipboard.on('success', e => {
this.$message.success('复制成功')
// 释放内存
clipboard.destroy()
})
},
async rqeustSource(i, index) {
},
// 赞
async likeAnswer(i, type, index) {
const data = {
_id: i._id,
like_status: type
}
const res = await answerComment(data)
if (res.status_code === 1) {
this.$message.success(res.msg)
this.$set(this.recordMessage[index], 'like_status', type)
}
},
submitEntry() {
if (this.answerLoading) {
this.$message({
type: 'warning',
message: '请等待AI回复'
})
return
}
if (this.aiText.trim() === '') {
this.$message({
type: 'warning',
message: '请输入问题'
})
return
}
this.requestAiAnswer()
},
async requestAiAnswer() {
this.answerLoading = true
const question = this.aiText
this.addMessageList()
try {
const res = await corp_beta_question_log_chat({
question: question,
user: {
userid: this.chatUserInfo.userid,
session_type: 3
}
})
if (res.status_code === 1) {
this.answerLoading = false
this.aiAnswer = res.data
this.session_id = res.data.session_id
this.$set(this.recordMessage[this.recordMessage.length - 1], 'loading', false)
this.$set(this.recordMessage[this.recordMessage.length - 1], 'quote_list', res.data.quote_list || [])
this.$set(this.recordMessage[this.recordMessage.length - 1], '_id', res.data._id)
this.$set(this.recordMessage[this.recordMessage.length - 1], 'like_status', 0)
this.$set(this.recordMessage[this.recordMessage.length - 1], 'is_used_knowledge', res.data.is_used_knowledge)
this.$set(this.recordMessage[this.recordMessage.length - 1], 'message', res.data.message)
this.$set(this.recordMessage[this.recordMessage.length - 1], 'request_id', res.data.request_id)
this.$set(this.recordMessage[this.recordMessage.length - 1], 'session_id', this.aiAnswer.session_id)
this.$set(this.recordMessage[this.recordMessage.length - 1], 'create_time', this.aiAnswer.create_time)
this.$set(this.recordMessage[this.recordMessage.length - 1], 'response_time', this.aiAnswer.response_time)
}
} catch (error) {
this.answerLoading = false
}
},
addMessageList() {
this.answerItem.session_id = this.session_id
this.answerItem.message.text.content = this.aiText
this.answerItem.create_time = this.$moment().format('YYYY-MM-DD HH:mm:ss')
this.answerItem._id = this.$moment() + ''
const questionItem = JSON.parse(JSON.stringify(this.answerItem))
const answerItem = JSON.parse(JSON.stringify(this.answerItem))
questionItem.send_type = 1
answerItem.send_type = 2
answerItem._id = answerItem._id + '123'
answerItem.loading = true
this.recordMessage.push(questionItem)
this.recordMessage.push(answerItem)
this.scrollBottm()
this.aiText = ''
},
scrollBottm() {
this.$nextTick(() => {
const el = this.$refs['ai-box']
if (el) {
el.scrollTo({
top: el.scrollHeight,
behavior: 'smooth'
})
}
})
},
paperScroll() {
if (this.userInfo.userid) {
// 监听滚动事件
const el = this.$refs['ai-box']
if (el.scrollTop <= 5 && this.isMoreRecord) {
this.messageList()
} else if (!this.isMoreRecord) {
// this.$message({
// type: 'error',
// message: '没有更多数据了'
// })
}
}
}
}
}
</script>
<style lang="scss" scoped>
.AiLibrary {
width: 100%;
height: 100%;
padding: 10px;
margin-top: -20px;
.aiLibraryContent {
width: 100%;
height: 100%;
}
.AiChatList {
width: 100%;
height: calc(100% - 80px);
overflow: auto;
}
.aiLibraryHeader {
width: 100%;
position: relative;
margin-bottom: 10px;
.aiLibraryHeader_content {
&_tag {
display: flex;
flex-wrap: wrap;
gap: 5px;
}
&_tag_title {
font-size: 16px;
font-weight: 500;
color: #333333;
}
}
}
.msg-box {
height: calc(100% - 10px);
width: 100%;
overflow-y: auto;
overflow-x: hidden;
padding: 10px 0;
.linkStyle {
.line {
width: 70px;
height: 1px;
border: 1px solid #f2f3f5;
}
}
.moreLink {
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 12px;
color: #3a88f6;
line-height: 18px;
text-align: left;
font-style: normal;
text-decoration-line: underline;
margin: 0 5px;
}
.msg {
width: 100%;
min-height: 2.5rem;
display: flex;
margin-top: 40px;
justify-content: flex-start !important;
.user-head {
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
.image {
width: 40px;
height: 40px;
border-radius: 40px;
}
}
.chatItemBox {
border-radius: 10px;
position: relative;
}
.user-msg {
word-break: break-all;
font-size: 14px;
line-height: 20px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: rgba(0, 0, 0, 0.85);
position: relative;
top: -15px;
.time {
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #999999;
line-height: 20px;
}
.chatItem {
display: inline-block;
padding: 5px 10px;
border-radius: 5px;
margin-top: 5px;
font-size: 14px;
}
.chatItemLoading {
width: 100%;
font-size: 14px;
}
.chatItemleft {
padding-bottom: 35px;
}
.left {
background: #ffffff;
border: 1px solid transparent;
border-radius: 6px;
border: 1px solid #00bf8a;
background-origin: border-box;
background-clip: content-box, border-box;
float: left;
}
.right {
background: linear-gradient(135deg,
#6ee7e9 0%,
#9ff2cd 48%,
#e3fdb2 100%,
#e3fdb2 100%);
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: rgba(0, 0, 0, 0.85);
animation: toright 0.5s ease both 1;
min-width: 50px;
display: inline-block;
}
@keyframes toLeft {
0% {
opacity: 0;
transform: translateX(-10px);
}
100% {
opacity: 1;
transform: translateX(0px);
}
}
@keyframes toright {
0% {
opacity: 0;
transform: translateX(10px);
}
100% {
opacity: 1;
transform: translateX(0px);
}
}
}
}
}
.aiImage {
max-width: 200px;
border-radius: 5px;
cursor: pointer;
}
.aiText {
::v-deep .el-input__inner {
width: 100%;
height: 46px !important;
background: #ffffff;
box-shadow: 0px 3px 9px 0px rgba(0, 0, 0, 0.12);
border-radius: 46px;
}
.addIcon {
font-size: 18px;
margin-top: 15px;
margin-right: 10px;
cursor: pointer;
}
.addIconOpcity {
opacity: 0.3;
}
}
.loadingRotage {
cursor: pointer;
font-size: 20px;
animation: rotage linear 1s infinite;
}
.loadingRotageReply {
height: 20px;
animation: rotage linear 0.5s infinite;
}
.copyIcon {
cursor: pointer;
font-size: 18px;
z-index: 10;
margin-right: 5px;
}
.likeIcon {
cursor: pointer;
font-size: 18px;
z-index: 10;
margin-right: 5px;
color: #8CA4BA;
}
.likeBtn {
position: absolute;
bottom: 5px;
left: 10px;
}
}
@keyframes rotage {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style>
\ No newline at end of file
<template>
<div class="quickSendGame columnFlex">
<div class="content search-form">
<el-tabs v-model="activeName">
<el-tab-pane label="AI微言" name="aiChat">
<aiArgenChat v-if="activeName === 'aiChat'" />
</el-tab-pane>
<el-tab-pane label="AI 跟进记录" name="aiFollow">
<summaryList v-if="activeName === 'aiFollow'" />
</el-tab-pane>
</el-tabs>
</div>
</div>
</template>
<script>
import aiArgenChat from './aiArgenChat.vue'
import summaryList from './summaryList.vue'
import { mapActions } from 'vuex'
export default {
name: 'quickSendGame',
components: {
aiArgenChat,
summaryList,
},
data() {
return {
activeName: 'aiChat'
}
},
created() {
},
mounted() {
// this.initializeWecom()
},
methods: {
...mapActions('user', ['initWecom']),
async initializeWecom() {
try {
console.log('🚀 开始初始化企业微信 SDK')
const result = await this.initWecom()
console.log('✅ 企业微信 SDK 初始化成功', result)
} catch (error) {
console.error('❌ 企业微信 SDK 初始化失败:', error)
}
},
}
}
</script>
<style lang="scss" scoped>
.quickSendGame {
::v-deep .el-tabs__nav-next,
::v-deep .el-tabs__nav-prev {
line-height: 50px;
}
width: 100%;
height: 100%;
background: #fff;
::v-deep .el-tabs__item {
padding: 0 15px;
}
.detailsTitle {
width: 100%;
padding: 0 10px;
height: 60px;
font-size: 18px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333333;
border-bottom: 1px solid #ebeef5;
border-left: 1px solid #ebeef5;
p {
color: #333333;
}
}
.content {
width: 100%;
height: calc(100% - 10px);
::v-deep .el-tabs__header {
margin: 0 0 20px;
}
}
::v-deep .el-tabs--border-card .is-active {
border: none !important;
}
::v-deep .is-active {
border: none;
}
.inputContent {
width: 100%;
::v-deep .el-input {
width: 80%;
}
}
::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;
top: 15px;
z-index: 10;
}
}
::v-deep .el-icon-circle-close {
color: #fff;
}
.bate {
width: 42px;
height: 20px;
background: linear-gradient(135deg, #6ee7e9 0%, #9ff2cd 47%, #e3fdb2 100%);
border-radius: 10px;
padding: 0px 10px 3px 10px;
}
}
</style>
\ No newline at end of file
<template>
<div class="noSummaryContent">
<div class="noContent">
<div class="noContent-icon">
<svg-icon icon-class="warning" />
</div>
<div class="noContent-text">
<span>当前客服号知识库配置异常 请联系管理员处理</span>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'NoSummaryContent'
}
</script>
<style lang="scss" scoped>
.noSummaryContent {
width: 100%;
height: 100%;
.noContent {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
.noContent-icon {
color: #FF7D00;
font-size: 40px;
}
.noContent-text {
font-family: PingFang SC, PingFang SC;
font-weight: 400;
font-size: 14px;
color: #4E5969;
text-align: center;
font-style: normal;
text-transform: none;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="summaryListContainer ">
<div v-scroll:50="requestDataList" v-loading="loading" class="messageDetailsScroll">
<div v-if="messageList.length > 0">
<div v-for="(item, index) in messageList" :key="index" class="messageListItem">
<div class="itemTop">
{{ item.date }}
</div>
<div class="itemCenter">
{{ item.summary }}
</div>
</div>
</div>
<div class="no-content-main" v-if="!loading && messageList.length == 0">
<noContent />
</div>
</div>
</div>
</template>
<script>
import { mapMutations, mapState } from 'vuex'
import { corp_follow_up_summary_index } from '@/api/works'
import { throttle } from '@/utils'
import noContent from '@/components/noContent.vue'
export default {
components: {
noContent
},
props: {
chatUserDetails: {
typeof: Object,
default: () => { }
}
},
data() {
return {
loading: false,
isloadMore: true,
messageList: [],
pageInfo: {
page: 0,
page_size: 20,
total: 0
}
}
},
computed: {
...mapState('game', ['accountSelect']),
...mapState('user', ['external_userid']),
},
mounted() {
this.pageInfo = {
page: 0,
page_size: 20,
total: 0
}
this.isloadMore = true
this.messageList = []
this.loading = true
this.requestDataList()
},
methods: {
requestDataList: throttle(function () {
if (this.accountSelect) {
if (!this.isloadMore) {
console.log('没有更多数据了')
return false
}
this.loading = true
this.pageInfo.page += 1
const data = {
external_userid: this.external_userid,
...this.pageInfo
}
corp_follow_up_summary_index(data).then(
(res) => {
this.loading = false
if (res.data.data && res.data.data.length < 20) {
this.isloadMore = false
}
this.messageList = this.messageList.concat(res.data.data)
if (res.data.page_info) {
this.pageInfo = res.data.page_info
}
},
(err) => {
this.loading = false
}
)
} else {
this.isloadMore = false
this.loading = false
}
}, 500)
}
}
</script>
<style lang="scss" scoped>
.summaryListContainer {
width: 100%;
height: 100%;
background: #fff;
position: relative;
overflow: hidden;
.messageDetailsScroll {
width: 100%;
height: 100%;
overflow: auto;
overflow-x: hidden;
padding-bottom: 50px;
}
.messageListItem {
width: 100%;
height: auto;
margin-bottom: 10px;
.itemTop {
font-family: PingFang SC, PingFang SC;
font-weight: 400;
font-size: 14px;
color: #86909C;
line-height: 20px;
text-align: left;
font-style: normal;
text-transform: none;
margin-bottom: 5px;
}
.itemCenter {
width: 100%;
background: #F9FAFF;
border-radius: 4px 4px 4px 4px;
padding: 10px;
font-family: PingFang SC, PingFang SC;
font-weight: 400;
font-size: 16px;
color: #4E5969;
text-align: left;
font-style: normal;
text-transform: none;
// 换行
white-space: pre-wrap;
word-break: break-all
}
}
.no-content-main {
width: 320px;
margin: 0 auto;
}
}
</style>
\ No newline at end of file
...@@ -3,10 +3,14 @@ ...@@ -3,10 +3,14 @@
<div ref="giftList" class="gift-list" @scroll="handleScroll"> <div ref="giftList" class="gift-list" @scroll="handleScroll">
<div v-for="item in giftList" :key="item._id" class="gift-item"> <div v-for="item in giftList" :key="item._id" class="gift-item">
<div class="gift-info"> <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.gift_package_name }}</div>
<div>发送时间: {{ item.send_time }}</div> <div>发送时间: {{ item.send_time }}</div>
<div>礼包码: {{ item.code }}</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 class="rowFlex spaceBetween columnCenter gift-sender">
<div>发送客服: {{ item.cser_name }}</div> <div>发送客服: {{ item.cser_name }}</div>
<i class="el-icon-document-copy" style="cursor: pointer;" @click="handleCopy(item.code)"></i> <i class="el-icon-document-copy" style="cursor: pointer;" @click="handleCopy(item.code)"></i>
...@@ -16,18 +20,17 @@ ...@@ -16,18 +20,17 @@
<div v-if="loading" class="loading-more">加载中...</div> <div v-if="loading" class="loading-more">加载中...</div>
<div v-if="!hasMore && giftList.length > 0" class="no-more">没有更多数据了</div> <div v-if="!hasMore && giftList.length > 0" class="no-more">没有更多数据了</div>
<div v-if="giftList.length == 0" class="noContent rowFlex allCenter"> <div v-if="giftList.length == 0" class="noContent rowFlex allCenter">
<noContent/> <noContent />
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script>
<script>
import Clipboard from 'clipboard' import Clipboard from 'clipboard'
import { getSendingCodeList } from '@/api/works' import { getSendingCodeList } from '@/api/works'
import { debounce,copyText,sendChatMessage } from '@/utils/index' import { debounce, copyText, sendChatMessage } from '@/utils/index'
import { mapState } from 'vuex' import { mapState } from 'vuex'
export default { export default {
name: 'wxGift', name: 'wxGift',
data() { data() {
return { return {
...@@ -69,7 +72,7 @@ import Clipboard from 'clipboard' ...@@ -69,7 +72,7 @@ import Clipboard from 'clipboard'
this.loading = false this.loading = false
} }
}, },
handleScroll: debounce(function(e) { handleScroll: debounce(function (e) {
const { scrollHeight, scrollTop, clientHeight } = e.target const { scrollHeight, scrollTop, clientHeight } = e.target
if (scrollHeight - scrollTop - clientHeight < 50) { if (scrollHeight - scrollTop - clientHeight < 50) {
this.fetchGiftList() this.fetchGiftList()
...@@ -87,11 +90,11 @@ import Clipboard from 'clipboard' ...@@ -87,11 +90,11 @@ import Clipboard from 'clipboard'
// }) // })
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.wx-gift-container { .wx-gift-container {
height: 100%; height: 100%;
width: 100%; width: 100%;
background-color: #fff; background-color: #fff;
...@@ -106,11 +109,13 @@ import Clipboard from 'clipboard' ...@@ -106,11 +109,13 @@ import Clipboard from 'clipboard'
background: #F7F8FA; background: #F7F8FA;
border-radius: 12px; border-radius: 12px;
border: 1px solid #E5E6EB; border: 1px solid #E5E6EB;
margin-bottom:12px; margin-bottom: 12px;
.gift-info { .gift-info {
div{ div {
line-height: 26px; line-height: 26px;
} }
.gift-name { .gift-name {
font-weight: 400; font-weight: 400;
font-size: 14px; font-size: 14px;
...@@ -118,6 +123,7 @@ import Clipboard from 'clipboard' ...@@ -118,6 +123,7 @@ import Clipboard from 'clipboard'
text-align: left; text-align: left;
font-style: normal; font-style: normal;
} }
.gift-code { .gift-code {
display: flex; display: flex;
align-items: center; align-items: center;
...@@ -129,6 +135,7 @@ import Clipboard from 'clipboard' ...@@ -129,6 +135,7 @@ import Clipboard from 'clipboard'
color: #323335; color: #323335;
text-align: justify; text-align: justify;
font-style: normal; font-style: normal;
span { span {
color: #323335; color: #323335;
font-size: 14px; font-size: 14px;
...@@ -158,7 +165,8 @@ import Clipboard from 'clipboard' ...@@ -158,7 +165,8 @@ import Clipboard from 'clipboard'
line-height: 18px; line-height: 18px;
text-align: justify; text-align: justify;
font-style: normal; font-style: normal;
i{
i {
color: #00BF8A; color: #00BF8A;
font-size: 14px; font-size: 14px;
} }
...@@ -175,5 +183,5 @@ import Clipboard from 'clipboard' ...@@ -175,5 +183,5 @@ import Clipboard from 'clipboard'
font-size: 13px; font-size: 13px;
} }
} }
} }
</style> </style>
\ No newline at end of file \ 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 @@ ...@@ -12,14 +12,15 @@
<!-- 转端 --> <!-- 转端 -->
<el-collapse v-if="activeName == '1' && conversionGameList.length > 0" :disabled="disabled" <el-collapse v-if="activeName == '1' && conversionGameList.length > 0" :disabled="disabled"
@change="conversionChangeOld"> @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"> <template slot="title">
<div class="title-with-icon"> <div class="title-with-icon">
<img v-if="item.game_type == 1" src="@/assets/icon/wxgame.svg" class="game-icon" alt="微信小游戏"> <svg-icon v-if="item.game_type == 1" icon-class="wxgame" class="game-icon" />
<img v-else-if="item.game_type == 5" src="@/assets/icon/douyin.svg" class="game-icon" alt="抖音小游戏"> <svg-icon v-else-if="item.game_type == 5" icon-class="douyin" class="game-icon" />
<img v-else-if="item.game_type == 3" src="@/assets/icon/Android.svg" class="game-icon" alt="安卓游戏"> <svg-icon v-else-if="item.game_type == 3" icon-class="Android" class="game-icon" />
<img v-else-if="item.game_type == 4" src="@/assets/icon/IOS.svg" class="game-icon" alt="IOS游戏"> <svg-icon v-else-if="item.game_type == 4" icon-class="IOS" class="game-icon" />
<img v-else-if="item.game_type == 2" src="@/assets/icon/H5.svg" class="game-icon" alt="H5游戏"> <svg-icon v-else-if="item.game_type == 2" icon-class="H5" class="game-icon" />
{{ item.game_text }} {{ item.game_text }}
</div> </div>
</template> </template>
...@@ -62,11 +63,11 @@ ...@@ -62,11 +63,11 @@
<el-collapse-item v-for="(item, index) in recallGameList" :key="index" :name="item.game_type"> <el-collapse-item v-for="(item, index) in recallGameList" :key="index" :name="item.game_type">
<template slot="title"> <template slot="title">
<div class="title-with-icon"> <div class="title-with-icon">
<img v-if="item.game_type == 1" src="@/assets/icon/wxgame.svg" class="game-icon" alt="微信小游戏"> <svg-icon v-if="item.game_type == 1" icon-class="wxgame" class="game-icon" />
<img v-else-if="item.game_type == 5" src="@/assets/icon/douyin.svg" class="game-icon" alt="抖音小游戏"> <svg-icon v-else-if="item.game_type == 5" icon-class="douyin" class="game-icon" />
<img v-else-if="item.game_type == 3" src="@/assets/icon/Android.svg" class="game-icon" alt="安卓游戏"> <svg-icon v-else-if="item.game_type == 3" icon-class="Android" class="game-icon" />
<img v-else-if="item.game_type == 4" src="@/assets/icon/IOS.svg" class="game-icon" alt="IOS游戏"> <svg-icon v-else-if="item.game_type == 4" icon-class="IOS" class="game-icon" />
<img v-else-if="item.game_type == 2" src="@/assets/icon/H5.svg" class="game-icon" alt="H5游戏"> <svg-icon v-else-if="item.game_type == 2" icon-class="H5" class="game-icon" />
{{ item.game_text }} {{ item.game_text }}
</div> </div>
</template> </template>
...@@ -106,11 +107,14 @@ ...@@ -106,11 +107,14 @@
<el-collapse-item v-for="(item, index) in regGameList" :key="index" :name="item.label"> <el-collapse-item v-for="(item, index) in regGameList" :key="index" :name="item.label">
<template slot="title"> <template slot="title">
<div class="title-with-icon"> <div class="title-with-icon">
<img v-if="item.label.includes('微信')" src="@/assets/icon/wxgame.svg" class="game-icon" alt="微信小游戏"> <svg-icon v-if="item.label.includes('微信')" icon-class="wxgame" class="game-icon" />
<img v-else-if="item.label.includes('抖音')" src="@/assets/icon/douyin.svg" class="game-icon" alt="抖音小游戏"> <svg-icon v-else-if="item.label.includes('抖音')" icon-class="douyin" class="game-icon" />
<img v-else-if="item.label.includes('安卓')" src="@/assets/icon/Android.svg" class="game-icon" alt="安卓游戏"> <svg-icon v-else-if="item.label.includes('安卓')" icon-class="Android" class="game-icon" />
<img v-else-if="item.label.includes('IOS') || item.label.includes('iOS') || item.label.includes('ios')" src="@/assets/icon/IOS.svg" class="game-icon" alt="IOS游戏"> <svg-icon
<img v-else-if="item.label.includes('H5') || item.label.includes('h5')" src="@/assets/icon/H5.svg" class="game-icon" alt="H5游戏"> v-else-if="item.label.includes('IOS') || item.label.includes('iOS') || item.label.includes('ios')"
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 }} {{ item.label }}
</div> </div>
</template> </template>
...@@ -524,6 +528,13 @@ export default { ...@@ -524,6 +528,13 @@ export default {
handleConversionGameList() { handleConversionGameList() {
if (this.conversionGameList.length > 0) { if (this.conversionGameList.length > 0) {
this.conversionGameList.forEach((item, index) => { this.conversionGameList.forEach((item, index) => {
// 隐藏 h5的游戏 912:神权之战
if (item.game_type === 2 && item.children && item.children.length > 0) {
const filteredChildren = item.children.filter(child => {
return child.game_id !== '912'
})
this.$set(this.conversionGameList[index], 'children', filteredChildren)
}
// 隐藏安卓游戏 安卓游戏 game_type: 3 // 隐藏安卓游戏 安卓游戏 game_type: 3
if (item.game_type === 3 && item.children && item.children.length > 0) { if (item.game_type === 3 && item.children && item.children.length > 0) {
// 过滤掉 game_name 为"破日开天"的数据 // 过滤掉 game_name 为"破日开天"的数据
...@@ -1111,6 +1122,7 @@ export default { ...@@ -1111,6 +1122,7 @@ export default {
height: 100%; height: 100%;
overflow: auto; overflow: auto;
margin-top: -10px; margin-top: -10px;
.createChannel { .createChannel {
font-size: 14px; font-size: 14px;
margin-top: 16px; margin-top: 16px;
...@@ -1149,6 +1161,7 @@ export default { ...@@ -1149,6 +1161,7 @@ export default {
display: flex; display: flex;
margin: 12px 16px; margin: 12px 16px;
width: calc(100% - 32px); width: calc(100% - 32px);
.radio-group { .radio-group {
width: 100%; width: 100%;
...@@ -1268,7 +1281,7 @@ export default { ...@@ -1268,7 +1281,7 @@ export default {
} }
/* 当转端按钮处于激活状态时保持自定义样式 */ /* 当转端按钮处于激活状态时保持自定义样式 */
::v-deep .el-radio-button.is-active{ ::v-deep .el-radio-button.is-active {
.el-radio-button__inner { .el-radio-button__inner {
background: #E8F7FF; background: #E8F7FF;
border-color: #3491FA; border-color: #3491FA;
......
...@@ -4,124 +4,105 @@ ...@@ -4,124 +4,105 @@
<!-- VIP 自助工具 暂时不显示 --> <!-- VIP 自助工具 暂时不显示 -->
<div class="gameListItemApp rowFlex columnCenter spaceBetween" v-if="false"> <div class="gameListItemApp rowFlex columnCenter spaceBetween" v-if="false">
<p class="rowFlex columnCenter"> <p class="rowFlex columnCenter">
<img src="@/assets/icon/vipIcon.svg" alt="vipIcon" style="width: 16px;height: 16px;margin-right: 5px;"> <img src="@/assets/icon/svg/vipIcon.svg" alt="vipIcon" style="width: 16px;height: 16px;margin-right: 5px;">
VIP自助工具</p> VIP自助工具
<el-button </p>
size="mini" <el-button size="mini" :disabled="accountSelect == ''" @click="sendVipGift">发送</el-button>
:disabled="accountSelect==''"
@click="sendVipGift"
>发送</el-button>
</div> </div>
<!-- 自助链接(举报、申诉、礼包申请) --> <!-- 自助链接(举报、申诉、礼包申请) -->
<div class="gameListItemApp rowFlex columnCenter spaceBetween"> <div class="gameListItemApp rowFlex columnCenter spaceBetween">
<p class="rowFlex columnCenter"> <p class="rowFlex columnCenter">
<i class="el-icon-s-operation" style="font-size:16px;margin-right:5px;"></i> <i class="el-icon-s-operation" style="font-size:16px;margin-right:5px;"></i>
自助链接(举报、申诉、礼包申请)</p> 自助链接(举报、申诉、礼包申请)
<el-button </p>
size="mini" <el-button size="mini" :disabled="accountSelect == ''" @click="sendReportLink">发送</el-button>
:disabled="accountSelect==''"
@click="sendReportLink"
>发送</el-button>
</div> </div>
<div <div class="rowFlex columnCenter spaceBetween gameCodeTitle" @click="showGameCode = !showGameCode">
class="rowFlex columnCenter spaceBetween gameCodeTitle"
@click="showGameCode = !showGameCode"
>
<p class="rowFlex columnCenter spaceBetween"> <p class="rowFlex columnCenter spaceBetween">
<img src="@/assets/icon/gift.svg" alt="gift" style="width: 16px;height: 16px;margin-right: 5px;margin-top: -2px;"> <svg-icon icon-class="gift" style="font-size:20px;margin-right: 5px;margin-top: -2px;"></svg-icon>
<span class="giftCode">礼包码</span> <span class="giftCode">礼包码</span>
</p> </p>
<i :class="showGameCode?'el-icon-arrow-right':'el-icon-arrow-down'"></i> <i :class="showGameCode ? 'el-icon-arrow-right' : 'el-icon-arrow-down'"></i>
</div> </div>
<el-collapse-transition> <el-collapse-transition>
<el-collapse <el-collapse v-show="showGameCode" v-if="giftCodeGame.length > 0" :disabled="disabled" class="giftGameCollapse">
v-show="showGameCode" <el-collapse-item v-for="(item, index) in giftCodeGame" :key="index" :title="item.label"
v-if="giftCodeGame.length>0" style="margin-bottom: 10px;">
:disabled="disabled" <div v-if="giftCodeGame.length > 0">
class="giftGameCollapse" <div v-for="(items, indexs) in item.children" :key="indexs" class="gameListItemChange">
> <div class="gameListItemApp gameListItemAppAC">
<el-collapse-item
v-for="(item,index) in giftCodeGame"
:key="index"
:title="item.label"
style="margin-bottom: 10px;"
>
<div v-if="giftCodeGame.length>0">
<div
v-for="(items,indexs) in item.children"
:key="indexs"
class="gameListItemChange"
>
<div class="gameListItemApp gameListItemAppAC" >
<p v-if="items.gift_package_group_name" class="gameName">{{ items.gift_package_group_name }}</p> <p v-if="items.gift_package_group_name" class="gameName">{{ items.gift_package_group_name }}</p>
<div class="rowFlex columnCenter spaceBetween" style="margin-left: 20px;"> <div class="rowFlex columnCenter spaceBetween" style="margin-left: 20px;">
<p class="rowFlex columnCenter spaceBetween"> <p class="rowFlex columnCenter spaceBetween">
<el-popover <el-popover placement="top" width="300" trigger="hover">
placement="top"
width="300"
trigger="hover"
>
<div>{{ items.name }}</div> <div>{{ items.name }}</div>
<div slot="reference" class="gameName">{{ items.name }}</div> <div slot="reference" class="gameName">{{ items.name }}</div>
</el-popover> </el-popover>
<el-popover <el-popover placement="top" trigger="hover">
placement="top" <div class="contentPopover" v-html="items.content">
trigger="hover"
>
<div
class="contentPopover"
v-html="items.content"
>
</div> </div>
<el-button <el-button slot="reference" type="text" size="medium"
slot="reference" style="margin-right: 10px;">礼包内容</el-button>
type="text"
size="medium"
style="margin-right: 10px;"
>礼包内容</el-button>
</el-popover> </el-popover>
</p> </p>
<el-button <el-button size="mini" type="primary" :loading="loading"
size="mini" @click="sendGameCodeCopyDialog(items)">发送礼包码</el-button>
type="primary"
:loading="loading"
@click="sendGameCode(items)"
>发送礼包码</el-button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div <div v-else class="rowFlex allCenter">
v-else
class="rowFlex allCenter"
>
暂无游戏 暂无游戏
</div> </div>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
</el-collapse-transition> </el-collapse-transition>
</div> </div>
<giftCodeDialog v-if="dialogVisible" :game-name="game_name" :dialogVisible.sync="dialogVisible"
@result="getGiftCodeSubmit" />
</div> </div>
</template> </template>
<script> <script>
import { mapState, mapMutations } from 'vuex' import { mapState, mapMutations } from 'vuex'
import { passwardEncryption,createVipUrl } from '@/api/game' import { passwardEncryption, createVipUrl } from '@/api/game'
import { giftCodeList, sendGiftCode, getZyouAuthLink } from '@/api/works' import { giftCodeList, sendGiftCode, getZyouAuthLink } from '@/api/works'
export default { import giftCodeDialog from './giftCodeDialog.vue'
export default {
name: 'vipTools', name: 'vipTools',
data() { data() {
return { return {
disabled: true, disabled: true,
showGameCode: false, showGameCode: false,
giftCodeGame: [], giftCodeGame: [],
dialogVisible: false,
game_name: '',
giftCodeForm: {
member_id: '',
username: '',
role_name: '',
role_id: '',
gift_package_id: '',
},
loading: false loading: false
} }
}, },
components: {
giftCodeDialog
},
mounted() { mounted() {
this.requestGiftCode() this.requestGiftCode()
}, },
destroyed() {
this.giftCodeForm = {
member_id: '',
username: '',
role_name: '',
role_id: '',
gift_package_id: ''
}
},
computed: { computed: {
...mapState('game', ['accountSelect', 'bindGameUserList','chatUserInfo']), ...mapState('game', ['accountSelect', 'bindGameUserList', 'chatUserInfo']),
...mapState('user', ['userid']), ...mapState('user', ['userid']),
}, },
props: { props: {
...@@ -137,11 +118,21 @@ ...@@ -137,11 +118,21 @@
} }
}, },
methods: { 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() { sendVipGift() {
if (this.bindGameUserList.length > 0) { if (this.bindGameUserList.length > 0) {
createVipUrl({ member_id: this.accountSelect }).then(res => { createVipUrl({ member_id: this.accountSelect }).then(res => {
if (res.data.url && res.data.url != '') { if (res.data.url && res.data.url != '') {
this.sendChatMessage(res.data.url,'text') this.sendChatMessage(res.data.url, 'text')
} else { } else {
this.$message.warning('暂无vip链接') this.$message.warning('暂无vip链接')
} }
...@@ -150,9 +141,10 @@ ...@@ -150,9 +141,10 @@
this.$message.warning('请先关联游戏账号') this.$message.warning('请先关联游戏账号')
} }
}, },
sendChatMessage(content,type){
sendChatMessage(content, type) {
let message = {} let message = {}
if(type == 'text'){ if (type == 'text') {
message = { message = {
msgtype: 'text', msgtype: 'text',
text: { text: {
...@@ -165,7 +157,7 @@ ...@@ -165,7 +157,7 @@
console.log(err, '发送文本失败') console.log(err, '发送文本失败')
} }
} }
}else if(type == 'link'){ } else if (type == 'link') {
message = { message = {
msgtype: 'news', msgtype: 'news',
news: content, news: content,
...@@ -176,7 +168,7 @@ ...@@ -176,7 +168,7 @@
console.log(err, '发送 news 失败') console.log(err, '发送 news 失败')
} }
} }
}else if(type == 'image'){ } else if (type == 'image') {
message = { message = {
msgtype: 'image', msgtype: 'image',
image: { image: {
...@@ -190,7 +182,7 @@ ...@@ -190,7 +182,7 @@
} }
} }
} }
console.log(message,'1231') console.log(message, '1231')
this.$ww.sendChatMessage(message) this.$ww.sendChatMessage(message)
}, },
// 发送举报申诉自助链接 // 发送举报申诉自助链接
...@@ -203,7 +195,7 @@ ...@@ -203,7 +195,7 @@
desc: '点击此处提交申请', desc: '点击此处提交申请',
link: res.data.url link: res.data.url
} }
this.sendChatMessage(link,'link') this.sendChatMessage(link, 'link')
} else { } else {
this.$message.warning('暂无申诉自助链接') this.$message.warning('暂无申诉自助链接')
} }
...@@ -213,7 +205,7 @@ ...@@ -213,7 +205,7 @@
// 1 企微 2 微信 // 1 企微 2 微信
const data = { const data = {
userid: this.userid, userid: this.userid,
user_type:1 user_type: 1
} }
const res = await giftCodeList(data) const res = await giftCodeList(data)
if (res.status_code == 1 && res.data.length > 0) { if (res.status_code == 1 && res.data.length > 0) {
...@@ -235,20 +227,42 @@ ...@@ -235,20 +227,42 @@
item.group_name = item.gift_package_group_name 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) { async sendGameCode(items) {
this.loading = true this.loading = true
const data = { const data = {
userid: this.chatUserInfo.userid, userid: this.chatUserInfo.userid,
external_userid: this.chatUserInfo.external_userid, external_userid: this.chatUserInfo.external_userid,
member_id: this.accountSelect, member_id: this.giftCodeForm.member_id,
gift_package_id: items.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 user_type: 1
} }
const res = await sendGiftCode(data) const res = await sendGiftCode(data)
if (res.status_code === 1) { if (res.status_code === 1) {
this.$message.success('发送成功') this.$message.success('发送成功')
this.sendChatMessage(res.data,'text') this.sendChatMessage(res.data, 'text')
} else { } else {
this.$message.error(res.msg || '发送失败') this.$message.error(res.msg || '发送失败')
} }
...@@ -294,25 +308,29 @@ ...@@ -294,25 +308,29 @@
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.vipToolsContent{ .vipToolsContent {
width: 100%; width: 100%;
height: 100%; height: 100%;
overflow: auto; overflow: auto;
.sendLink { .sendLink {
width: 150px; width: 150px;
height: 25px; height: 25px;
cursor: pointer; cursor: pointer;
} }
.sendLink:hover { .sendLink:hover {
color: #409EFF; color: #409EFF;
} }
.giftGameCollapse { .giftGameCollapse {
width: 100%; width: 100%;
height: auto; height: auto;
} }
.btntab { .btntab {
width: 100%; width: 100%;
display: flex; display: flex;
...@@ -321,14 +339,17 @@ ...@@ -321,14 +339,17 @@
position: absolute; position: absolute;
left: 0; left: 0;
top: 0; top: 0;
.btn { .btn {
flex: 1; flex: 1;
display: flex; display: flex;
cursor: pointer; cursor: pointer;
} }
.btn:first-child { .btn:first-child {
border-right: 1px solid #ccc; border-right: 1px solid #ccc;
} }
.btnActive { .btnActive {
background: #409EFF; background: #409EFF;
color: #fff; color: #fff;
...@@ -339,53 +360,62 @@ ...@@ -339,53 +360,62 @@
width: 100%; width: 100%;
height: auto; height: auto;
overflow: auto; overflow: auto;
::v-deep .el-tabs__item { ::v-deep .el-tabs__item {
width: 70px; width: 70px;
} }
.giftCode { .giftCode {
font-size: 14px; font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
color: #333333; color: #333333;
} }
.gameCodeTitle { .gameCodeTitle {
cursor: pointer; cursor: pointer;
margin: 10px 0 10px 0; margin: 10px 0 10px 0;
} }
.gameListItemApp { .gameListItemApp {
width: 100%; width: 100%;
padding-left: 20px; padding-left: 20px;
.gameName{
.gameName {
max-width: 120px; max-width: 120px;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
margin-right: 5px; margin-right: 5px;
} }
p { p {
font-size: 14px; font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
color: #333333; color: #333333;
} }
.icon { .icon {
font-size: 14px; font-size: 14px;
cursor: pointer; cursor: pointer;
} }
} }
.gameListItemAppAC { .gameListItemAppAC {
background: #f7f8fa; background: #f7f8fa;
} }
} }
} }
</style> </style>
<style> <style>
.contentPopover { .contentPopover {
max-width: 400px; max-width: 400px;
word-wrap: break-word; word-wrap: break-word;
word-break: break-all; word-break: break-all;
} }
.contentPopover img {
.contentPopover img {
max-width: 250px; max-width: 250px;
} }
</style> </style>
\ No newline at end of file \ No newline at end of file
...@@ -2,40 +2,20 @@ ...@@ -2,40 +2,20 @@
<div class="approval-role-list columnFlex"> <div class="approval-role-list columnFlex">
<el-form ref="taskForm" :model="reportForm" label-position="top" class="taskForm" label-width="85px"> <el-form ref="taskForm" :model="reportForm" label-position="top" class="taskForm" label-width="85px">
<el-form-item label="角色名称"> <el-form-item label="角色名称">
<el-input <el-input v-model="reportForm.role_name" clearable placeholder="请输入角色名称" @change="filterChange">
v-model="reportForm.role_name"
clearable
placeholder="请输入角色名称"
@change="filterChange"
>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item label="审批状态"> <el-form-item label="审批状态">
<el-select <el-select v-model="reportForm.approval_status" clearable style="width: 100%;" placeholder="请选择审批状态"
v-model="reportForm.approval_status" @change="filterChange">
clearable
style="width: 100%;"
placeholder="请选择审批状态"
@change="filterChange"
>
<el-option v-for="item in approvalList" :key="item.value" :label="item.label" :value="item.value"> <el-option v-for="item in approvalList" :key="item.value" :label="item.label" :value="item.value">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="申请方式"> <el-form-item label="申请方式">
<el-select <el-select v-model="reportForm.register_type" clearable style="width: 100%;" placeholder="请选择申请方式"
v-model="reportForm.register_type" @change="filterChange">
clearable <el-option v-for="item in register_type_list" :key="item.value" :label="item.label" :value="item.value">
style="width: 100%;"
placeholder="请选择申请方式"
@change="filterChange"
>
<el-option
v-for="item in register_type_list"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -56,23 +36,13 @@ ...@@ -56,23 +36,13 @@
/> />
</el-form-item> --> </el-form-item> -->
<el-form-item label="开始时间"> <el-form-item label="开始时间">
<el-date-picker <el-date-picker v-model="reportForm.create_time_start" type="datetime" style="width: 100%;"
v-model="reportForm.create_time_start" value-format="yyyy-MM-dd HH:mm:ss" @change="createResult" placeholder="选择日期时间">
type="datetime"
style="width: 100%;"
value-format="yyyy-MM-dd HH:mm:ss"
@change="createResult"
placeholder="选择日期时间">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="结束时间"> <el-form-item label="结束时间">
<el-date-picker <el-date-picker v-model="reportForm.create_time_end" type="datetime" style="width: 100%;" @change="endResult"
v-model="reportForm.create_time_end" value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期时间">
type="datetime"
style="width: 100%;"
@change="endResult"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="选择日期时间">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
...@@ -80,12 +50,8 @@ ...@@ -80,12 +50,8 @@
<el-button size="mini" @click="resetForm">重置</el-button> <el-button size="mini" @click="resetForm">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div <div v-infinite-scroll="paperScroll" :infinite-scroll-disabled="!isMoreRecord" :infinite-scroll-immediate="false"
v-infinite-scroll="paperScroll" class="approvalScroll">
:infinite-scroll-disabled="!isMoreRecord"
:infinite-scroll-immediate="false"
class="approvalScroll"
>
<!-- 举报申请 --> <!-- 举报申请 -->
<div class="scrollMain" v-if="reportList.length > 0"> <div class="scrollMain" v-if="reportList.length > 0">
<div v-for="(item, index) in reportList" :key="index" class="reportContent" @click="appealProcess(item, index)"> <div v-for="(item, index) in reportList" :key="index" class="reportContent" @click="appealProcess(item, index)">
...@@ -105,36 +71,23 @@ ...@@ -105,36 +71,23 @@
<p><span class="label">违规操作:</span><span class="value">{{ item.appeal_type_text }}</span></p> <p><span class="label">违规操作:</span><span class="value">{{ item.appeal_type_text }}</span></p>
</div> </div>
<div class="reportItemRight columnFlex columnCenter"> <div class="reportItemRight columnFlex columnCenter">
<el-button <el-button v-if="item.approval_status == 1 && (item.customer_id == userInfo.id)" type="primary"
v-if="item.approval_status == 1 && (item.customer_id == userInfo.id)" size="mini" style="margin-bottom:15px;" @click.stop="handleReport(item)">撤销</el-button>
type="primary" <el-button v-else-if="item.approval_status == 4" type="primary" size="mini" style="margin-bottom:15px;"
size="mini" @click.stop="resubmitApproval(item)">重新提交</el-button>
style="margin-bottom:15px;" <svg-icon v-if="item.approval_status == 1" icon-class="shenpi1" class="icon" />
@click.stop="handleReport(item)" <svg-icon v-else-if="item.approval_status == 2" icon-class="shenpi2" class="icon" />
>撤销</el-button> <svg-icon v-else-if="item.approval_status == 3" icon-class="shenpi3" class="icon" />
<el-button <svg-icon v-else-if="item.approval_status == 4" icon-class="shenpi4" class="icon" />
v-else-if="item.approval_status == 4" <svg-icon v-else-if="item.approval_status == 5" icon-class="shenpi5" class="icon" />
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" />
</div> </div>
</div> </div>
<!-- 审批进度 --> <!-- 审批进度 -->
<el-collapse-transition> <el-collapse-transition>
<div v-if="item.showStep" class="appealProcessList"> <div v-if="item.showStep" class="appealProcessList">
<el-steps direction="vertical" :active="item.current" finish-status="success"> <el-steps direction="vertical" :active="item.current" finish-status="success">
<el-step <el-step v-for="(items, indexs) in item.appealProcessList" :key="'trans_item_' + indexs"
v-for="(items, indexs) in item.appealProcessList" :title="items.node_name">
:key="'trans_item_' + indexs"
:title="items.node_name"
>
<template slot="description"> <template slot="description">
<div v-if="items" class="trans-follow-1 card-style"> <div v-if="items" class="trans-follow-1 card-style">
<div class="follow-item"> <div class="follow-item">
...@@ -144,13 +97,8 @@ ...@@ -144,13 +97,8 @@
<span class="info-value value-font"> <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> </span>
<el-tooltip <el-tooltip v-if="Array.isArray(items.user_name) && items.user_name.length > 1" class="item"
v-if="Array.isArray(items.user_name) && items.user_name.length > 1" effect="dark" :content="items.user_name.slice(1).join('、')" placement="top">
class="item"
effect="dark"
:content="items.user_name.slice(1).join('、')"
placement="top"
>
<span class="info-value value-font info-value-color"> <span class="info-value value-font info-value-color">
{{ `+${items.user_name.length - 1}` }} {{ `+${items.user_name.length - 1}` }}
</span> </span>
...@@ -161,12 +109,9 @@ ...@@ -161,12 +109,9 @@
<span class="follow-info-label label-font"> <span class="follow-info-label label-font">
审批结果: 审批结果:
</span> </span>
<span <span class="info-value value-font"
class="info-value value-font" :class="[items.current < indexs ? '' : switchStateTag(items.approval_result)]">
:class="[items.current < indexs ? '' : switchStateTag(items.approval_result)]" {{ items.current < indexs ? '' : items.approval_result_text }} </span>
>
{{ items.current < indexs ? '' : items.approval_result_text }}
</span>
</div> </div>
<div class="follow-item"> <div class="follow-item">
<span class="follow-info-label label-font"> <span class="follow-info-label label-font">
...@@ -176,10 +121,8 @@ ...@@ -176,10 +121,8 @@
{{ items.node_sort === '0' ? items.create_time : items.update_time }} {{ items.node_sort === '0' ? items.create_time : items.update_time }}
</span> </span>
</div> </div>
<div <div v-if="(items.node_sort !== '0' || items.node_name === '系统') && items.approval_result === '2'"
v-if="(items.node_sort !== '0' || items.node_name === '系统') && items.approval_result==='2'" class="follow-item">
class="follow-item"
>
<span class="follow-info-label label-font"> <span class="follow-info-label label-font">
驳回原因: 驳回原因:
</span> </span>
...@@ -202,8 +145,7 @@ ...@@ -202,8 +145,7 @@
<!-- 同步掌游的内容 --> <!-- 同步掌游的内容 -->
<div <div
v-if="(items.node_sort === '0' || (items.extra_attribution && items.extra_attribution.remark)) && items.node_name !== '系统'" v-if="(items.node_sort === '0' || (items.extra_attribution && items.extra_attribution.remark)) && items.node_name !== '系统'"
class="info-item-remark" class="info-item-remark">
>
<div style="display: flex;"> <div style="display: flex;">
<span class="info-label remark-label">详情:</span> <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)">
...@@ -211,7 +153,9 @@ ...@@ -211,7 +153,9 @@
点击查看大图 点击查看大图
</span> </span>
</div> </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>
</div> </div>
</template> </template>
...@@ -225,33 +169,30 @@ ...@@ -225,33 +169,30 @@
<noContent /> <noContent />
</div> </div>
</div> </div>
<el-dialog :visible.sync="dialogRemarkVisible" top="50%" center append-to-body title="查看大图" custom-class="remake-dialog"> <el-dialog :visible.sync="dialogRemarkVisible" top="50%" center append-to-body title="查看大图"
custom-class="remake-dialog">
<div class="remake-box"> <div class="remake-box">
<div v-html="dialogRemake"></div> <div v-html="dialogRemake"></div>
</div> </div>
</el-dialog> </el-dialog>
<resubmitApproval <resubmitApproval v-if="showResubmitApproval" :show.sync="showResubmitApproval" :appeal-info="appealInfo"
v-if="showResubmitApproval" @updateReportList="filterChange" />
:show.sync="showResubmitApproval"
:appeal-info="appealInfo"
@updateReportList="filterChange"
/>
</div> </div>
</template> </template>
<script> <script>
import { searchcondition, appealList, appealCancel, appealProcess } from '@/api/game' import { searchcondition, appealList, appealCancel, appealProcess } from '@/api/game'
import { mapState, mapMutations } from 'vuex' import { mapState, mapMutations } from 'vuex'
import { removeDp, formatNumber,debounce } from '@/utils/index' import { removeDp, formatNumber, debounce } from '@/utils/index'
import resubmitApproval from './layer/appeal.vue' import resubmitApproval from './layer/appeal.vue'
// 导入审批状态图标 // 导入审批状态图标
import shenpi1 from '@/assets/icon/shenpi1.svg' import shenpi1 from '@/assets/icon/svg/shenpi1.svg'
import shenpi2 from '@/assets/icon/shenpi2.svg' import shenpi2 from '@/assets/icon/svg/shenpi2.svg'
import shenpi3 from '@/assets/icon/shenpi3.svg' import shenpi3 from '@/assets/icon/svg/shenpi3.svg'
import shenpi4 from '@/assets/icon/shenpi4.svg' import shenpi4 from '@/assets/icon/svg/shenpi4.svg'
import shenpi5 from '@/assets/icon/shenpi5.svg' import shenpi5 from '@/assets/icon/svg/shenpi5.svg'
import noContent from "@/components/noContent.vue"; import noContent from "@/components/noContent.vue";
import watchMember from '@/mixins/watchMember' import watchMember from '@/mixins/watchMember'
export default { export default {
name: 'approval', name: 'approval',
computed: { computed: {
...mapState('game', ['accountSelect']), ...mapState('game', ['accountSelect']),
...@@ -259,11 +200,11 @@ ...@@ -259,11 +200,11 @@
}, },
watch: { watch: {
accountSelect: { accountSelect: {
handler:debounce(function(newVal, oldVal) { handler: debounce(function (newVal, oldVal) {
if (newVal && newVal !== "" && newVal !== oldVal) { if (newVal && newVal !== "" && newVal !== oldVal) {
this.filterChange() this.filterChange()
} }
},200), }, 200),
immediate: false immediate: false
} }
}, },
...@@ -323,8 +264,8 @@ ...@@ -323,8 +264,8 @@
this.filterChange() this.filterChange()
}, },
methods: { methods: {
resetForm(){ resetForm() {
this.reportForm={ this.reportForm = {
customer_id: '', customer_id: '',
member_id: '', member_id: '',
role_id: '', role_id: '',
...@@ -332,7 +273,7 @@ ...@@ -332,7 +273,7 @@
role_name: '', role_name: '',
register_type: 1, register_type: 1,
approval_status: '', approval_status: '',
create_time_start: this.$moment().subtract(3, 'months').format('YYYY-MM-DD HH:mm:ss') , create_time_start: this.$moment().subtract(3, 'months').format('YYYY-MM-DD HH:mm:ss'),
create_time_end: this.$moment().endOf('day').format('YYYY-MM-DD HH:mm:ss') create_time_end: this.$moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
} }
}, },
...@@ -352,7 +293,7 @@ ...@@ -352,7 +293,7 @@
createResult(data) { createResult(data) {
this.reportForm.create_time_start = data this.reportForm.create_time_start = data
}, },
endResult(data){ endResult(data) {
this.reportForm.create_time_end = data this.reportForm.create_time_end = data
}, },
async requstApprovalList() { async requstApprovalList() {
...@@ -510,15 +451,16 @@ ...@@ -510,15 +451,16 @@
} }
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.approval-role-list { .approval-role-list {
width: 100%; width: 100%;
height: 100%; height: 100%;
padding-top: 10px; padding-top: 10px;
overflow: auto; overflow: auto;
.taskForm { .taskForm {
::v-deep .el-form-item { ::v-deep .el-form-item {
margin-bottom: 10px; margin-bottom: 10px;
...@@ -551,7 +493,7 @@ ...@@ -551,7 +493,7 @@
font-size: 12px; font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
color: #3491FA ; color: #3491FA;
border: none; border: none;
} }
...@@ -574,6 +516,7 @@ ...@@ -574,6 +516,7 @@
.approvalScroll { .approvalScroll {
width: 100%; width: 100%;
height: auto; height: auto;
.scrollMain { .scrollMain {
width: 100%; width: 100%;
height: auto; height: auto;
...@@ -669,66 +612,66 @@ ...@@ -669,66 +612,66 @@
background: #e4fff1 !important; background: #e4fff1 !important;
} }
} }
} }
// 掌游的样式 // 掌游的样式
::v-deep.el-step .el-step__line { ::v-deep.el-step .el-step__line {
width: 1px; width: 1px;
} }
::v-deep .el-step>.is-success { ::v-deep .el-step>.is-success {
color: #3491FA ; color: #3491FA;
border-color: #3491FA ; border-color: #3491FA;
.el-step__line { .el-step__line {
background-color: #e5e6eb; background-color: #e5e6eb;
} }
} }
::v-deep .el-step__main>.is-success { ::v-deep .el-step__main>.is-success {
color: #3491FA ; color: #3491FA;
} }
::v-deep .el-step>.is-process { ::v-deep .el-step>.is-process {
color: #3491FA ; color: #3491FA;
border-color: #3491FA ; border-color: #3491FA;
.el-step__line { .el-step__line {
background-color: #e5e6eb; background-color: #e5e6eb;
} }
} }
::v-deep .el-step__main>.is-process { ::v-deep .el-step__main>.is-process {
color: #3491FA ; color: #3491FA;
} }
.form-item-btn { .form-item-btn {
margin: 0 0 0 20px; margin: 0 0 0 20px;
} }
.audit-label { .audit-label {
font-size: 14px; font-size: 14px;
font-weight: 800; font-weight: 800;
margin: 0 0 10px 0; margin: 0 0 10px 0;
} }
.remark-label { .remark-label {
color: #949fb0; color: #949fb0;
font-size: 14px; font-size: 14px;
} }
.preview-btn { .preview-btn {
cursor: pointer; cursor: pointer;
font-size: 14px; font-size: 14px;
color: #3491FA ; color: #3491FA;
margin: 0 0 0 10px; margin: 0 0 0 10px;
i { i {
margin: 0 5px 0 0; margin: 0 5px 0 0;
} }
} }
.remark-value { .remark-value {
min-height: 100px; min-height: 100px;
margin: 10px 0 0 40px; margin: 10px 0 0 40px;
padding: 6px 12px; padding: 6px 12px;
...@@ -736,31 +679,31 @@ ...@@ -736,31 +679,31 @@
border-radius: 4px; border-radius: 4px;
cursor: not-allowed; cursor: not-allowed;
color: #333; color: #333;
} }
.flex-box { .flex-box {
display: flex; display: flex;
.remark-lebel { .remark-lebel {
width: 50px; width: 50px;
text-align: right; text-align: right;
} }
} }
.refund-flow-drawer { .refund-flow-drawer {
position: fixed; position: fixed;
top: 0; top: 0;
right: 700px; right: 700px;
} }
.btm-btn-box { .btm-btn-box {
position: fixed; position: fixed;
bottom: 20px; bottom: 20px;
width: 560px; width: 560px;
height: 32px; height: 32px;
} }
.audit-state { .audit-state {
width: 50px; width: 50px;
height: 50px; height: 50px;
position: absolute; position: absolute;
...@@ -772,16 +715,16 @@ ...@@ -772,16 +715,16 @@
.audit-state-stamp { .audit-state-stamp {
font-size: 50px; font-size: 50px;
} }
} }
.info-item { .info-item {
width: 45%; width: 45%;
display: flex; display: flex;
height: 18px; height: 18px;
margin: 0 0 12px 0; margin: 0 0 12px 0;
} }
.info-item-pic { .info-item-pic {
width: 100%; width: 100%;
min-height: 96px; min-height: 96px;
max-height: 192px; max-height: 192px;
...@@ -829,34 +772,34 @@ ...@@ -829,34 +772,34 @@
} }
} }
} }
} }
.flex-btn { .flex-btn {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
.info-label { .info-label {
// width: 90px; // width: 90px;
// text-align: right; // text-align: right;
display: block; display: block;
margin: 0 10px 0 0; margin: 0 10px 0 0;
font-size: 14px; font-size: 14px;
color: #949fb0; color: #949fb0;
} }
.info-value { .info-value {
display: block; display: block;
font-size: 14px; font-size: 14px;
color: #333; color: #333;
} }
.card-style { .card-style {
background: #f2f2f7; background: #f2f2f7;
border-radius: 4px; border-radius: 4px;
} }
.trans-follow-1 { .trans-follow-1 {
width: 300px; width: 300px;
min-height: fit-content; min-height: fit-content;
margin: 6px 0 12px 0; margin: 6px 0 12px 0;
...@@ -876,12 +819,12 @@ ...@@ -876,12 +819,12 @@
} }
.info-value-color { .info-value-color {
color: #3491FA ; color: #3491FA;
margin-left: 5px; margin-left: 5px;
} }
} }
.follow-item { .follow-item {
min-height: 20px; min-height: 20px;
line-height: 20px; line-height: 20px;
margin: 0 0 12px 0; margin: 0 0 12px 0;
...@@ -891,30 +834,30 @@ ...@@ -891,30 +834,30 @@
width: 90px; width: 90px;
text-align: right; text-align: right;
} }
} }
.left-label { .left-label {
width: 60px; width: 60px;
} }
.follow-info-label { .follow-info-label {
width: fit-content; width: fit-content;
text-align: left; text-align: left;
display: inline-block; display: inline-block;
margin: 0 10px 0 0; margin: 0 10px 0 0;
} }
.info-value { .info-value {
font-size: 14px; font-size: 14px;
color: #333; color: #333;
} }
.label-font { .label-font {
font-size: 14px; font-size: 14px;
color: #949fb0; color: #949fb0;
} }
.info-item-remark { .info-item-remark {
width: 100%; width: 100%;
padding: 0 0 12px 0; padding: 0 0 12px 0;
line-height: 20px; line-height: 20px;
...@@ -927,12 +870,10 @@ ...@@ -927,12 +870,10 @@
display: block; display: block;
width: 440px; width: 440px;
} }
} }
.appealProcessList { .appealProcessList {
margin-bottom: 20px; margin-bottom: 20px;
margin-top: 20px; margin-top: 20px;
} }
</style>
</style> \ No newline at end of file
\ No newline at end of file
<template> <template>
<div class="reportList"> <div class="reportList" v-scroll="paperScroll">
<el-form ref="taskForm" :model="reportForm" class="taskForm" label-position="top" label-width="85px"> <el-form
ref="taskForm"
:model="reportForm"
class="taskForm"
label-position="top"
label-width="85px"
>
<el-form-item label="角色名称"> <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-input>
</el-form-item> </el-form-item>
<el-form-item label="审批状态"> <el-form-item label="审批状态">
<el-select v-model="reportForm.approval_status" style="width:100%;" clearable placeholder="请选择审批状态" <el-select
@change="filterChange"> v-model="reportForm.approval_status"
<el-option v-for="item in approvalList" :key="item.value" :label="item.label" :value="item.value"> 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-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="申请方式"> <el-form-item label="申请方式">
<el-select v-model="reportForm.register_type" style="width:100%;" clearable placeholder="请选择申请方式" <el-select
@change="filterChange"> v-model="reportForm.register_type"
<el-option v-for="item in register_type_list" :key="item.value" :label="item.label" :value="item.value"> 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-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div v-infinite-scroll="paperScroll" :infinite-scroll-disabled="!isMoreRecord" :infinite-scroll-immediate="false" <div
class="mailListScroll"> :infinite-scroll-disabled="!isMoreRecord"
:infinite-scroll-immediate="false"
class="mailListScroll"
>
<!-- 举报申请 --> <!-- 举报申请 -->
<div class="scrollMain" v-if="reportList.length > 0"> <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="reportItem rowFlex spaceBetween columnCenter">
<div class="reportItemLeft"> <div class="reportItemLeft">
<p><span class="label">角色名称:</span><span class="value">{{ item.role_name }}</span></p>
<p> <p>
<span class="label">累计充值:</span><span class="value">{{ formatNumber(item.recharge_total_amount) }} <span class="label">角色名称:</span
</span> ><span class="value">{{ item.role_name }}</span>
</p> </p>
<p> <p>
<span class="label">近一周充值:</span><span class="value">{{ formatNumber(item.recharge_week_amount) <span class="label">累计充值:</span
}}</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>
<p><span class="label">违规操作:</span><span class="value">{{ item.violation_type_text }}</span></p>
</div> </div>
<div class="reportItemRight columnFlex columnCenter"> <div class="reportItemRight columnFlex columnCenter">
<!-- 撤销 当item.create_user_id == zq_user_id 的时候才可以撤销 只能撤销自己提交的审批 --> <!-- 撤销 当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" <el-button
@click.stop="handleReport(item)">撤销</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 <el-button
v-if="item.approval_status == 1 && reportForm.register_type == 2 && (item.customer_id == userInfo.id)" v-if="
type="primary" size="mini" @click.stop="resubmitReportApproval(item)">审批</el-button> 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" <el-button
@click.stop="resubmitReport(item)">重新提交</el-button> v-else-if="item.approval_status == 4"
<img v-if="item.approval_status == 1" :src="shenpi1" class="icon" /> type="primary"
<img v-else-if="item.approval_status == 2" :src="shenpi2" class="icon" /> size="mini"
<img v-else-if="item.approval_status == 3" :src="shenpi3" class="icon" /> @click.stop="resubmitReport(item)"
<img v-else-if="item.approval_status == 4" :src="shenpi4" class="icon" /> >重新提交</el-button
<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>
</div> </div>
<!-- 审批进度 --> <!-- 审批进度 -->
<el-collapse-transition> <el-collapse-transition>
<div v-if="item.showStep" class="reportProcessList"> <div v-if="item.showStep" class="reportProcessList">
<el-steps direction="vertical" :active="item.current" finish-status="success"> <el-steps
<el-step v-for="(items, indexs) in item.reportProcessList" :key="'trans_item_' + indexs" direction="vertical"
:title="items.node_name"> :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"> <template slot="description">
<div v-if="items" class="trans-follow-1 card-style"> <div v-if="items" class="trans-follow-1 card-style">
<div class="follow-item"> <div class="follow-item">
...@@ -69,34 +166,77 @@ ...@@ -69,34 +166,77 @@
{{ items.node_sort !== '0' ? '审批人:' : '登记人:' }} {{ items.node_sort !== '0' ? '审批人:' : '登记人:' }}
</span> </span>
<span class="info-value value-font"> <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> </span>
<el-tooltip v-if="Array.isArray(items.user_name) && items.user_name.length > 1" class="item" <el-tooltip
effect="dark" :content="items.user_name.slice(1).join('、')" placement="top"> 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"> <span class="info-value value-font info-value-color">
{{ `+${items.user_name.length - 1}` }} {{ `+${items.user_name.length - 1}` }}
</span> </span>
</el-tooltip> </el-tooltip>
</div> </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 class="follow-info-label label-font">
审批结果: 审批结果:
</span> </span>
<span class="info-value value-font" <span
:class="[items.current < indexs ? '' : switchStateTag(items.approval_result)]"> class="info-value value-font"
{{ items.current < indexs ? '' : items.approval_result_text }} </span> :class="[
items.current < indexs
? ''
: switchStateTag(items.approval_result),
]"
>
{{
items.current < indexs
? ''
: items.approval_result_text
}}
</span>
</div> </div>
<div class="follow-item"> <div class="follow-item">
<span class="follow-info-label label-font"> <span class="follow-info-label label-font">
{{ items.node_sort !== '0' || items.node_name === '系统' ? '审批时间:' : '登记时间:' }} {{
items.node_sort !== '0' ||
items.node_name === '系统'
? '审批时间:'
: '登记时间:'
}}
</span> </span>
<span class="info-value value-font"> <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> </span>
</div> </div>
<div v-if="(items.node_sort !== '0' || items.node_name === '系统') && items.approval_result === '2'" <div
class="follow-item"> v-if="
(items.node_sort !== '0' ||
items.node_name === '系统') &&
items.approval_result === '2'
"
class="follow-item"
>
<span class="follow-info-label label-font"> <span class="follow-info-label label-font">
驳回原因: 驳回原因:
</span> </span>
...@@ -106,8 +246,17 @@ ...@@ -106,8 +246,17 @@
</div> </div>
<div <div
v-if="items.node_sort === item.reportProcessList[item.reportProcessList.length - 1].node_sort + '' && items.approval_result === '1' && items.node_sort !== '0'" v-if="
class="follow-item-remark follow-item"> 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 class="follow-info-label label-font">
处理结果: 处理结果:
</span> </span>
...@@ -115,17 +264,35 @@ ...@@ -115,17 +264,35 @@
{{ items.extra_attribution.banned_text }} {{ items.extra_attribution.banned_text }}
</span> </span>
</div> </div>
<div v-if="items.node_sort === '0' && items.node_name !== '系统'" class="info-item-remark"> <div
<div style="display: flex;"> 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="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> <i class="el-icon-view"></i>
点击查看大图 点击查看大图
</span> </span>
</div> </div>
<div class="remark-value" <div
v-html="formatImg(items.extra_attribution && items.extra_attribution.remark ? items.extra_attribution.remark : '')"> class="remark-value"
</div> v-html="
formatImg(
items.extra_attribution &&
items.extra_attribution.remark
? items.extra_attribution.remark
: ''
)
"
></div>
</div> </div>
</div> </div>
</template> </template>
...@@ -139,49 +306,67 @@ ...@@ -139,49 +306,67 @@
<noContent /> <noContent />
</div> </div>
</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 class="remake-box">
<div v-html="dialogRemake"></div> <div v-html="dialogRemake"></div>
</div> </div>
</el-dialog> </el-dialog>
<!-- 重新提交 --> <!-- 重新提交 -->
<resubmitReport v-if="showResubmitReport" :report-info="reportInfo" :show.sync="showResubmitReport" <resubmitReport
@updateReportList="filterChange" /> v-if="showResubmitReport"
:report-info="reportInfo"
:show.sync="showResubmitReport"
@updateReportList="filterChange"
/>
<!-- 审批 --> <!-- 审批 -->
<approvalTask v-if="isApproval" :show.sync="isApproval" :report-info="reportInfo" <approvalTask
@updateReportList="filterChange" /> v-if="isApproval"
:show.sync="isApproval"
:report-info="reportInfo"
@updateReportList="filterChange"
/>
</div> </div>
</template> </template>
<script> <script>
import { searchcondition, reportIndex, reportCancel, reportProcess } from '@/api/game' import {
import { mapState, mapMutations } from 'vuex' searchcondition,
import { removeDp, formatNumber,debounce } from '@/utils/index' reportIndex,
import resubmitReport from './layer/report.vue' reportCancel,
import approvalTask from './layer/approvalTask.vue' reportProcess,
// 导入审批状态图标 } from '@/api/game';
import shenpi1 from '@/assets/icon/shenpi1.svg' import { mapState, mapMutations } from 'vuex';
import shenpi2 from '@/assets/icon/shenpi2.svg' import { removeDp, formatNumber, debounce } from '@/utils/index';
import shenpi3 from '@/assets/icon/shenpi3.svg' import resubmitReport from './layer/report.vue';
import shenpi4 from '@/assets/icon/shenpi4.svg' import approvalTask from './layer/approvalTask.vue';
import shenpi5 from '@/assets/icon/shenpi5.svg' // 导入审批状态图标
import noContent from '@/components/noContent.vue' import shenpi1 from '@/assets/icon/svg/shenpi1.svg';
export default { 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', name: 'report',
computed: { computed: {
...mapState('game', ['accountSelect']), ...mapState('game', ['accountSelect']),
...mapState('user', ['cser_id','cser_name']) ...mapState('user', ['cser_id', 'cser_name']),
}, },
watch: { watch: {
accountSelect(newVal,oldVal){ accountSelect(newVal, oldVal) {
if (newVal && newVal !== "" && newVal !== oldVal) { if (newVal && newVal !== '' && newVal !== oldVal) {
this.filterChange() this.filterChange();
}
} }
}, },
},
components: { components: {
resubmitReport, resubmitReport,
approvalTask, approvalTask,
noContent noContent,
}, },
data() { data() {
return { return {
...@@ -198,17 +383,17 @@ ...@@ -198,17 +383,17 @@
username: '', username: '',
role_name: '', role_name: '',
register_type: 1, register_type: 1,
approval_status: '' approval_status: '',
}, },
isApproval: false, isApproval: false,
register_type_list: [ register_type_list: [
{ value: 2, label: '玩家登记' }, { value: 2, label: '玩家登记' },
{ value: 1, label: '客服登记' } { value: 1, label: '客服登记' },
], ],
reportInfo: {}, reportInfo: {},
pageInfo: { pageInfo: {
page: 1, page: 1,
page_size: 20 page_size: 20,
}, },
showResubmitReport: false, showResubmitReport: false,
reportList: [], reportList: [],
...@@ -217,148 +402,154 @@ ...@@ -217,148 +402,154 @@
dialogRemarkVisible: false, dialogRemarkVisible: false,
dialogRemake: '', dialogRemake: '',
formatNumber: formatNumber, formatNumber: formatNumber,
taskTypeList: [] taskTypeList: [],
} };
}, },
mounted() { mounted() {
// this.request_register_type() // this.request_register_type()
this.requstApprovalList() this.requstApprovalList();
this.filterChange() this.filterChange();
}, },
methods: { methods: {
resubmitReport(item) { resubmitReport(item) {
this.reportInfo = item this.reportInfo = item;
this.showResubmitReport = true this.showResubmitReport = true;
}, },
// 审批 // 审批
resubmitReportApproval(item) { resubmitReportApproval(item) {
this.reportInfo = item this.reportInfo = item;
this.isApproval = true this.isApproval = true;
}, },
filterChange() { filterChange() {
this.pageInfo.page = 1 this.pageInfo.page = 1;
this.reportList = [] this.reportList = [];
this.isMoreRecord = true this.isMoreRecord = true;
this.reportIndex() this.reportIndex();
}, },
async requstApprovalList() { async requstApprovalList() {
const data = { const data = {
type: 'dictionaries', type: 'dictionaries',
table_name: 'zs_refund_request', table_name: 'zs_refund_request',
field_name: 'approval_status' field_name: 'approval_status',
} };
const res = await searchcondition(data) const res = await searchcondition(data);
if (res.status_code === 1) { if (res.status_code === 1) {
this.approvalList = res.data.data this.approvalList = res.data.data;
} }
}, },
async request_register_type() { async request_register_type() {
const data = { const data = {
type: 'dictionaries', type: 'dictionaries',
table_name: 'zs_report_request', table_name: 'zs_report_request',
field_name: 'register_type' field_name: 'register_type',
} };
const res = await searchcondition(data) const res = await searchcondition(data);
if (res.status_code === 1) { if (res.status_code === 1) {
this.register_type_list = res.data.data this.register_type_list = res.data.data;
} }
}, },
previewRemark(remark) { previewRemark(remark) {
this.dialogRemake = remark this.dialogRemake = remark;
this.dialogRemarkVisible = true this.dialogRemarkVisible = true;
}, },
async reportProcess(item, index) { async reportProcess(item, index) {
console.log(item.current, 'item') console.log(item.current, 'item');
item.showStep = !item.showStep item.showStep = !item.showStep;
if (item.reportProcessList.length === 0) { if (item.reportProcessList.length === 0) {
const res = await reportProcess({ id: item.id }) const res = await reportProcess({ id: item.id });
item.reportProcessList = res.data.data item.reportProcessList = res.data.data;
res.data.data.map((items) => { res.data.data.map((items) => {
if (items.approval_result !== '0' && items.approval_result !== '2') { if (items.approval_result !== '0' && items.approval_result !== '2') {
item.current += 1 item.current += 1;
} }
}) });
this.$forceUpdate() this.$forceUpdate();
} }
this.$forceUpdate() this.$forceUpdate();
}, },
paperScroll() { paperScroll() {
this.requestNextPage() console.log('开始滚动了');
if (!this.isMoreRecord) {
console.log('没有更多数据了');
return false;
}
this.requestNextPage();
}, },
requestNextPage(pageInfo) { requestNextPage(pageInfo) {
this.pageInfo.page++ this.pageInfo.page++;
this.reportIndex() this.reportIndex();
}, },
handleCurrentChange(val) { handleCurrentChange(val) {
this.pageInfo.page = val this.pageInfo.page = val;
}, },
switchStateTag(status) { switchStateTag(status) {
switch (status) { switch (status) {
case '0': case '0':
return 'unhandle' return 'unhandle';
case '1': case '1':
return 'handled' return 'handled';
case '2': case '2':
return 'sendFail' return 'sendFail';
} }
}, },
formatImg(html) { formatImg(html) {
if (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) { switchStateText(status) {
switch (status) { switch (status) {
case '0': case '0':
return '待审批' return '待审批';
case '1': case '1':
return '通过' return '通过';
case '2': case '2':
return '驳回' return '驳回';
} }
}, },
handleReport(item) { handleReport(item) {
this.$confirm('确定要撤销该申请么?', '确认提示', { this.$confirm('确定要撤销该申请么?', '确认提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning',
}) })
.then(() => { .then(() => {
console.log(1231) console.log(1231);
const data = { const data = {
id: item.id, id: item.id,
user_id: this.userInfo.id, user_id: this.userInfo.id,
user_name: this.userInfo.username user_name: this.userInfo.username,
} };
reportCancel(data).then(res => { reportCancel(data).then((res) => {
if (res.status_code === 1) { if (res.status_code === 1) {
this.$message({ this.$message({
type: 'success', type: 'success',
message: '撤销成功!' message: '撤销成功!',
}) });
this.filterChange() this.filterChange();
} }
}) });
}) })
.catch(() => { .catch(() => {
this.$message({ this.$message({
type: 'info', type: 'info',
message: '已取消' message: '已取消',
}) });
}) });
}, },
// 举报列表 // 举报列表
async reportIndex() { async reportIndex() {
if (this.accountSelect === '') { if (this.accountSelect === '') {
this.$message.warning('暂无关联的账号,请先去关联账号!') this.$message.warning('暂无关联的账号,请先去关联账号!');
return false return false;
} }
if (this.pageInfo.page == 1) { 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 { id } = this.userInfo
const data = { const data = {
username, username,
...@@ -367,37 +558,32 @@ ...@@ -367,37 +558,32 @@
// customer_id: id, // customer_id: id,
member_id: this.accountSelect, member_id: this.accountSelect,
register_type, register_type,
...this.pageInfo ...this.pageInfo,
} };
const res = await reportIndex(data) const res = await reportIndex(data);
if (this.pageInfo.page == 1) { if (this.pageInfo.page == 1) {
this.reportList = res.data.data this.reportList = res.data.data;
} else { } else {
this.reportList = removeDp(this.reportList, res.data.data, 'id') this.reportList = removeDp(this.reportList, res.data.data, 'id');
} }
if (this.reportList?.length > 0) { if (this.reportList.length > 0) {
this.reportList.map((item) => { this.reportList.map((item) => {
item.showStep = false item.showStep = false;
item.current = 0 item.current = 0;
item.reportProcessList = [] item.reportProcessList = [];
}) });
} else {
this.reportList = []
}
if (res.data.data?.length < 20) {
this.isMoreRecord = false
} else { } else {
this.isMoreRecord = true this.reportList = [];
} }
if (res.data.data?.length < 20) { if (res.data.data.length < 20) {
this.isMoreRecord = false this.isMoreRecord = false;
} else { } else {
this.isMoreRecord = true this.isMoreRecord = true;
}
} }
} },
} },
</script> };
</script>
<style lang="scss" scoped> <style lang="scss" scoped>
.reportList { .reportList {
...@@ -438,7 +624,7 @@ ...@@ -438,7 +624,7 @@
font-size: 12px; font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
color: #3491FA; color: #3491fa;
border: none; border: none;
} }
...@@ -564,30 +750,30 @@ ...@@ -564,30 +750,30 @@
width: 1px; width: 1px;
} }
::v-deep .el-step>.is-success { ::v-deep .el-step > .is-success {
color: #3491FA; color: #3491fa;
border-color: #3491FA; border-color: #3491fa;
.el-step__line { .el-step__line {
background-color: #e5e6eb; background-color: #e5e6eb;
} }
} }
::v-deep .el-step__main>.is-success { ::v-deep .el-step__main > .is-success {
color: #3491FA; color: #3491fa;
} }
::v-deep .el-step>.is-process { ::v-deep .el-step > .is-process {
color: #3491FA; color: #3491fa;
border-color: #3491FA; border-color: #3491fa;
.el-step__line { .el-step__line {
background-color: #e5e6eb; background-color: #e5e6eb;
} }
} }
::v-deep .el-step__main>.is-process { ::v-deep .el-step__main > .is-process {
color: #3491FA; color: #3491fa;
} }
.form-item-btn { .form-item-btn {
...@@ -608,7 +794,7 @@ ...@@ -608,7 +794,7 @@
.preview-btn { .preview-btn {
cursor: pointer; cursor: pointer;
font-size: 14px; font-size: 14px;
color: #3491FA; color: #3491fa;
margin: 0 0 0 10px; margin: 0 0 0 10px;
i { i {
...@@ -712,7 +898,7 @@ ...@@ -712,7 +898,7 @@
height: 80px; height: 80px;
} }
&:hover>.preview-pic { &:hover > .preview-pic {
z-index: 100; z-index: 100;
} }
} }
...@@ -764,7 +950,7 @@ ...@@ -764,7 +950,7 @@
} }
.info-value-color { .info-value-color {
color: #3491FA; color: #3491fa;
margin-left: 5px; margin-left: 5px;
} }
} }
......
<template> <template>
<div class="details-user-info-role columnFlex"> <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 <div
v-loading="loading" v-for="(items, indexs) in roleList"
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" :key="indexs"
class="contentItem" class="contentItem mb-[10px]"
> >
<div class="title"></div> <div class="title"></div>
<el-collapse-item :name="items.id"> <el-collapse-item :name="items.id">
<template slot="title"> <template slot="title">
<div class="collapseTitle rowFlex columnCenter spaceBetween"> <!-- <div class="collapseTitle rowFlex columnCenter spaceBetween">
<p class="hidden"> <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> </p>
<el-button type="primary" size="mini" class="collapseTitleBtn"
@click.stop="appealLayer(items)">申诉</el-button>
</div> -->
<div class="flex w-[100%] justify-between">
<div>
<div>
<span>角色名:</span><span>{{ items.role_name }}</span>
</div>
<div>
<span>区服:</span><span>{{ items.server_name }}</span>
</div>
<div>
<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-button <el-button
type="primary" type="primary"
size="mini" size="mini"
class="collapseTitleBtn" class="collapseTitleBtn"
@click.stop="appealLayer(items)" @click.stop="appealLayer(items)"
>申诉</el-button> >申诉</el-button
>
<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> </div>
</template> </template>
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
...@@ -81,13 +121,25 @@ ...@@ -81,13 +121,25 @@
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
<span class="label">最近活跃时间:</span> <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> </div>
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
<span class="label">创建时间:</span> <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> </div>
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
...@@ -101,10 +153,13 @@ ...@@ -101,10 +153,13 @@
</el-collapse> </el-collapse>
</div> </div>
<div <div
v-else-if="!loading && roleList.length==0" v-else-if="!loading && roleList.length == 0"
class="noContent rowFlex allCenter" class="noContent rowFlex allCenter"
> >
<noContent title="暂无数据" description="当前没有任何数据,请稍后再试或联系管理员" /> <noContent
title="暂无数据"
description="当前没有任何数据,请稍后再试或联系管理员"
/>
</div> </div>
</div> </div>
<appeal <appeal
...@@ -113,19 +168,21 @@ ...@@ -113,19 +168,21 @@
:appeal-info="appealInfo" :appeal-info="appealInfo"
/> />
</div> </div>
</template> </template>
<script> <script>
import { mapState, mapMutations, mapActions } from 'vuex' import { mapState, mapMutations, mapActions } from 'vuex';
import { getRoleHoLo } from '@/api/game' import { getRoleHoLo } from '@/api/game';
import noContent from '@/components/noContent.vue' import noContent from '@/components/noContent.vue';
import appeal from './layer/appeal.vue' import appeal from './layer/appeal.vue';
import watchMember from '@/mixins/watchMember' import watchMember from '@/mixins/watchMember';
export default { import { createDetails } from '@/views/popup/RecentActivitiesPopup/index.js';
import { createRoleRecentActivityNotPushNum } from '@/views/hooks/useGetCount.js';
export default {
name: 'roleInfo', name: 'roleInfo',
components: { components: {
noContent, noContent,
appeal appeal,
}, },
data() { data() {
return { return {
...@@ -138,66 +195,99 @@ ...@@ -138,66 +195,99 @@
pageInfo: { pageInfo: {
page_size: 100, page_size: 100,
page: 1, page: 1,
total: 0 total: 0,
}, },
infoList: [] infoList: [],
} recentActivitiesPopupInstance: null, //近期要开模块弹框
roleRecentActivityNotPushNumInstance: null, //侧边栏计数弹框
numRoleIdList: [],
};
}, },
computed: { computed: {
...mapState('game', ['accountSelect']) ...mapState('game', ['accountSelect']),
}, },
mixins: [watchMember], mixins: [watchMember],
mounted() { mounted() {
this.requestRoleList() this.requestRoleList();
this.nowTime = new Date().getTime() this.nowTime = new Date().getTime();
// 初始化创建角色最近活动未推送数量
this.initInstance();
}, },
methods: { 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() { memberChange() {
this.requestRoleList() this.requestRoleList();
}, },
// 申诉 // 申诉
appealLayer(item) { appealLayer(item) {
this.appealInfo = item this.appealInfo = item;
this.showAppeal = true this.showAppeal = true;
}, },
requestRoleList() { requestRoleList() {
if (this.accountSelect === '') { if (this.accountSelect === '') {
this.$message.warning('暂无关联的账号,请先去关联账号!') this.$message.warning('暂无关联的账号,请先去关联账号!');
return false return false;
} }
this.loading = true this.loading = true;
const data = { const data = {
api_search_name: '', api_search_name: '',
member_id: this.accountSelect, member_id: this.accountSelect,
search_type: 'list', search_type: 'list',
...this.pageInfo ...this.pageInfo,
} };
getRoleHoLo(data).then(res => { getRoleHoLo(data).then(
this.loading = false (res) => {
this.loading = false;
if (res.status_code == 1) { if (res.status_code == 1) {
if (res.data.data.length > 0) { 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 { } else {
this.roleList = [] this.roleList = [];
}
}
}, err => {
this.loading = false
})
} }
} }
},
(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%; width: 100%;
height: 100%; height: 100%;
background: #fff; background: #fff;
margin-left: 2px; margin-left: 2px;
overflow: auto; overflow: auto;
.detailsTitle { .detailsTitle {
width: 100%; width: 100%;
padding: 0 10px; padding: 0 10px;
...@@ -208,14 +298,17 @@ ...@@ -208,14 +298,17 @@
color: #333333; color: #333333;
border-bottom: 1px solid #ebeef5; border-bottom: 1px solid #ebeef5;
border-left: 1px solid #ebeef5; border-left: 1px solid #ebeef5;
p { p {
color: #333333; color: #333333;
} }
} }
.detailsContent { .detailsContent {
width: 100%; width: 100%;
height: 100%; height: 100%;
overflow: auto; overflow: auto;
.textInfo { .textInfo {
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
...@@ -224,8 +317,10 @@ ...@@ -224,8 +317,10 @@
margin-bottom: 10px; margin-bottom: 10px;
margin-top: 10px; margin-top: 10px;
} }
.contentItem { .contentItem {
position: relative; position: relative;
.title { .title {
position: absolute; position: absolute;
left: 10px; left: 10px;
...@@ -233,10 +328,12 @@ ...@@ -233,10 +328,12 @@
font-size: 14px; font-size: 14px;
color: #999999; color: #999999;
} }
.collapseTitle { .collapseTitle {
width: 90%; width: 90%;
} }
} }
.item { .item {
width: 100%; width: 100%;
height: auto; height: auto;
...@@ -248,33 +345,40 @@ ...@@ -248,33 +345,40 @@
position: relative; position: relative;
padding-left: 10px; padding-left: 10px;
cursor: pointer; cursor: pointer;
.tableImage { .tableImage {
width: 40px; width: 40px;
height: 40px; height: 40px;
border-radius: 6px; border-radius: 6px;
margin-right: 10px; margin-right: 10px;
} }
.label { .label {
color: #999999; color: #999999;
} }
.text { .text {
color: #333333; color: #333333;
margin-left: 10px; margin-left: 10px;
word-break: break-all; word-break: break-all;
max-width: 80%; max-width: 80%;
} }
.icon { .icon {
display: none; display: none;
position: absolute; position: absolute;
right: 0; right: 0;
top: 12px; top: 12px;
} }
.tags { .tags {
width: 300px; width: 300px;
margin-left: 10px; margin-left: 10px;
.tagsItem { .tagsItem {
width: 300px; width: 300px;
} }
.tag { .tag {
height: 22px; height: 22px;
line-height: 22px; line-height: 22px;
...@@ -291,10 +395,31 @@ ...@@ -291,10 +395,31 @@
} }
} }
} }
.item:hover .icon { .item:hover .icon {
display: block; display: block;
} }
} }
/* 已移除局部 el-collapse 样式,使用全局样式 */ ::v-deep .el-collapse-item {
margin-bottom: 20px;
}
::v-deep .el-collapse-item__content {
padding-bottom: 10px;
} }
</style> ::v-deep .el-collapse {
\ No newline at end of file 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;
}
/* 已移除局部 el-collapse 样式,使用全局样式 */
}
</style>
...@@ -20,7 +20,7 @@ export default { ...@@ -20,7 +20,7 @@ export default {
EmailGift, EmailGift,
WxGift WxGift
}, },
created(){ created() {
this.initializeWecom() this.initializeWecom()
}, },
methods: { methods: {
...@@ -50,7 +50,7 @@ export default { ...@@ -50,7 +50,7 @@ export default {
padding-top: 10px; padding-top: 10px;
background: #fff; background: #fff;
::v-deep .el-tabs__content{ ::v-deep .el-tabs__content {
height: calc(100% - 55px); height: calc(100% - 55px);
} }
......
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,
};
}
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
<span class="loading-spinner"></span> <span class="loading-spinner"></span>
</div> </div>
</div> </div>
<!-- 新增手机号验证码登录功能 -->
</div> </div>
<!-- 组织切换弹窗 --> <!-- 组织切换弹窗 -->
<el-dialog :visible.sync="showOrgDialog" width="300px" title="选择组织"> <el-dialog :visible.sync="showOrgDialog" width="300px" title="选择组织">
...@@ -104,16 +105,16 @@ export default { ...@@ -104,16 +105,16 @@ export default {
}, },
// 设置缓存 // 设置缓存
cacheCorp_id(corp_id) { cacheCorp_id(corp_id) {
Cookies.set('corp_id', corp_id, { expires: 7 }) Cookies.set('corp_id', corp_id, { expires: 30 })
this.set_corp_id(corp_id) this.set_corp_id(corp_id)
}, },
cacheuserid(userid) { cacheuserid(userid) {
Cookies.set('userid', userid, { expires: 7 }) Cookies.set('userid', userid, { expires: 30 })
this.set_userid(userid) this.set_userid(userid)
}, },
cacheCser(cser_id, cser_name) { cacheCser(cser_id, cser_name) {
Cookies.set('cser_id', cser_id, { expires: 7 }) Cookies.set('cser_id', cser_id, { expires: 30 })
Cookies.set('cser_name', cser_name, { expires: 7 }) Cookies.set('cser_name', cser_name, { expires: 30 })
this.set_cser_info({ this.set_cser_info({
cser_id: cser_id, cser_id: cser_id,
cser_name: cser_name cser_name: cser_name
...@@ -122,7 +123,7 @@ export default { ...@@ -122,7 +123,7 @@ export default {
this.set_cser_name(cser_name) this.set_cser_name(cser_name)
}, },
cacheSignData(signData) { cacheSignData(signData) {
Cookies.set('signData', JSON.stringify(signData), { expires: 7 }) Cookies.set('signData', JSON.stringify(signData), { expires: 30 })
this.set_signData(signData) this.set_signData(signData)
}, },
// 进入的页面地址是 https://companywx.jianshuwenhua.com/company_app/index.html?corp_id=wweaefe716636df3d1 // 进入的页面地址是 https://companywx.jianshuwenhua.com/company_app/index.html?corp_id=wweaefe716636df3d1
......
<template> <template>
<div class="mail-list-container" <div class="mail-list-container"
ref="mailListScroll"
v-scroll:50="loadMoreMail" v-scroll:50="loadMoreMail"
> >
<!-- 搜索过滤区域 --> <!-- 搜索过滤区域 -->
...@@ -89,7 +88,6 @@ ...@@ -89,7 +88,6 @@
<!-- 通讯录列表 --> <!-- 通讯录列表 -->
<div <div
ref="mailListScroll"
v-scroll="loadMoreMail" v-scroll="loadMoreMail"
class="contact-list" class="contact-list"
> >
......
...@@ -5,28 +5,44 @@ ...@@ -5,28 +5,44 @@
<p class="loginContentTitle">选择客服:</p> <p class="loginContentTitle">选择客服:</p>
<div class="loginContentInput rowFlex alignCenter"> <div class="loginContentInput rowFlex alignCenter">
<el-select v-model="cser_user_id" filterable placeholder="请选择客服"> <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" <el-option
:value="item.zq_user_id"> v-for="item in userList"
:key="item.zq_user_id"
clearable
:label="item.name"
:value="item.zq_user_id"
>
</el-option> </el-option>
</el-select> </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> </div>
</div> </div>
</template> </template>
<script> <script>
import * as ww from '@wecom/jssdk' import * as ww from '@wecom/jssdk';
import { getOrganization, getAuthUser, getSignature,getUserList,cserSelected } from '@/api/user' import {
import Cookies from 'js-cookie' getOrganization,
import { getParams } from '@/utils/index' getAuthUser,
import { mapMutations, mapState } from 'vuex' getSignature,
import { getToken, setToken } from '@/utils/auth' getUserList,
import jsApiList from '@/utils/jsApiList' 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 { export default {
name: 'login', name: 'login',
components: { components: {},
},
data() { data() {
return { return {
wecomUserInfo: null, // 企微用户信息 wecomUserInfo: null, // 企微用户信息
...@@ -40,124 +56,155 @@ export default { ...@@ -40,124 +56,155 @@ export default {
hoveredOrg: null, hoveredOrg: null,
showRefresh: false, // 控制刷新按钮显示 showRefresh: false, // 控制刷新按钮显示
qrLoading: false, // 控制二维码 loading 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: '', DDTestUrl: '',
token: getToken(), token: getToken(),
userList: [], userList: [],
cser_user_id: null, cser_user_id: null,
} };
}, },
async mounted() { async mounted() {
this.$nextTick(() => { this.$nextTick(() => {
this.initLogin() this.initLogin();
}) });
}, },
computed: { computed: {
...mapState('user', ['corp_id']) ...mapState('user', ['corp_id']),
}, },
methods: { 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() { async initLogin() {
const urlParams = getParams(); const urlParams = getParams();
const userid = Cookies.get('userid'); const userid = Cookies.get('userid');
if (this.token && userid) { // 已经钉钉扫码过 重新获取授权 获取签名 注册企微js-sdk if (this.token && userid) {
this.getUserList(userid) // 已经钉钉扫码过 重新获取授权 获取签名 注册企微js-sdk
this.getUserList(userid);
await this.getSignature(); await this.getSignature();
} else if(!userid) { } else if (!userid) {
await this.startWeComSilentAuth(); await this.startWeComSilentAuth();
}else if(!this.token){ } else if (!this.token) {
this.getUserList(userid) this.getUserList(userid);
} }
}, },
async getUserList(userid) { async getUserList(userid) {
this.urlParams = getParams(); 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;
const res = await getUserList({ userid: userid,corp_id:corp_id }); const res = await getUserList({ userid: userid, corp_id: corp_id });
this.userList = res.data this.userList = res.data;
}, },
async userStartLogin(){ async userStartLogin() {
if(!this.cser_user_id){ if (!this.cser_user_id) {
this.$message.error('请选择客服人员') this.$message.error('请选择客服人员');
return return;
} }
const cser_user = this.userList.find(item => item.zq_user_id === this.cser_user_id) const cser_user = this.userList.find(
const corp_id = Cookies.get('corp_id') (item) => item.zq_user_id === this.cser_user_id
const userid = Cookies.get('userid') );
this.cacheCser(cser_user.zq_user_id, cser_user.name) const corp_id = Cookies.get('corp_id');
const userid = Cookies.get('userid');
this.cacheCser(cser_user.zq_user_id, cser_user.name);
try { try {
const res = await cserSelected({ cser_id: cser_user.zq_user_id, corp_id: corp_id,userid:userid }); const res = await cserSelected({
console.log(res, '选择客服人员登录') cser_id: cser_user.zq_user_id,
if(res.status_code === 1 && res.data.tokens ){ corp_id: corp_id,
userid: userid,
});
console.log(res, '选择客服人员登录');
if (res.status_code === 1 && res.data.tokens) {
this.$message({ this.$message({
type: 'warning', type: 'warning',
message: `当前【${cser_user.name}】已上线,下班后请记得点击下线哦~`, message: `当前【${cser_user.name}】已上线,下班后请记得点击下线哦~`,
duration: 3 * 1000 duration: 3 * 1000,
}) });
setTimeout(() => { setTimeout(() => {
this.handleDingCallback(res.data.tokens ) this.handleDingCallback(res.data.tokens);
}, 2000) }, 2000);
}else{ } else {
this.$message.error(res.msg) this.$message.error(res.msg);
setTimeout(() => { setTimeout(() => {
window.location.href = window.location.origin + '/company_app/index.html?corp_id=' + corp_id + '&msg=cser_error' window.location.href =
}, 5000) window.location.origin +
'/company_app/index.html?corp_id=' +
corp_id +
'&msg=cser_error';
}, 5000);
} }
} catch (error) { } catch (error) {
console.log(error, '选择客服人员登录失败') console.log(error, '选择客服人员登录失败');
this.$message.error(error.msg) this.$message.error(error.msg);
setTimeout(() => { setTimeout(() => {
window.location.href = window.location.origin + '/company_app/index.html?corp_id=' + corp_id + '&msg=cser_error' window.location.href =
}, 5000) window.location.origin +
'/company_app/index.html?corp_id=' +
corp_id +
'&msg=cser_error';
}, 5000);
} }
}, },
loginConfirm(){ loginConfirm() {
const cser_user = this.userList.find(item => item.zq_user_id === this.cser_user_id) const cser_user = this.userList.find(
if (!cser_user) { (item) => item.zq_user_id === this.cser_user_id
this.$message.error('请选择客服') );
return this.$confirm(
} `确认登录上线吗,上线后所有会话都会归属到客服【${cser_user.name}】`,
this.$confirm(`确认登录上线吗,上线后所有会话都会归属到客服【${cser_user.name}】`, '提示', { '提示',
{
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning',
}).then(() => { }
this.userStartLogin() )
}).catch(() => { .then(() => {
this.$message.info('已取消登录') this.userStartLogin();
}) })
.catch(() => {
this.$message.info('已取消登录');
});
}, },
// 设置缓存 // 设置缓存
cacheCorp_id(corp_id) { cacheCorp_id(corp_id) {
Cookies.set('corp_id', corp_id, { expires: 7 }) Cookies.set('corp_id', corp_id, { expires: 30 });
this.set_corp_id(corp_id) this.set_corp_id(corp_id);
}, },
cacheuserid(userid) { cacheuserid(userid) {
Cookies.set('userid', userid, { expires: 7 }) Cookies.set('userid', userid, { expires: 30 });
this.set_userid(userid) this.set_userid(userid);
}, },
cacheCser(cser_id, cser_name) { cacheCser(cser_id, cser_name) {
Cookies.set('cser_id', cser_id, { expires: 7 }) Cookies.set('cser_id', cser_id, { expires: 30 });
Cookies.set('cser_name', cser_name, { expires: 7 }) Cookies.set('cser_name', cser_name, { expires: 30 });
this.set_cser_info({ this.set_cser_info({
cser_id: cser_id, cser_id: cser_id,
cser_name: cser_name cser_name: cser_name,
}) });
this.set_cser_id(cser_id) this.set_cser_id(cser_id);
this.set_cser_name(cser_name) this.set_cser_name(cser_name);
}, },
cacheSignData(signData) { cacheSignData(signData) {
Cookies.set('signData', JSON.stringify(signData), { expires: 7 }) Cookies.set('signData', JSON.stringify(signData), { expires: 30 });
this.set_signData(signData) this.set_signData(signData);
}, },
// 进入的页面地址是 https://companywx.jianshuwenhua.com/company_app/index.html?corp_id=wweaefe716636df3d1 // 进入的页面地址是 https://companywx.jianshuwenhua.com/company_app/index.html?corp_id=wweaefe716636df3d1
// 1. 企微静默授权 // 1. 企微静默授权
async startWeComSilentAuth() { async startWeComSilentAuth() {
this.urlParams = getParams(); 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) { if (!corp_id) {
this.$message.error('当前客服号信息异常,请切换会话后重试') this.$message.error('当前客服号信息异常,请切换会话后重试');
return return;
} }
// 确定是第一次进入页面 没有 code 和 state // 确定是第一次进入页面 没有 code 和 state
if (!this.urlParams.code && !this.urlParams.state) { if (!this.urlParams.code && !this.urlParams.state) {
...@@ -168,61 +215,72 @@ export default { ...@@ -168,61 +215,72 @@ export default {
return; return;
} }
// 用code // 用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.status_code === 1) {
if(res.data.userid){ if (res.data.userid) {
this.cacheuserid(res.data.userid) this.cacheuserid(res.data.userid);
this.getUserList(res.data.userid) this.getUserList(res.data.userid);
}else{ } else {
this.$message.error('获取用户id失败') this.$message.error('获取用户id失败');
return return;
} }
} else { } else {
console.log('获取useid失败', res) console.log('获取useid失败', res);
// 错误处理 // 错误处理
} }
}, },
async getSignature() { async getSignature() {
console.log('获取签名', window.location.href) console.log('获取签名', window.location.href);
const corp_id = Cookies.get('corp_id') const corp_id = Cookies.get('corp_id');
try { 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) { if (res.status_code === 1) {
this.signData = res.data this.signData = res.data;
this.cacheSignData(res.data) this.cacheSignData(res.data);
try { try {
this.registerWeComSDK(); this.registerWeComSDK();
} catch (err) { } catch (err) {
console.log(err, '初始化sdk 失败') console.log(err, '初始化sdk 失败');
} }
} }
} catch (err) { } catch (err) {
console.log(err, '获取签名失败') console.log(err, '获取签名失败');
window.location.href = window.location.origin + '/company_app/index.html?corp_id=' + corp_id + '&msg=signerror' window.location.href =
window.location.origin +
'/company_app/index.html?corp_id=' +
corp_id +
'&msg=signerror';
} }
}, },
getCurExternalContact() { getCurExternalContact() {
this.$ww.getCurExternalContact({ this.$ww.getCurExternalContact({
success: (res) => { success: (res) => {
if (res.err_msg === "getCurExternalContact:ok") { if (res.err_msg === 'getCurExternalContact:ok') {
console.log(res, '重新进入获取企微外部联系人') console.log(res, '重新进入获取企微外部联系人');
this.set_external_userid(res.userId) this.set_external_userid(res.userId);
// 确保 Vuex 状态更新后再跳转 // 确保 Vuex 状态更新后再跳转
this.$nextTick(() => { this.$nextTick(() => {
this.$router.replace('/') this.$router.replace('/');
console.log(window.location.href, 'window.location.hrefuserInfo') console.log(window.location.href, 'window.location.hrefuserInfo');
}) });
} }
}, },
fail: (err) => { fail: (err) => {
console.log(err, '获取企微外部联系人失败') console.log(err, '获取企微外部联系人失败');
// 错误处理 // 错误处理
} },
}); });
}, },
// 2. 注册企微JS-SDK // 2. 注册企微JS-SDK
registerWeComSDK() { registerWeComSDK() {
console.log('删除企业签名', 1231) console.log('删除企业签名', 1231);
this.$ww.register({ this.$ww.register({
corpId: Cookies.get('corp_id'), corpId: Cookies.get('corp_id'),
agentId: this.signData.agent_id, agentId: this.signData.agent_id,
...@@ -233,58 +291,60 @@ export default { ...@@ -233,58 +291,60 @@ export default {
// signature: this.signData.corp_signature, // signature: this.signData.corp_signature,
// }), // }),
// 只用到应用的 api 可以只进行应用的签名 // 只用到应用的 api 可以只进行应用的签名
getAgentConfigSignature: () => Promise.resolve({ getAgentConfigSignature: () =>
Promise.resolve({
nonceStr: this.signData.nonce_str, nonceStr: this.signData.nonce_str,
timestamp: this.signData.signature_time, timestamp: this.signData.signature_time,
signature: this.signData.agent_signature, signature: this.signData.agent_signature,
}), }),
onAgentConfigSuccess: (res) => { onAgentConfigSuccess: (res) => {
console.log('注册成功可以调用企微 js-sdk', res) console.log('注册成功可以调用企微 js-sdk', res);
// 注册成功后不立即获取外部联系人,等钉钉扫码后再获取 // 注册成功后不立即获取外部联系人,等钉钉扫码后再获取
this.getCurExternalContact() this.getCurExternalContact();
}, },
onAgentConfigFail: (err) => { onAgentConfigFail: (err) => {
console.log('注册失败不能使用企微js-sdk', err) console.log('注册失败不能使用企微js-sdk', err);
// 错误处理123 // 错误处理123
} },
}); });
}, },
// 3. 获取组织列表并选取默认组织 // 3. 获取组织列表并选取默认组织
async initOrganization() { async initOrganization() {
const res = await getOrganization(); const res = await getOrganization();
if (res.data.status_code === 1) { 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(); this.initCurrentApp();
} }
}, },
initCurrentApp() { initCurrentApp() {
const currentApp = this.orgList.find( 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. 钉钉扫码回调页面处理 // 7. 钉钉扫码回调页面处理
async handleDingCallback(token) { async handleDingCallback(token) {
// 在这里处理钉钉扫码成功的回调 // 在这里处理钉钉扫码成功的回调
const corp_id = Cookies.get('corp_id') const corp_id = Cookies.get('corp_id');
if (token && token != 'undefined') { if (token && token != 'undefined') {
setToken(token) setToken(token);
this.set_token(token) this.set_token(token);
// 获取签名 // 获取签名
await this.getSignature(); await this.getSignature();
} else { } 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> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -336,7 +396,7 @@ export default { ...@@ -336,7 +396,7 @@ export default {
i { i {
line-height: 40px; line-height: 40px;
font-size: 26px; font-size: 26px;
color: #3491FA; color: #3491fa;
cursor: pointer; cursor: pointer;
} }
} }
...@@ -366,7 +426,7 @@ export default { ...@@ -366,7 +426,7 @@ export default {
width: 40px; width: 40px;
height: 40px; height: 40px;
border: 4px solid #e0e0e0; border: 4px solid #e0e0e0;
border-top: 4px solid #3491FA; border-top: 4px solid #3491fa;
border-radius: 50%; border-radius: 50%;
animation: spin 1s linear infinite; animation: spin 1s linear infinite;
} }
......
...@@ -41,8 +41,8 @@ ...@@ -41,8 +41,8 @@
<div class="filterList"> <div class="filterList">
<el-form class="filterList" label-position="top"> <el-form class="filterList" label-position="top">
<el-form-item label="订单号:"> <el-form-item label="订单号:">
<el-input v-model="inputValue" placeholder="请输入订单号/交易单号" prefix-icon="el-icon-search" <el-input v-model="inputValue" placeholder="请输入订单号/交易单号" prefix-icon="el-icon-search" style="width: 100%"
style="width: 100%" clearable @change="searchInput"></el-input> clearable @change="searchInput"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="支付方式:"> <el-form-item label="支付方式:">
...@@ -174,7 +174,7 @@ import searchSelect from './components/order/searchUser.vue' ...@@ -174,7 +174,7 @@ import searchSelect from './components/order/searchUser.vue'
import orderRefund from './components/order/orderRefund.vue' import orderRefund from './components/order/orderRefund.vue'
import refundLog from './components/order/refundLog.vue' import refundLog from './components/order/refundLog.vue'
import { throttle } from '@/utils' import { throttle } from '@/utils'
import sanjiaoxing from '@/assets/icon/sanjiaoxing.svg' import sanjiaoxing from '@/assets/icon/svg/sanjiaoxing.svg'
import noContent from '@/components/noContent.vue' import noContent from '@/components/noContent.vue'
export default { export default {
name: 'orderList', name: 'orderList',
...@@ -402,7 +402,7 @@ export default { ...@@ -402,7 +402,7 @@ export default {
}) })
}, },
requestOrderList: throttle(function (msg) { requestOrderList: throttle(function (msg) {
console.log(12313, '开始展示',this.isloadMore) console.log(12313, '开始展示', this.isloadMore)
if (this.accountSelect == '') { if (this.accountSelect == '') {
this.$message.warning('暂无关联的账号,请先去关联账号!') this.$message.warning('暂无关联的账号,请先去关联账号!')
return false return false
...@@ -489,16 +489,19 @@ export default { ...@@ -489,16 +489,19 @@ export default {
height: 100%; height: 100%;
overflow: auto; overflow: auto;
overflow-x: hidden; overflow-x: hidden;
::v-deep .el-tabs{
::v-deep .el-tabs {
height: auto; height: auto;
} }
::v-deep .el-tab-pane{ ::v-deep .el-tab-pane {
height: auto; height: auto;
} }
::v-deep .el-tabs__content{
::v-deep .el-tabs__content {
height: auto !important; height: auto !important;
} }
.order-info-content { .order-info-content {
width: 100%; width: 100%;
height: calc(100% - 60px); height: calc(100% - 60px);
......
<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>
<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;
} 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"
>
<span class="truncate flex-1">{{ pushLanguageTechnique }}</span>
<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"
: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';
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() {
try {
this.isRefresh = true;
const { data } = await getGenerateProcedureApi({
...this.item,
...this.nowGameUserInfo,
});
this.pushLanguageTechnique = data.content;
} catch (error) {
} finally {
this.isRefresh = false;
}
},
async copyText() {
try {
await navigator.clipboard.writeText(this.pushLanguageTechnique);
this.$message.success('复制成功');
} catch (err) {
console.error('复制失败:', err);
}
},
refreshTag() {
this.queryGenerateProcedure();
},
},
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;
}
</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> <template>
<div class="roleTab"> <div class="roleTab">
<el-tabs v-model="roleActive"> <el-tabs v-model="roleActive">
<el-tab-pane label="角色信息" name="roleInfo"> <el-tab-pane label="角色信息" name="roleInfo">
<roleInfoPanel v-if="roleActive === 'roleInfo'" :chatUserDetails="chatUserInfo" /> <roleInfoPanel v-if="roleActive === 'roleInfo'" :chatUserDetails="chatUserInfo" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="举报信息" name="report">
<report v-if="roleActive === 'report'" />
</el-tab-pane>
<el-tab-pane label="申诉记录" name="approval"> <el-tab-pane label="申诉记录" name="approval">
<approval v-if="roleActive === 'approval'" /> <approval v-if="roleActive === 'approval'" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="违规记录" name="violation">
<violationRecord v-if="roleActive === 'violation'" />
</el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</template> </template>
<script> <script>
import roleInfoPanel from './components/roleInfo/roleInfoPanel.vue' import roleInfoPanel from './components/roleInfo/roleInfoPanel.vue'
import report from './components/roleInfo/report.vue'
import approval from './components/roleInfo/approval.vue' import approval from './components/roleInfo/approval.vue'
import { mapState } from 'vuex' import { mapState } from 'vuex'
import violationRecord from '@/views/ViolationRecord.vue';
export default { export default {
name: 'roleInfo', name: 'roleInfo',
components: { components: {
roleInfoPanel, roleInfoPanel,
approval, approval,
report violationRecord,
}, },
computed: { computed: {
...mapState('game', ['chatUserInfo']) ...mapState('game', ['chatUserInfo'])
......
...@@ -18,7 +18,8 @@ ...@@ -18,7 +18,8 @@
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
<!-- 运营任务 --> <!-- 运营任务 -->
<div class="taskListContent" v-if="taskForm.type !== 'user_task' && taskForm.type !== 'account_task'" v-scroll="paperScroll" > <div class="taskListContent" v-if="taskForm.type !== 'user_task' && taskForm.type !== 'account_task'"
v-scroll="paperScroll">
<el-form ref="taskForm" :model="taskForm" class="taskForm" label-position="top" label-width="85px"> <el-form ref="taskForm" :model="taskForm" class="taskForm" label-position="top" label-width="85px">
<!-- 运营任务 --> <!-- 运营任务 -->
<div v-if="taskForm.type == 1" class="taskFormItem"> <div v-if="taskForm.type == 1" class="taskFormItem">
...@@ -116,14 +117,14 @@ ...@@ -116,14 +117,14 @@
</span> </span>
</p> </p>
</div> </div>
<div class="taskListScroll" v-loading="loading" <div class="taskListScroll" v-loading="loading" :class="taskForm.type != 1 ? 'taskListScrollActive' : ''">
:class="taskForm.type != 1 ? 'taskListScrollActive' : ''">
<!-- 运营任务 --> <!-- 运营任务 -->
<div v-if="taskForm.type == 1" class="scrollMain"> <div v-if="taskForm.type == 1" class="scrollMain">
<div v-for="(item, index) in taskList" :key="index" class="chatListItem columnCenter spaceBetween" <div v-for="(item, index) in taskList" :key="index" class="chatListItem columnCenter spaceBetween"
:class="item.id === taskDetails.id ? 'chatListItemActive' : ''" @click="selectTaskItem(item)"> :class="item.id === taskDetails.id ? 'chatListItemActive' : ''" @click="selectTaskItem(item)">
<div class="top rowFlex spaceBetween"> <div class="top rowFlex spaceBetween">
<div v-if="item.username && item.username.split('\n') && item.username.split('\n').length > 0" class="value"> <div v-if="item.username && item.username.split('\n') && item.username.split('\n').length > 0"
class="value">
<div v-if="item.username.split('\n').length <= 1" class="rowFlex columnCenter"> <div v-if="item.username.split('\n').length <= 1" class="rowFlex columnCenter">
<div v-for="(items, indexs) in item.username.split('\n')" :key="indexs" <div v-for="(items, indexs) in item.username.split('\n')" :key="indexs"
class="rowFlex columnCenter userInfoStyle"> class="rowFlex columnCenter userInfoStyle">
...@@ -139,7 +140,9 @@ ...@@ -139,7 +140,9 @@
<span class="textHidden" style="max-width:150px;">{{ items }}</span> <span class="textHidden" style="max-width:150px;">{{ items }}</span>
</p> </p>
</div> </div>
<el-button slot="reference" type="text">{{ item.username && item.username.split("\n") && item.username.split("\n").length?item.username.split("\n").length : 0 <el-button slot="reference" type="text">{{ item.username &&
item.username.split("\n") &&
item.username.split("\n").length ?item.username.split("\n").length : 0
}}个</el-button> }}个</el-button>
</el-popover> </el-popover>
</div> </div>
...@@ -188,11 +191,11 @@ import mainGameSelect from '@/components/mainGame.vue' ...@@ -188,11 +191,11 @@ import mainGameSelect from '@/components/mainGame.vue'
import { removeDp } from '@/utils/index' import { removeDp } from '@/utils/index'
import selectDate from '@/components/selectDate.vue' import selectDate from '@/components/selectDate.vue'
import { formatNumber } from '@/utils/index' import { formatNumber } from '@/utils/index'
import shenpi1 from '@/assets/icon/shenpi1.svg' import shenpi1 from '@/assets/icon/svg/shenpi1.svg'
import shenpi2 from '@/assets/icon/shenpi2.svg' import shenpi2 from '@/assets/icon/svg/shenpi2.svg'
import shenpi3 from '@/assets/icon/shenpi3.svg' import shenpi3 from '@/assets/icon/svg/shenpi3.svg'
import shenpi4 from '@/assets/icon/shenpi4.svg' import shenpi4 from '@/assets/icon/svg/shenpi4.svg'
import shenpi5 from '@/assets/icon/shenpi5.svg' import shenpi5 from '@/assets/icon/svg/shenpi5.svg'
import noContent from '@/components/noContent.vue' import noContent from '@/components/noContent.vue'
import userTask from './components/taskList/uesrTask.vue' import userTask from './components/taskList/uesrTask.vue'
import taskDetails from './components/taskList/taskDetails.vue' import taskDetails from './components/taskList/taskDetails.vue'
...@@ -665,14 +668,17 @@ export default { ...@@ -665,14 +668,17 @@ export default {
::v-deep .el-tabs { ::v-deep .el-tabs {
height: auto; height: auto;
} }
.taskListContent { .taskListContent {
width: 100%; width: 100%;
height: calc(100% - 40px); height: calc(100% - 40px);
overflow-y: auto; overflow-y: auto;
} }
.taskFormItem { .taskFormItem {
margin-top: 10px; margin-top: 10px;
} }
.taskForm { .taskForm {
::v-deep .el-form-item { ::v-deep .el-form-item {
margin-bottom: 5px; margin-bottom: 5px;
...@@ -754,11 +760,13 @@ export default { ...@@ -754,11 +760,13 @@ export default {
.taskListScroll { .taskListScroll {
width: 100%; width: 100%;
.scrollMain { .scrollMain {
width: 100%; width: 100%;
height: auto; height: auto;
margin-bottom: 50px; margin-bottom: 50px;
padding: 0 10px; padding: 0 10px;
//举报申请 //举报申请
.reportItem { .reportItem {
padding: 10px; padding: 10px;
......
<template> <template>
<div class="info-tab-content"> <div class="info-tab-content">
<div <div class="userDetailsPanel columnFlex">
class="userDetailsPanel columnFlex"
>
<div class="content" v-loading="viewLoading"> <div class="content" v-loading="viewLoading">
<div v-if="chatUserDetails.is_phishing_account==1" class="warnText"> <div v-if="chatUserDetails.is_phishing_account == 1" class="warnText">
<p>高风险玩家,请立即通知组长!!!!</p> <p>高风险玩家,请立即通知组长!!!!</p>
<p>①千万不能推转游!!不要发送违禁词汇!!不要发送礼包和告知任何礼包信息!!</p> <p>①千万不能推转游!!不要发送违禁词汇!!不要发送礼包和告知任何礼包信息!!</p>
<p>②不能以任何形式推送APP/网页链接,也不可承认有APP/网页端口!!</p> <p>②不能以任何形式推送APP/网页链接,也不可承认有APP/网页端口!!</p>
</div> </div>
<div <div v-if="change_appraisal" class="warnText">
v-if="change_appraisal"
class="warnText"
>
<p> 钓鱼号 禁止转端通知组长!</p> <p> 钓鱼号 禁止转端通知组长!</p>
</div> </div>
<div <div v-else-if="gameUserInfo.exp_ip" class="warnText">
v-else-if="gameUserInfo.exp_ip"
class="warnText"
>
<p>高风险用户,禁止转端 !!!</p> <p>高风险用户,禁止转端 !!!</p>
</div> </div>
<div class="cser_info"> <div class="cser_info">
...@@ -28,50 +20,40 @@ ...@@ -28,50 +20,40 @@
<!-- 添加客服状态显示及按钮 --> <!-- 添加客服状态显示及按钮 -->
<div class="cser_status"> <div class="cser_status">
<div class="status-actions"> <div class="status-actions">
<el-button type="danger" v-if="clientStatus !== 'offline'" style="margin-left: 0px;" size="mini" @click="logout">下线</el-button> <el-button type="danger" v-if="clientStatus !== 'offline'" style="margin-left: 0px;" size="mini"
@click="logout">下线</el-button>
<!-- 休息中状态显示结束休息按钮 --> <!-- 休息中状态显示结束休息按钮 -->
<el-button v-if="clientStatus === 'rest'" type="primary" size="mini" @click="handleFinishRest">结束休息</el-button> <el-button v-if="clientStatus === 'rest'" type="primary" size="mini"
@click="handleFinishRest">结束休息</el-button>
<!-- 在线状态显示开始休息按钮 --> <!-- 在线状态显示开始休息按钮 -->
<el-tooltip v-if="clientStatus === 'online'" content="午休或者临时有事可点击休息" placement="top"> <el-tooltip v-if="clientStatus === 'online'" content="午休或者临时有事可点击休息" placement="top">
<el-button type="warning" size="mini" @click="handleStartRest" >开始休息</el-button> <el-button type="warning" size="mini" @click="handleStartRest">开始休息</el-button>
</el-tooltip> </el-tooltip>
<!-- 发送评价按钮 --> <!-- 发送评价按钮 -->
<el-button type="primary" style="margin-left: 0px;" size="mini" @click="handleSendComment">发送评价</el-button> <el-button type="primary" style="margin-left: 0px;" size="mini"
@click="handleSendComment">发送评价</el-button>
</div> </div>
</div> </div>
</div> </div>
<!-- 会话内容存档状态 --> <!-- 会话内容存档状态 -->
<div class="archive-status" v-if="agreeStatus!=='Agree' || !hasPermit"> <div class="archive-status" v-if="agreeStatus !== 'Agree' || !hasPermit">
<p v-if="agreeStatus!=='Agree'">当前微信用户未开启会话内容存档</p> <p v-if="agreeStatus !== 'Agree'">当前微信用户未开启会话内容存档</p>
<p v-if="!hasPermit">当前客服号未授权开启会话内容存档</p> <p v-if="!hasPermit">当前客服号未授权开启会话内容存档</p>
</div> </div>
<div class="item rowFlex"> <div class="item rowFlex">
<!-- 公共的信息 --> <!-- 公共的信息 -->
<el-image <el-image fit="fill" draggable="false" style="-webkit-user-drag: none" :src="chatUserDetails.avatar"
fit="fill" class="tableImage"></el-image>
draggable="false"
style="-webkit-user-drag: none"
:src="chatUserDetails.avatar"
class="tableImage"
></el-image>
<div class="columnFlex"> <div class="columnFlex">
<div <div class="rowFlex" style="margin-bottom: 3px">
class="rowFlex" <p class="text" style="font-weight: 600">
style="margin-bottom: 3px"
>
<p
class="text"
style="font-weight: 600"
>
{{ chatUserDetails.name }} {{ chatUserDetails.name }}
</p> </p>
<span v-if="chatUserDetails.add_way_text" style="color: #09b159; margin-left: 10px">@{{ chatUserDetails.add_way_text }}</span> <span v-if="chatUserDetails.add_way_text" style="color: #09b159; margin-left: 10px">@{{
chatUserDetails.add_way_text }}</span>
</div> </div>
<!-- 游戏模块特有 --> <!-- 游戏模块特有 -->
<div <div v-if="accountSelect && accountSelect !== ''" style="margin-top: 3px">
v-if="accountSelect && accountSelect !== ''"
style="margin-top: 3px"
>
<el-button-group> <el-button-group>
<el-button size="mini" @click="zyouUnBindConfirm">解绑</el-button> <el-button size="mini" @click="zyouUnBindConfirm">解绑</el-button>
<!-- <el-button size="mini" @click="autoResetPassword">修改密码</el-button> <!-- <el-button size="mini" @click="autoResetPassword">修改密码</el-button>
...@@ -85,11 +67,7 @@ ...@@ -85,11 +67,7 @@
<div class="item rowFlex columnCenter"> <div class="item rowFlex columnCenter">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
<span class="label" style="min-width: 45px;">备注:</span> <span class="label" style="min-width: 45px;">备注:</span>
<p <p v-if="!showInputRemark" class="text" style="max-width: 170px;">
v-if="!showInputRemark"
class="text"
style="max-width: 170px;"
>
{{ {{
chatUserDetails.remark && chatUserDetails.remark != "" chatUserDetails.remark && chatUserDetails.remark != ""
? chatUserDetails.remark ? chatUserDetails.remark
...@@ -97,16 +75,9 @@ ...@@ -97,16 +75,9 @@
}} }}
</p> </p>
</div> </div>
<el-input <el-input v-if="showInputRemark" v-model="showInputRemarkValue" class="showInputRemarkInput" type="textarea"
v-if="showInputRemark" @change="handleInputRemark" @blur="showInputRemark = false"></el-input>
v-model="showInputRemarkValue" <i class="el-icon-edit icon" style="font-size: 14px" @click="editRemark"></i>
class="showInputRemarkInput"
type="textarea"
@change="handleInputRemark"
@blur="showInputRemark = false"
></el-input>
<i class="el-icon-edit icon" style="font-size: 14px"
@click="editRemark"></i>
</div> </div>
<div> <div>
...@@ -138,59 +109,35 @@ ...@@ -138,59 +109,35 @@
</div> </div>
</div> --> </div> -->
<!-- 游戏业务的账号信息 --> <!-- 游戏业务的账号信息 -->
<gameDetails <gameDetails v-if="gameUserInfo.username && !viewLoading" :chat-user-details="chatUserDetails"
v-if="gameUserInfo.username && !viewLoading" :game-user-info="gameUserInfo" @changeAppraisal="changeAppraisal" />
:chat-user-details="chatUserDetails"
:game-user-info="gameUserInfo"
@changeAppraisal="changeAppraisal"
/>
<!-- 游戏标签 --> <!-- 游戏标签 -->
<div <div class="item rowFlex columnCenter spaceBetween tagsLost">
class="item rowFlex columnCenter spaceBetween tagsLost"
>
<div class="rowFlex"> <div class="rowFlex">
<span class="label">关联标签:</span> <span class="label">关联标签:</span>
<div <div v-if="
v-if="
chatUserDetails.tag_group && chatUserDetails.tag_group &&
chatUserDetails.tag_group.length > 0 chatUserDetails.tag_group.length > 0
" ">
>
<!-- 第一个标签组的所有标签 --> <!-- 第一个标签组的所有标签 -->
<el-tag <el-tag v-for="(items, indexs) in chatUserDetails.tag_group[0].tag" :key="indexs">{{ items.name
v-for="(items, indexs) in chatUserDetails.tag_group[0].tag" }}</el-tag>
:key="indexs"
>{{ items.name }}</el-tag>
<!-- 如果有多个标签组,显示+n --> <!-- 如果有多个标签组,显示+n -->
<el-popover <el-popover v-if="chatUserDetails.tag_group.length > 1" placement="top" trigger="hover"
v-if="chatUserDetails.tag_group.length > 1" popper-class="tag-popover">
placement="top"
trigger="hover"
popper-class="tag-popover"
>
<div class="groups-popover-content" style="max-height: 600px;overflow-y: auto;"> <div class="groups-popover-content" style="max-height: 600px;overflow-y: auto;">
<div <div v-for="(group, groupIndex) in chatUserDetails.tag_group.slice(1)" :key="groupIndex"
v-for="(group, groupIndex) in chatUserDetails.tag_group.slice(1)" class="group-item">
:key="groupIndex" <el-tag v-for="(tagItem, tagIndex) in group.tag" :key="tagIndex" style="margin-right: 10px;">{{
class="group-item" tagItem.name }}</el-tag>
>
<el-tag
v-for="(tagItem, tagIndex) in group.tag"
:key="tagIndex"
style="margin-right: 10px;"
>{{ tagItem.name }}</el-tag>
</div> </div>
</div> </div>
<span <span slot="reference" class="tag-more">+{{ chatUserDetails.tag_group.length - 1 }}</span>
slot="reference"
class="tag-more"
>+{{ chatUserDetails.tag_group.length - 1 }}</span>
</el-popover> </el-popover>
</div> </div>
</div> </div>
<i class="el-icon-edit icon" style="font-size: 14px;margin-right: 10px;" <i class="el-icon-edit icon" style="font-size: 14px;margin-right: 10px;" @click="editTags"></i>
@click="editTags"></i>
</div> </div>
<!-- 共享信息 --> <!-- 共享信息 -->
<shareInfo :chat-user-details="chatUserDetails" /> <shareInfo :chat-user-details="chatUserDetails" />
...@@ -198,35 +145,26 @@ ...@@ -198,35 +145,26 @@
</div> </div>
</div> </div>
<!-- 修改手机号 --> <!-- 修改手机号 -->
<changePhone <changePhone :show.sync="changePhone" :phone.sync="gameUserInfo.mobile" title="修改手机号" width="350px" />
:show.sync="changePhone"
:phone.sync="gameUserInfo.mobile"
title="修改手机号"
width="350px"
/>
<!-- 修改标签 --> <!-- 修改标签 -->
<selectTag <selectTag v-if="showTag" :show.sync="showTag" :checkbox="true" :check-list="chatUserDetails.tag_group || []"
v-if="showTag" @submit="selectTags" />
:show.sync="showTag"
:checkbox="true"
:check-list="chatUserDetails.tag_group || []"
@submit="selectTags"
/>
</div> </div>
</template> </template>
<script> <script>
import { mapState, mapMutations, mapActions } from 'vuex' import { mapState, mapMutations, mapActions } from 'vuex'
import gameDetails from './gameInfo/gameUserInfo.vue' import gameDetails from './gameInfo/gameUserInfo.vue'
import shareInfo from './shareInfo.vue' import shareInfo from './shareInfo.vue'
import changePhone from './changePhone.vue' import changePhone from './changePhone.vue'
import watchMember from '@/mixins/watchMember' import watchMember from '@/mixins/watchMember'
import { autoResetPassword,bindUserSelfAdd } from '@/api/game' import { autoResetPassword, bindUserSelfAdd } from '@/api/game'
import { memberBindCser,editUser,zyouUnBind } from '@/api/works' import { memberBindCser, editUser, zyouUnBind } from '@/api/works'
import selectTag from '@/components/selectTag.vue' import selectTag from '@/components/selectTag.vue'
import { getClientStatus, remarkSessionIntelTag, finishRest, client_session_rest, checkSingleAgree, checkUserPermit, sendComment, logout } from '@/api/user.js' import { getClientStatus, remarkSessionIntelTag, finishRest, client_session_rest, checkSingleAgree, checkUserPermit, sendComment, logout } from '@/api/user.js'
import { sendChatMessage } from '@/utils/index.js' import { sendChatMessage } from '@/utils/index.js'
import { getToken,removeToken } from '@/utils/auth' import { getToken, removeToken } from '@/utils/auth'
export default { import Cookies from 'js-cookie'
export default {
name: 'info', name: 'info',
components: { components: {
gameDetails, gameDetails,
...@@ -246,13 +184,13 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -246,13 +184,13 @@ import { getToken,removeToken } from '@/utils/auth'
// 备注相关 // 备注相关
showInputRemark: false, showInputRemark: false,
showInputRemarkValue: '', showInputRemarkValue: '',
change_appraisal:false, change_appraisal: false,
// 自定义列相关 // 自定义列相关
showInput: false, showInput: false,
showInputValue: '', showInputValue: '',
inputIndex: -1, inputIndex: -1,
changePhone:false, changePhone: false,
showTag:false, showTag: false,
// 新增状态数据 // 新增状态数据
agreeStatus: '', // 用户是否同意聊天内容存档:Agreen同意 Disagree不同意 agreeStatus: '', // 用户是否同意聊天内容存档:Agreen同意 Disagree不同意
hasPermit: false, // 客服号是否开启会话内容存档权限 hasPermit: false, // 客服号是否开启会话内容存档权限
...@@ -265,7 +203,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -265,7 +203,7 @@ import { getToken,removeToken } from '@/utils/auth'
'bindGameUserList', 'bindGameUserList',
'viewLoading' 'viewLoading'
]), ]),
...mapState('user', ['cser_info', 'cser_id', 'cser_name', 'corp_id', 'external_userid', 'userid', 'client_online_status','token']), ...mapState('user', ['cser_info', 'cser_id', 'cser_name', 'corp_id', 'external_userid', 'userid', 'client_online_status', 'token']),
// 客服状态文本 // 客服状态文本
clientStatusText() { clientStatusText() {
const statusMap = { const statusMap = {
...@@ -285,7 +223,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -285,7 +223,7 @@ import { getToken,removeToken } from '@/utils/auth'
// 初始化企业微信SDK // 初始化企业微信SDK
this.initializeWecom() this.initializeWecom()
// 获取客服状态和相关信息 // 获取客服状态和相关信息
if(this.cser_id && this.token){ if (this.cser_id && this.token) {
this.getInitialData() this.getInitialData()
} }
}, },
...@@ -303,8 +241,8 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -303,8 +241,8 @@ import { getToken,removeToken } from '@/utils/auth'
console.error('❌ 企业微信 SDK 初始化失败:', error) console.error('❌ 企业微信 SDK 初始化失败:', error)
} }
}, },
logout(){ logout() {
if(this.client_online_status === 'rest'){ if (this.client_online_status === 'rest') {
this.$message({ this.$message({
type: 'error', type: 'error',
message: '当前客服号处于休息状态,不能下线' message: '当前客服号处于休息状态,不能下线'
...@@ -324,24 +262,28 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -324,24 +262,28 @@ import { getToken,removeToken } from '@/utils/auth'
}) })
}) })
}, },
async userLogout(){ async userLogout() {
const data = { const data = {
userid: this.userid, userid: this.userid,
} }
const res = await logout(data) const res = await logout(data)
if(res.status_code === 1){ if (res.status_code === 1) {
this.$message({ this.$message({
type: 'success', type: 'success',
message: '下线成功' message: '下线成功'
}) })
removeToken() removeToken()
window.location.href = window.location.origin +'/company_app/index.html?corp_id='+this.corp_id Cookies.remove('external_userid')
}else{ Cookies.remove('userid')
window.location.href = window.location.origin + '/company_app/index.html?corp_id=' + this.corp_id
} else {
this.$message({ this.$message({
type: 'error', type: 'error',
message: '下线失败' message: '下线失败'
}) })
} }
}, },
// 获取初始数据 // 获取初始数据
...@@ -350,9 +292,9 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -350,9 +292,9 @@ import { getToken,removeToken } from '@/utils/auth'
// 1. 获取客服休息状态 // 1. 获取客服休息状态
const statusRes = await getClientStatus() const statusRes = await getClientStatus()
if (statusRes.status_code === 1) { if (statusRes.status_code === 1) {
if(statusRes.data.client_online_status === 'offline'){ if (statusRes.data.client_online_status === 'offline') {
removeToken() removeToken()
window.location.href = window.location.origin +'/company_app/index.html?corp_id='+this.corp_id window.location.href = window.location.origin + '/company_app/index.html?corp_id=' + this.corp_id
} }
this.$store.commit('user/set_client_online_status', statusRes.data.client_online_status) this.$store.commit('user/set_client_online_status', statusRes.data.client_online_status)
} }
...@@ -514,7 +456,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -514,7 +456,7 @@ import { getToken,removeToken } from '@/utils/auth'
if (res.status_code == 1) { if (res.status_code == 1) {
this.$message.success(res.msg) this.$message.success(res.msg)
const index = this.bindGameUserList.findIndex(item => item.member_id == this.accountSelect) const index = this.bindGameUserList.findIndex(item => item.member_id == this.accountSelect)
this.bindGameUserList.splice(index,1) this.bindGameUserList.splice(index, 1)
this.set_accountSelect(this.bindGameUserList[0].member_id) this.set_accountSelect(this.bindGameUserList[0].member_id)
} }
}) })
...@@ -639,40 +581,46 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -639,40 +581,46 @@ import { getToken,removeToken } from '@/utils/auth'
this.editUserInfo(params) this.editUserInfo(params)
}, },
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.info-tab-content{ .info-tab-content {
width: 100%; width: 100%;
height: 100%; height: 100%;
background: #fff; background: #fff;
} }
.userDetailsPanel { .userDetailsPanel {
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: #fff; background-color: #fff;
border-radius: 4px; border-radius: 4px;
overflow: hidden; overflow: hidden;
.warnText{
width:100%; .warnText {
height:auto; width: 100%;
height: auto;
font-weight: 600; font-weight: 600;
font-size: 18px; font-size: 18px;
p{
p {
color: #F56C6C; color: #F56C6C;
line-height: 25px; line-height: 25px;
} }
} }
.cser_name{
.cser_name {
font-size: 14px; font-size: 14px;
margin-bottom: 10px; margin-bottom: 10px;
} }
.cser_status { .cser_status {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
margin-bottom: 10px; margin-bottom: 10px;
font-size: 14px; font-size: 14px;
.status-actions { .status-actions {
display: flex; display: flex;
gap: 10px; gap: 10px;
...@@ -685,28 +633,33 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -685,28 +633,33 @@ import { getToken,removeToken } from '@/utils/auth'
background-color: #f8f8f8; background-color: #f8f8f8;
border-radius: 4px; border-radius: 4px;
font-size: 14px; font-size: 14px;
p { p {
margin: 5px 0; margin: 5px 0;
color: #F56C6C; color: #F56C6C;
font-weight: 600; font-weight: 600;
} }
} }
.detailsTitle { .detailsTitle {
height: 50px; height: 50px;
padding: 0 20px; padding: 0 20px;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
p { p {
font-size: 16px; font-size: 16px;
font-weight: 600; font-weight: 600;
} }
} }
.warnText{
width:100%; .warnText {
height:auto; width: 100%;
height: auto;
font-weight: 600; font-weight: 600;
font-size: 18px; font-size: 18px;
margin-bottom: 10px; margin-bottom: 10px;
p{
p {
color: #F56C6C; color: #F56C6C;
line-height: 25px; line-height: 25px;
} }
...@@ -717,6 +670,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -717,6 +670,7 @@ import { getToken,removeToken } from '@/utils/auth'
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
.item { .item {
margin-bottom: 15px; margin-bottom: 15px;
position: relative; position: relative;
...@@ -740,10 +694,11 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -740,10 +694,11 @@ import { getToken,removeToken } from '@/utils/auth'
} }
.noBind { .noBind {
color: #3491FA ; color: #3491FA;
cursor: pointer; cursor: pointer;
margin-right: 10px; margin-right: 10px;
} }
.icon { .icon {
cursor: pointer; cursor: pointer;
margin-left: 10px; margin-left: 10px;
...@@ -753,8 +708,10 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -753,8 +708,10 @@ import { getToken,removeToken } from '@/utils/auth'
.tags { .tags {
max-width: 200px; max-width: 200px;
.tagsItem { .tagsItem {
margin-bottom: 5px; margin-bottom: 5px;
.tag { .tag {
background-color: #f5f5f5; background-color: #f5f5f5;
color: #666; color: #666;
...@@ -767,6 +724,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -767,6 +724,7 @@ import { getToken,removeToken } from '@/utils/auth'
} }
} }
} }
.item:hover .icon { .item:hover .icon {
display: block; display: block;
} }
...@@ -843,6 +801,7 @@ import { getToken,removeToken } from '@/utils/auth' ...@@ -843,6 +801,7 @@ import { getToken,removeToken } from '@/utils/auth'
margin-bottom: 8px; margin-bottom: 8px;
padding-bottom: 8px; padding-bottom: 8px;
border-bottom: 1px dashed #eee; border-bottom: 1px dashed #eee;
&:last-child { &:last-child {
margin-bottom: 0; margin-bottom: 0;
padding-bottom: 0; padding-bottom: 0;
......
<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 @@ ...@@ -3,9 +3,14 @@
<!-- 智能标签 --> <!-- 智能标签 -->
<div class="item rowFlex columnCenter"> <div class="item rowFlex columnCenter">
<div class="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"> <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> </p>
</div> </div>
<el-popover <el-popover
...@@ -16,19 +21,24 @@ ...@@ -16,19 +21,24 @@
<i <i
slot="reference" slot="reference"
class="el-icon-refresh refreshList" class="el-icon-refresh refreshList"
:class="isRefresh?'refreshListActive':''" :class="isRefresh ? 'refreshListActive' : ''"
@click="refreshTag" @click="refreshTag"
></i> ></i>
</el-popover> </el-popover>
</div> </div>
<ZyouTag :game-user-info="gameUserInfo" :account-select="accountSelect" /> <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="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
<span class="label">账号:</span> <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>
</div> </div>
<!-- 营销面板 -->
<MarketingPanel />
<!-- 充值金额 --> <!-- 充值金额 -->
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
...@@ -39,7 +49,7 @@ ...@@ -39,7 +49,7 @@
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
<span class="label">是否易主:</span> <span class="label">是否易主:</span>
<p class="text">{{ change_user==1?'是':'否' }}</p> <p class="text">{{ change_user == 1 ? '是' : '否' }}</p>
<el-popconfirm <el-popconfirm
confirm-button-text="确定" confirm-button-text="确定"
cancel-button-text="取消" cancel-button-text="取消"
...@@ -62,7 +72,7 @@ ...@@ -62,7 +72,7 @@
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
<span class="label">白名单:</span> <span class="label">白名单:</span>
<p class="text">{{ change_name==1?'是':'否' }}</p> <p class="text">{{ change_name == 1 ? '是' : '否' }}</p>
<el-popconfirm <el-popconfirm
confirm-button-text="确定" confirm-button-text="确定"
cancel-button-text="取消" cancel-button-text="取消"
...@@ -84,7 +94,7 @@ ...@@ -84,7 +94,7 @@
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
<span class="label">异常账号:</span> <span class="label">异常账号:</span>
<p class="text">{{ change_risk==1?'是':'否' }}</p> <p class="text">{{ change_risk == 1 ? '是' : '否' }}</p>
<el-popconfirm <el-popconfirm
confirm-button-text="确定" confirm-button-text="确定"
cancel-button-text="取消" cancel-button-text="取消"
...@@ -92,7 +102,11 @@ ...@@ -92,7 +102,11 @@
title="是否切换账号异常状态" title="是否切换账号异常状态"
@confirm="changeRiskFn" @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> <p>
<i class="el-icon-sort-down"></i> <i class="el-icon-sort-down"></i>
</p> </p>
...@@ -103,22 +117,33 @@ ...@@ -103,22 +117,33 @@
</el-popconfirm> </el-popconfirm>
</div> </div>
</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"> <div class="rowFlex columnCenter">
<span class="label">等级:</span> <span class="label">等级:</span>
<p class="text">{{ gameUserInfo.role_info.role_level }}</p> <p class="text">{{ gameUserInfo.role_info.role_level }}</p>
</div> </div>
</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"> <div class="rowFlex columnCenter">
<span class="label">转端审核:</span> <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> </div>
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
<span class="label">近期是否被封禁:</span> <span class="label">近期是否被封禁:</span>
<p class="text">{{ gameUserInfo.is_banned==1?'是':'否' }}</p> <p class="text">{{ gameUserInfo.is_banned == 1 ? '是' : '否' }}</p>
</div> </div>
</div> </div>
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
...@@ -130,14 +155,22 @@ ...@@ -130,14 +155,22 @@
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
<span class="label">CP角色ID:</span> <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> </div>
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
<span class="label">是否愿意转端:</span> <span class="label">是否愿意转端:</span>
<p class="text"> <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="0"></el-radio>
<el-radio :label="1"></el-radio> <el-radio :label="1"></el-radio>
</el-radio-group> </el-radio-group>
...@@ -149,9 +182,19 @@ ...@@ -149,9 +182,19 @@
<span class="label">手机号:</span> <span class="label">手机号:</span>
<p v-if="!showUserMobile" class="text">{{ gameUserInfo.mobile }}</p> <p v-if="!showUserMobile" class="text">{{ gameUserInfo.mobile }}</p>
</div> </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>
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
...@@ -171,33 +214,75 @@ ...@@ -171,33 +214,75 @@
<p class="text">{{ gameUserInfo.last_login_os }}</p> <p class="text">{{ gameUserInfo.last_login_os }}</p>
</div> </div>
</div> </div>
<div v-if="gameUserInfo.service_wechat_number_info && gameUserInfo.service_wechat_number_info.length>0" class="item rowFlex columnCenter spaceBetween"> <div
<div class="rowFlex columnCenter" style="width:100%;"> 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> <span class="label">客服微信号:</span>
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
<!-- 显示第一个微信号 --> <!-- 显示第一个微信号 -->
<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> <p class="hidden wxName">
<span class="bradge">{{ gameUserInfo.service_wechat_number_info[0].type_name }}</span> {{
<div class="colorStatus rowFlex columnCenter" style="margin-left: 10px;"> gameUserInfo.service_wechat_number_info[0]
<span v-if="gameUserInfo.service_wechat_number_info[0].loss_status==1" class="fail">{{ gameUserInfo.service_wechat_number_info[0].loss_status_text }}</span> .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>
</div> </div>
<!-- 如果有多个,显示 +n --> <!-- 如果有多个,显示 +n -->
<div v-if="gameUserInfo.service_wechat_number_info.length > 1"> <div v-if="gameUserInfo.service_wechat_number_info.length > 1">
<el-popover <el-popover placement="top" trigger="hover" width="300">
placement="top" <div
trigger="hover" v-for="(
width="300" 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">
<p class="hidden wxName">{{ item.service_wechat_number_name }}({{ item.service_type_name }})</p> {{ item.service_wechat_number_name }}({{
item.service_type_name
}})
</p>
<span class="bradge">{{ item.type_name }}</span> <span class="bradge">{{ item.type_name }}</span>
<div class="colorStatus rowFlex columnCenter" style="margin-left: 10px;"> <div
<span v-if="item.loss_status==1" class="fail">{{ item.loss_status_text }}</span> class="colorStatus rowFlex columnCenter"
style="margin-left: 10px"
>
<span v-if="item.loss_status == 1" class="fail">{{
item.loss_status_text
}}</span>
</div> </div>
</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> </el-popover>
</div> </div>
</div> </div>
...@@ -206,23 +291,27 @@ ...@@ -206,23 +291,27 @@
<div class="item rowFlex columnCenter spaceBetween"> <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter"> <div class="rowFlex columnCenter">
<span class="label">注册时间:</span> <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>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { bindMobile, getMemberLabel, editMemberLabel } from '@/api/game' import { bindMobile, getMemberLabel, editMemberLabel } from '@/api/game';
import { mapState, mapMutations } from 'vuex' import { mapState, mapMutations } from 'vuex';
import { toTransfer, syncSessionIntelTag } from '@/api/works' import { toTransfer, syncSessionIntelTag } from '@/api/works';
import moment from 'moment' import MarketingPanel from './MarketingPanel.vue';
import ZyouTag from './ZyouTag.vue' import moment from 'moment';
import { debounce } from '@/utils' import ZyouTag from './ZyouTag.vue';
export default { import { debounce } from '@/utils';
export default {
name: 'gameUserInfo', name: 'gameUserInfo',
components: { components: {
ZyouTag ZyouTag,
MarketingPanel,
}, },
props: ['gameUserInfo', 'chatUserDetails'], props: ['gameUserInfo', 'chatUserDetails'],
data() { data() {
...@@ -235,54 +324,62 @@ import { debounce } from '@/utils' ...@@ -235,54 +324,62 @@ import { debounce } from '@/utils'
change_appraisal: 0, change_appraisal: 0,
newMobileValue: '', newMobileValue: '',
isRefresh: false, isRefresh: false,
showWxNumber: true showWxNumber: true,
} };
}, },
computed: { computed: {
...mapState('game', ['accountSelect']) ...mapState('game', ['accountSelect']),
}, },
watch: { watch: {
accountSelect: { accountSelect: {
handler:debounce(function(newVal, oldVal) { handler: debounce(function (newVal, oldVal) {
if (newVal && newVal !== "" && newVal !== oldVal) { if (newVal && newVal !== '' && newVal !== oldVal) {
this.getMemberLabel() this.getMemberLabel();
}
},200),
immediate: false
} }
}, 200),
immediate: false,
},
}, },
mounted() { mounted() {
this.$nextTick(() => { this.$nextTick(() => {
if (this.accountSelect && this.accountSelect !== '') { if (this.accountSelect && this.accountSelect !== '') {
this.getMemberLabel() this.getMemberLabel();
} }
}) });
}, },
methods: { methods: {
getMemberLabel() { getMemberLabel() {
const data = { const data = {
member_id: this.accountSelect, member_id: this.accountSelect,
label_type: [2, 3, 4, 6] label_type: [2, 3, 4, 6],
} };
getMemberLabel(data).then(res => { getMemberLabel(data).then((res) => {
if (res?.data?.data?.length > 0) { if (res?.data?.data?.length > 0) {
const change_user = res.data.data.find(item => item.label_type == 2) const change_user = res.data.data.find(
const change_name = res.data.data.find(item => item.label_type == 3) (item) => item.label_type == 2
const change_risk = res.data.data.find(item => item.label_type == 4)// 风险用户 );
const change_appraisal = res.data.data.find(item => item.label_type == 6)// 石锤用户 const change_name = res.data.data.find(
this.change_user = change_user.label_value (item) => item.label_type == 3
this.change_name = change_name.label_value );
this.change_risk = change_risk.label_value const change_risk = res.data.data.find(
this.change_appraisal = change_appraisal.label_value (item) => item.label_type == 4
this.$emit('changeAppraisal', this.change_appraisal) ); // 风险用户
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 { } else {
this.change_user = 0 this.change_user = 0;
this.change_name = 0 this.change_name = 0;
this.change_risk = 0 this.change_risk = 0;
this.change_appraisal = 0 this.change_appraisal = 0;
this.$emit('changeAppraisal', this.change_appraisal) this.$emit('changeAppraisal', this.change_appraisal);
} }
}) });
}, },
// 白名单 // 白名单
changeNameFn() { changeNameFn() {
...@@ -290,15 +387,17 @@ import { debounce } from '@/utils' ...@@ -290,15 +387,17 @@ import { debounce } from '@/utils'
member_id: this.accountSelect, member_id: this.accountSelect,
create_user: this.cser_name, create_user: this.cser_name,
label_type: 3, label_type: 3,
label_value: this.change_name == 1 ? 0 : 1 label_value: this.change_name == 1 ? 0 : 1,
} };
editMemberLabel(data).then((res) => { editMemberLabel(data).then((res) => {
if (res.status_code == 1) { if (res.status_code == 1) {
this.$message.success(res.msg) this.$message.success(res.msg);
this.change_name == 1 ? this.change_name = 0 : this.change_name = 1 this.change_name == 1
? (this.change_name = 0)
: (this.change_name = 1);
} }
this.$emit('update:show', false) this.$emit('update:show', false);
}) });
}, },
// 异常账号 // 异常账号
changeRiskFn() { changeRiskFn() {
...@@ -306,100 +405,115 @@ import { debounce } from '@/utils' ...@@ -306,100 +405,115 @@ import { debounce } from '@/utils'
member_id: this.accountSelect, member_id: this.accountSelect,
create_user: this.cser_name, create_user: this.cser_name,
label_type: 4, label_type: 4,
label_value: this.change_risk == 0 ? 1 : 0 label_value: this.change_risk == 0 ? 1 : 0,
} };
editMemberLabel(data).then((res) => { editMemberLabel(data).then((res) => {
if (res.status_code == 1) { if (res.status_code == 1) {
this.$message.success(res.msg) this.$message.success(res.msg);
this.change_risk == 1 ? this.change_risk = 0 : this.change_risk = 1 this.change_risk == 1
? (this.change_risk = 0)
: (this.change_risk = 1);
} }
this.$emit('update:show', false) this.$emit('update:show', false);
}) });
}, },
changeUserFn() { changeUserFn() {
const data = { const data = {
member_id: this.accountSelect, member_id: this.accountSelect,
create_user: this.cser_name, create_user: this.cser_name,
label_type: 2, label_type: 2,
label_value: this.change_user == 1 ? 0 : 1 label_value: this.change_user == 1 ? 0 : 1,
} };
editMemberLabel(data).then((res) => { editMemberLabel(data).then((res) => {
if (res.status_code == 1) { if (res.status_code == 1) {
this.$message.success(res.msg) this.$message.success(res.msg);
this.change_user == 1 ? this.change_user = 0 : this.change_user = 1 this.change_user == 1
? (this.change_user = 0)
: (this.change_user = 1);
} }
this.$emit('update:show', false) this.$emit('update:show', false);
}) });
}, },
toTransfer() { toTransfer() {
const data = { const data = {
external_userid: this.chatUserDetails.external_userid, external_userid: this.chatUserDetails.external_userid,
userid: this.chatUserDetails.userid, userid: this.chatUserDetails.userid,
transferred: this.chatUserDetails.transferred transferred: this.chatUserDetails.transferred,
} };
toTransfer(data).then(res => { toTransfer(data).then((res) => {
if (res.status_code == 1) { if (res.status_code == 1) {
this.$message.success(res.msg) this.$message.success(res.msg);
} }
}) });
}, },
// 修改用户手机号 // 修改用户手机号
changeUserMobile() { 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)) { if (
this.$message.warning('请填写正确的手机号') !/^1((3[0-9])|(4[1579])|(5[0-9])|(6[6])|(7[0-9])|(8[0-9])|(9[0-9]))\d{8}$/.test(
return false this.newMobileValue
} )
this.gameUserInfo.mobile = this.newMobileValue.substr(0, 3) + '****' + this.newMobileValue.substr(7) ) {
this.showUserMobile = false this.$message.warning('请填写正确的手机号');
return false;
}
this.gameUserInfo.mobile =
this.newMobileValue.substr(0, 3) +
'****' +
this.newMobileValue.substr(7);
this.showUserMobile = false;
const data = { const data = {
member_id: this.accountSelect, member_id: this.accountSelect,
mobile: this.newMobileValue mobile: this.newMobileValue,
} };
bindMobile(data).then((res) => { bindMobile(data).then((res) => {
if (res.status_code == 1) { if (res.status_code == 1) {
this.$message.success(res.msg) this.$message.success(res.msg);
} }
}) });
}, },
editUserMobile() { editUserMobile() {
this.showUserMobile = true this.showUserMobile = true;
}, },
async refreshTag() { async refreshTag() {
this.isRefresh = true this.isRefresh = true;
const data = { const data = {
corp_id: this.chatUserDetails.corp_id, corp_id: this.chatUserDetails.corp_id,
userid: this.chatUserDetails.userid, userid: this.chatUserDetails.userid,
external_userid: this.chatUserDetails.external_userid external_userid: this.chatUserDetails.external_userid,
} };
try { try {
const res = await syncSessionIntelTag(data) const res = await syncSessionIntelTag(data);
if (res.status_code === 1) { if (res.status_code === 1) {
if (res.data.is_can_sync == 1) { if (res.data.is_can_sync == 1) {
this.$message.success(res.msg) this.$message.success(res.msg);
this.$set(this.chatUserDetails, 'intelligence_tag_group', res.data.intel_tag) this.$set(
this.chatUserDetails,
'intelligence_tag_group',
res.data.intel_tag
);
} else { } else {
this.$message.warning('每个用户半个小时仅能更新一次') this.$message.warning('每个用户半个小时仅能更新一次');
} }
} }
} catch (error) { } catch (error) {
this.isRefresh = false this.isRefresh = false;
} finally { } finally {
this.isRefresh = false this.isRefresh = false;
} }
} },
} },
} };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.gameUserDetails { .gameUserDetails {
width: 100%; width: 100%;
.changeUser{ .changeUser {
font-size: 18px; font-size: 18px;
transform: rotate(90deg); transform: rotate(90deg);
color: #3491FA ; color: #3491fa;
margin-left: 10px; margin-left: 10px;
margin-top: -5px; margin-top: -5px;
:first-child{ :first-child {
margin-right: -5px; margin-right: -5px;
} }
} }
...@@ -419,10 +533,10 @@ import { debounce } from '@/utils' ...@@ -419,10 +533,10 @@ import { debounce } from '@/utils'
border-radius: 6px; border-radius: 6px;
margin-right: 5px; margin-right: 5px;
} }
.wxName{ .wxName {
max-width: 80%; max-width: 80%;
} }
.bradge{ .bradge {
padding: 2px 5px; padding: 2px 5px;
border-radius: 3px; border-radius: 3px;
background: #f4f4f5; background: #f4f4f5;
...@@ -434,7 +548,7 @@ import { debounce } from '@/utils' ...@@ -434,7 +548,7 @@ import { debounce } from '@/utils'
margin-left: 10px; margin-left: 10px;
} }
.label { .label {
color: #86909C; color: #86909c;
font-size: 14px; font-size: 14px;
} }
.text { .text {
...@@ -453,11 +567,11 @@ import { debounce } from '@/utils' ...@@ -453,11 +567,11 @@ import { debounce } from '@/utils'
width: 44px; width: 44px;
height: 22px; height: 22px;
border-radius: 4px; border-radius: 4px;
border: 1px solid #3491FA ; border: 1px solid #3491fa;
font-size: 12px; font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400; font-weight: 400;
color: #3491FA ; color: #3491fa;
margin-left: 30px; margin-left: 30px;
cursor: pointer; cursor: pointer;
} }
...@@ -486,38 +600,37 @@ import { debounce } from '@/utils' ...@@ -486,38 +600,37 @@ import { debounce } from '@/utils'
.item:hover .icon { .item:hover .icon {
display: block; display: block;
} }
.el-icon-sort-up{ .el-icon-sort-up {
font-size: 16px; font-size: 16px;
} }
} }
.refreshList { .refreshList {
color: #3491FA ; color: #3491fa;
cursor: pointer; cursor: pointer;
font-size: 18px; font-size: 18px;
margin-left: 20px; margin-left: 20px;
} }
.refreshListActive{ .refreshListActive {
animation:rotate 0.5s linear infinite ; animation: rotate 0.5s linear infinite;
} }
@keyframes rotate { @keyframes rotate {
0%{ 0% {
transform: rotate(0deg); transform: rotate(0deg);
} }
100%{ 100% {
transform: rotate(360deg); transform: rotate(360deg);
} }
} }
</style> </style>
<style> <style>
.wxName{ .wxName {
max-width: 80%; max-width: 80%;
} }
.bradge{ .bradge {
padding: 2px 5px; padding: 2px 5px;
border-radius: 3px; border-radius: 3px;
background: #f4f4f5; background: #f4f4f5;
color: #909399; color: #909399;
margin-left: 10px; margin-left: 10px;
} }
</style> </style>
\ No newline at end of file
<template> <template>
<div class="userInfo-content"> <div class="userInfo-content relative" id="recentActivitiesPopup">
<el-tabs v-model="activeTab" class="user-tabs"> <el-tabs v-model="activeTab" class="user-tabs">
<el-tab-pane label="客户信息" name="info"> <el-tab-pane label="客户信息" name="info">
<Info :chatUserDetails="chatUserInfo"/> <Info :chatUserDetails="chatUserInfo" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="角色信息" name="role"> <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'" /> <roleInfo v-if="activeTab === 'role'" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="订单信息" name="order"> <el-tab-pane label="订单信息" name="order">
<orderList v-if="activeTab === 'order'" /> <orderList v-if="activeTab === 'order'" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="违规记录" name="violation">
<violationRecord v-if="activeTab === 'violation'" />
</el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</template> </template>
<script> <script>
import Info from './components/Info.vue' import Info from './components/Info.vue';
import roleInfo from '@/views/roleInfo.vue' import roleInfo from '@/views/roleInfo.vue';
import orderList from '@/views/orderList.vue' import orderList from '@/views/orderList.vue';
import violationRecord from '@/views/ViolationRecord.vue' import { mapState, mapMutations } from 'vuex';
import { mapState, mapMutations } from 'vuex' import { createRoleRecentActivityNotPushNum } from '@/views/hooks/useGetCount';
import Cookies from 'js-cookie' import Cookies from 'js-cookie';
export default { export default {
name: 'userInfo', name: 'userInfo',
components: { components: {
Info, Info,
roleInfo, roleInfo,
orderList, orderList,
violationRecord
}, },
mounted() { watch: {
async accountSelect(newVal) {
await this.initInstance();
},
}, },
data() { data() {
return { return {
activeTab: 'info' activeTab: 'info',
} instance: null,
totalNum: 0,
};
}, },
computed: { computed: {
...mapState('game', ['chatUserInfo']), ...mapState('game', ['chatUserInfo', 'accountSelect']),
}, },
created() { created() {
// 初始化 vuex 中的值 // 初始化 vuex 中的值
this.initInstance();
}, },
mounted() { mounted() {
this.$nextTick(() => { this.$nextTick(() => {
this.initVuexValue() this.initVuexValue();
}) });
}, },
methods: { methods: {
...mapMutations('user', ['set_userInfo']), ...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 = { const userinfo = {
cser_id: Cookies.get('cser_id'), cser_id: Cookies.get('cser_id'),
cser_name: Cookies.get('cser_name'), cser_name: Cookies.get('cser_name'),
username: Cookies.get('cser_name'), username: Cookies.get('cser_name'),
id: Cookies.get('cser_id'), id: Cookies.get('cser_id'),
} };
this.set_userInfo(userinfo) this.set_userInfo(userinfo);
} },
},
} beforeDestroy() {
} this.instance && this.instance.destroy();
},
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -99,4 +118,9 @@ export default { ...@@ -99,4 +118,9 @@ export default {
} }
} }
} }
::v-deep .el-badge__content.is-fixed {
top: 8px;
right: 6px;
}
</style> </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
}
}
...@@ -74,5 +74,48 @@ module.exports = defineConfig({ ...@@ -74,5 +74,48 @@ module.exports = defineConfig({
// } // }
} }
} }
},
chainWebpack(config) {
// set svg-sprite-loader
config.module.rule('svg').exclude.add(resolve('src/assets/icon/svg')).end()
config.module
.rule('icons')
.test(/\.svg$/)
.include.add(resolve('src/assets/icon/svg'))
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]'
})
.end()
config.when(process.env.NODE_ENV !== 'development', (config) => {
config.optimization.splitChunks({
chunks: 'all',
cacheGroups: {
libs: {
name: 'chunk-libs',
test: /[\\/]node_modules[\\/]/,
priority: 10,
chunks: 'initial' // only package third parties that are initially dependent
},
elementUI: {
name: 'chunk-elementUI', // split elementUI into a single package
priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
},
commons: {
name: 'chunk-commons',
test: resolve('src/components'), // can customize your rules
minChunks: 3, // minimum common number
priority: 5,
reuseExistingChunk: true
}
}
})
// https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
config.optimization.runtimeChunk('single')
})
} }
}) })
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论