提交 4e77a778 作者: 毛细亚

合并分支 'release' 到 'master'

Release

查看合并请求 !39
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
<!-- HTTP 1.1 -->
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="pragma" content="no-cache" />
<!-- HTTP 1.0 -->
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="cache-control" content="no-cache" />
<!-- 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" />
<!-- <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"> -->
<script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script>
<script src="https://lf1-cdn-tos.bytegoofy.com/obj/iconpark/icons_27278_172.5464f393968eda872f41eab2242bbbd7.es5.js"></script>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
<strong
>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work
properly without JavaScript enabled. Please enable it to
continue.</strong
>
</noscript>
<div id="app"></div>
</body>
......
<template>
<div id="app" class="mobile-app-wrapper">
<Debug />
<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">
<el-menu :default-active="selectedPath" mode="horizontal" 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
:default-active="selectedPath"
mode="horizontal"
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"
>
<!-- 任务列表菜单项显示红点 -->
<div v-if="item.path === '/taskList' && hasTaskRedDot" class="menu-item-with-badge">
<div
v-if="item.path === '/taskList' && hasTaskRedDot"
class="menu-item-with-badge"
>
<div class="task-badge">
<el-badge is-dot>
<span>{{ item.label }}</span>
......@@ -22,9 +40,17 @@
</el-menu>
<!-- 展开收起按钮 -->
<el-button 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>
<span>{{ isMenuExpanded ? '收起' : '展开' }}</span>
<el-button
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>
<span>{{ isMenuExpanded ? "收起" : "展开" }}</span>
</el-button>
</div>
......@@ -37,25 +63,25 @@
</div>
</template>
<script>
import bindUserList from '@/views/components/bindGameAccount/bindUserList.vue'
import { getToken } from '@/utils/auth'
import { mapState, mapMutations, mapActions } from 'vuex'
import Cookies from 'js-cookie'
import { getParams } from '@/utils/index'
import Debug from '@/components/debug.vue'
import bindUserList from "@/views/components/bindGameAccount/bindUserList.vue";
import { getToken } from "@/utils/auth";
import { mapState, mapMutations, mapActions } from "vuex";
import Cookies from "js-cookie";
import { getParams } from "@/utils/index";
import Debug from "@/components/debug.vue";
export default {
name: 'App',
name: "App",
components: {
bindUserList,
Debug
Debug,
},
data() {
return {
menuList: [
{
label: '客户资料',
path: '/userInfo'
label: "客户资料",
path: "/userInfo",
},
// {
// label: '角色信息',
......@@ -66,16 +92,16 @@ export default {
// path: '/orderList'
// },
{
label: '快捷回复',
path: '/quickReply'
label: "快捷回复",
path: "/quickReply",
},
// {
// label: '违规记录',
// path: '/violationRecord'
// },
{
label: '礼包记录',
path: '/giftRecord'
label: "礼包记录",
path: "/giftRecord",
},
// {
......@@ -83,188 +109,220 @@ export default {
// path: '/taskRecord'
// },
{
label: '申请记录',
path: '/applyRecord'
label: "申请记录",
path: "/applyRecord",
},
{
label: '通讯录',
path: '/addressBook'
label: "通讯录",
path: "/addressBook",
},
{
label: '快捷发送',
path: '/quickSendGame'
label: "快捷发送",
path: "/quickSendGame",
},
{
label: '任务列表',
path: '/taskList',
hasRedDot: false // 红点状态
label: "任务列表",
path: "/taskList",
hasRedDot: false, // 红点状态
},
{
label: '微言助手',
path: '/aiChat'
label: "微言助手",
path: "/aiChat",
},
// {
// label: '通讯录',
// path: '/addressBook'
// },
],
selectedPath: '/userInfo',
selectedPath: "/userInfo",
showMemberId: false,
isMenuExpanded: false, // 菜单展开状态
shouldShowToggle: false, // 是否显示展开收起按钮
}
};
},
computed: {
...mapState('user', ['external_userid', 'token', 'userInfo']),
...mapState('game', ['taskData']),
...mapState("user", ["external_userid", "token", "userInfo"]),
...mapState("game", ["taskData"]),
// 计算任务列表是否需要显示红点
hasTaskRedDot() {
return this.taskData.user_task > 0 || this.taskData.account_task > 0
}
return this.taskData.user_task > 0 || this.taskData.account_task > 0;
},
},
watch: {
'$route.path'(val) {
"$route.path"(val) {
// 处理各种可能的路径情况
if (val === '/' || val === '/index.html') {
this.selectedPath = '/userInfo'
if (val === "/" || val === "/index.html") {
this.selectedPath = "/userInfo";
} else {
this.selectedPath = val
this.selectedPath = val;
}
console.log('路由变化:', val, '选中路径:', this.selectedPath)
console.log("路由变化:", val, "选中路径:", this.selectedPath);
},
// 监听用户信息变化,只在初始化时获取一次任务数据
userInfo: {
handler(newVal, oldVal) {
if (newVal && newVal.id && (!oldVal || !oldVal.id) && this.token) {
console.log('用户信息初始化完成,获取任务数据:', newVal)
console.log("用户信息初始化完成,获取任务数据:", newVal);
// 只在用户信息第一次设置时获取任务数据
this.getTaskUnReadData()
this.getTaskUnReadData();
}
},
deep: true,
immediate: true
immediate: true,
},
// 监听 external_userid 的变化,确保界面及时更新
external_userid: {
handler(newVal) {
if (newVal) {
this.$nextTick(() => {
this.showMemberId = true
console.log('external_userid 已设置:', newVal, window.location.href, this.token, Cookies.get('token'))
this.showMemberId = true;
console.log(
"external_userid 已设置:",
newVal,
window.location.href,
this.token,
Cookies.get("token")
);
// 强制更新组件
this.$forceUpdate()
this.$forceUpdate();
// 检查是否需要显示展开收起按钮
this.checkMenuOverflow()
})
this.checkMenuOverflow();
});
}
},
immediate: true
}
immediate: true,
},
},
created() {
const urlParams = getParams();
// 每次进入页面都缓存corp_id
if (urlParams.corp_id) {
this.cacheCorp_id(urlParams.corp_id) // 缓存 corp_id
this.cacheCorp_id(urlParams.corp_id); // 缓存 corp_id
}
},
mounted() {
// 页面刷新时从 Cookie 恢复 token 到 store
const cookieToken = Cookies.get('token')
// Cookies.set(
// "token",
// "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOjQwOTAsImRhdGEiOnsiY3Nlcl9pZCI6NDA5MCwiY3Nlcl9uYW1lIjoi5q-b57uG5LqaIn0sImlhdCI6MTc2NTE3MjI0NywiZXhwIjoxNzY3NzY0MjQ3LCJuYmYiOjE3NjUxNzIyNDcsInN1YiI6InRva2Vu6K6k6K-BIiwianRpIjoiN2Q5NjYxNDVjNjgyZWU0Y2UyY2Y2MTc2ZjA0NTNlNGMifQ.QpEtYzoXK11RHwn8la-OMoS-BnlTyEEAa0lmlpYu2IQ"
// );
// Cookies.set("corp_id", "wweaefe716636df3d1");
// Cookies.set("userid", "maoxiya");
// Cookies.set("cser_name", "毛细亚");
// Cookies.set("external_userid", "wm5rUgMgAAG_vfF4AHClsrS1S6MImVsQ");
// Cookies.set("cser_id", 4090);
// Cookies.set("weixin_blongs_id", 2862);
const cookieToken = Cookies.get("token");
if (cookieToken && !this.token) {
this.set_token(cookieToken)
console.log('从 Cookie 恢复 token:', cookieToken)
this.set_token(cookieToken);
console.log("从 Cookie 恢复 token:", cookieToken);
}
// 初始化时处理路径
const currentPath = this.$route.path
if (currentPath === '/' || currentPath === '' || currentPath === '/index.html') {
this.selectedPath = '/userInfo'
const currentPath = this.$route.path;
if (
currentPath === "/" ||
currentPath === "" ||
currentPath === "/index.html"
) {
this.selectedPath = "/userInfo";
} else {
this.selectedPath = currentPath
this.selectedPath = currentPath;
}
console.log('创建时路径:', currentPath, '选中路径:', this.selectedPath)
console.log("创建时路径:", currentPath, "选中路径:", this.selectedPath);
// 监听窗口大小变化
window.addEventListener('resize', this.handleResize)
window.addEventListener("resize", this.handleResize);
// 初始检查
this.$nextTick(() => {
this.checkMenuOverflow()
this.initVuexValue()
})
this.checkMenuOverflow();
this.initVuexValue();
});
},
beforeDestroy() {
window.removeEventListener('resize', this.handleResize)
window.removeEventListener("resize", this.handleResize);
// 移除 localStorage 中的 weixin_blongs_id
localStorage.removeItem("weixin_blongs_id");
},
methods: {
...mapMutations('user', ['set_userid', 'set_corp_id', 'set_token', 'set_cser_info', 'set_cser_id', 'set_cser_name', 'set_userInfo']),
...mapMutations('game', ['set_accountSelect']),
...mapActions('game', ['getTaskUnReadData']),
...mapMutations("user", [
"set_userid",
"set_corp_id",
"set_token",
"set_cser_info",
"set_cser_id",
"set_cser_name",
"set_userInfo",
]),
...mapMutations("game", ["set_accountSelect"]),
...mapActions("game", ["getTaskUnReadData"]),
// 设置缓存
cacheCorp_id(corp_id) {
Cookies.set('corp_id', corp_id, { expires: 30 })
this.set_corp_id(corp_id)
Cookies.set("corp_id", corp_id, { expires: 30 });
this.set_corp_id(corp_id);
},
initVuexValue() {
this.set_userid(Cookies.get('userid'))
this.set_corp_id(Cookies.get('corp_id'))
this.set_token(Cookies.get('token'))
this.set_cser_id(Cookies.get('cser_id'))
this.set_cser_name(Cookies.get('cser_name'))
this.set_userid(Cookies.get("userid"));
this.set_corp_id(Cookies.get("corp_id"));
this.set_token(Cookies.get("token"));
this.set_cser_id(Cookies.get("cser_id"));
this.set_cser_name(Cookies.get("cser_name"));
const userinfo = {
cser_id: Cookies.get('cser_id'),
cser_name: Cookies.get('cser_name'),
username: Cookies.get('cser_name'),
id: Cookies.get('cser_id'),
}
this.set_userInfo(userinfo)
const cser_info = Cookies.get('cser_info')
cser_info ? this.set_cser_info(JSON.parse(cser_info)) : this.set_cser_info({})
cser_id: Cookies.get("cser_id"),
cser_name: Cookies.get("cser_name"),
username: Cookies.get("cser_name"),
id: Cookies.get("cser_id"),
};
this.set_userInfo(userinfo);
const cser_info = Cookies.get("cser_info");
cser_info
? this.set_cser_info(JSON.parse(cser_info))
: this.set_cser_info({});
},
handleSelect(key, keyPath) {
console.log('菜单选择:', key, keyPath, window.location.href)
console.log("菜单选择:", key, keyPath, window.location.href);
},
// 切换菜单展开收起状态
toggleMenu() {
this.isMenuExpanded = !this.isMenuExpanded
this.isMenuExpanded = !this.isMenuExpanded;
},
// 检查菜单是否需要换行
checkMenuOverflow() {
this.$nextTick(() => {
const menuElement = this.$refs.menuRef?.$el
if (!menuElement) return
const menuElement = this.$refs.menuRef?.$el;
if (!menuElement) return;
// 临时展开菜单来检查实际高度
const wasCollapsed = !this.isMenuExpanded && this.shouldShowToggle
const wasCollapsed = !this.isMenuExpanded && this.shouldShowToggle;
if (wasCollapsed) {
menuElement.classList.remove('collapsed')
menuElement.classList.remove("collapsed");
}
const menuHeight = menuElement.scrollHeight
const singleLineHeight = 50 // 单行高度
const menuHeight = menuElement.scrollHeight;
const singleLineHeight = 50; // 单行高度
// 如果菜单高度超过单行,说明需要换行
this.shouldShowToggle = menuHeight > singleLineHeight + 10 // 加10px容错
this.shouldShowToggle = menuHeight > singleLineHeight + 10; // 加10px容错
// 如果不需要展开收起按钮,则直接展开
if (!this.shouldShowToggle) {
this.isMenuExpanded = true
this.isMenuExpanded = true;
} else if (wasCollapsed) {
// 恢复收起状态
menuElement.classList.add('collapsed')
menuElement.classList.add("collapsed");
}
})
});
},
// 窗口大小变化处理
handleResize() {
clearTimeout(this.resizeTimer)
clearTimeout(this.resizeTimer);
this.resizeTimer = setTimeout(() => {
this.checkMenuOverflow()
}, 150)
}
this.checkMenuOverflow();
}, 150);
},
}
},
};
</script>
<style scoped>
......@@ -352,14 +410,14 @@ export default {
overflow-y: auto;
}
.mobile-content>div {
.mobile-content > div {
background: #fff;
border-radius: 8px;
min-height: 60vh;
padding: 10px;
}
.el-menu--horizontal>.el-menu-item {
.el-menu--horizontal > .el-menu-item {
height: 35px;
line-height: 35px;
}
......
......@@ -1467,3 +1467,45 @@ export function sendEmail(data) {
})
})
}
// 获取开/合服天数
export function getServerDayApi(data) {
return new Promise((resolve, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/role/getServerDay',
params: data
}).then((res) => {
resolve(res)
}).catch((error) => {
reject(error)
})
})
}
// 项目-视频分类
export function teachingVideoCategoryListApi(data) {
return new Promise((resolve, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/teaching_video/categoryList',
params: data
}).then((res) => {
resolve(res)
}).catch((error) => {
reject(error)
})
})
}
// 视频列表
export function teachingVideoVideoListApi(data) {
return new Promise((resolve, reject) => {
cross_systemRequest({
system: 'zhangyou',
api: '/api/teaching_video/videoList',
params: data
}).then((res) => {
resolve(res)
}).catch((error) => {
reject(error)
})
})
}
\ No newline at end of file
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><mask id="b" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="14" height="14"><path d="M14 0H0v14h14z" fill="#fff"/></mask><g mask="url(#b)" stroke="#267ef0" stroke-width=".875" stroke-linecap="round" stroke-linejoin="round"><path d="M9.333 7.525v2.45c0 2.042-.816 2.858-2.858 2.858h-2.45c-2.042 0-2.858-.816-2.858-2.858v-2.45c0-2.042.816-2.858 2.858-2.858h2.45c2.042 0 2.858.816 2.858 2.858"/><path d="M12.833 4.025v2.45c0 2.042-.816 2.858-2.858 2.858h-.642V7.525c0-2.042-.816-2.858-2.858-2.858H4.667v-.642c0-2.042.816-2.858 2.858-2.858h2.45c2.042 0 2.858.816 2.858 2.858"/></g></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h14v14H0z"/></clipPath></defs></svg>
\ No newline at end of file
import Vue from 'vue'
{/* <iconpark-icon name="icon-fuzhi"></iconpark-icon> */}
const copy = {
// 当被绑定的元素插入到DOM中时
inserted: function(el, binding) {
// 创建复制图标元素
const copyIcon = document.createElement('iconpark-icon')
// const copyIcon = document.createElement('div')
// copyIcon.setAttribute('icon-class', 'copy')
copyIcon.name='icon-fuzhi'
copyIcon.style.cursor = 'pointer'
copyIcon.style.marginLeft = '8px'
copyIcon.style.fontSize = '16px'
copyIcon.title = '点击复制'
copyIcon.innerHTML='<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><mask id="b" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="14" height="14"><path d="M14 0H0v14h14z" fill="#fff"/></mask><g mask="url(#b)" stroke="#267ef0" stroke-width=".875" stroke-linecap="round" stroke-linejoin="round"><path d="M9.333 7.525v2.45c0 2.042-.816 2.858-2.858 2.858h-2.45c-2.042 0-2.858-.816-2.858-2.858v-2.45c0-2.042.816-2.858 2.858-2.858h2.45c2.042 0 2.858.816 2.858 2.858"/><path d="M12.833 4.025v2.45c0 2.042-.816 2.858-2.858 2.858h-.642V7.525c0-2.042-.816-2.858-2.858-2.858H4.667v-.642c0-2.042.816-2.858 2.858-2.858h2.45c2.042 0 2.858.816 2.858 2.858"/></g></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h14v14H0z"/></clipPath></defs></svg>'
// 设置元素的position为relative,确保图标的absolute定位正确
if (getComputedStyle(el).position === 'static') {
el.style.position = 'relative'
}
// 添加复制图标到元素后面
el.insertBefore(copyIcon, el.nextSibling)
// 复制功能实现
copyIcon.addEventListener('click', async function(e) {
// 阻止事件冒泡
e.stopPropagation()
try {
// 获取要复制的内容
const textToCopy = binding.value || ''
if (!textToCopy) {
Vue.prototype.$message.warning('没有可复制的内容')
return
}
// 使用现代的剪贴板API
if (navigator.clipboard && window.isSecureContext) {
await navigator.clipboard.writeText(textToCopy)
} else {
// 兼容旧版浏览器
const textArea = document.createElement('textarea')
textArea.value = textToCopy
textArea.style.position = 'fixed'
textArea.style.left = '-999999px'
textArea.style.top = '-999999px'
document.body.appendChild(textArea)
textArea.focus()
textArea.select()
// 执行复制命令
const success = document.execCommand('copy')
document.body.removeChild(textArea)
if (!success) {
throw new Error('复制失败')
}
}
// 显示复制成功的提示
Vue.prototype.$message.success('复制成功')
} catch (error) {
console.error('复制失败:', error)
Vue.prototype.$message.error('复制失败,请手动复制')
}
})
// 存储图标引用,以便在组件卸载时清理
el.__copyIcon = copyIcon
},
// 当指令与元素解绑时
unbind: function(el) {
// 清理事件监听器和元素
if (el.__copyIcon) {
el.__copyIcon.removeEventListener('click', null)
el.parentNode.removeChild(el.__copyIcon)
delete el.__copyIcon
}
}
}
export default copy
\ No newline at end of file
import copy from './copy.js'
const install = function(Vue) {
Vue.directive('copy', copy)
}
if (window.Vue) {
window.copy = copy
Vue.use(install); // eslint-disable-line
}
copy.install = install
export default copy
......@@ -15,6 +15,7 @@ import '@/styles/index.scss';
import moment from 'moment'
import '@/styles/tailwind.css'
import VConsole from 'vconsole';
import copy from './directive/copy'
import uploading from '@/utils/cos-upload'
import errorHandle from '@/utils/errorHandle'
import { getParams,deepClone } from '@/utils/index'
......@@ -24,7 +25,7 @@ import loadmore from '@/directive/loadmore/index.js' // 加载更多
import clickagain from './directive/clickagain'
import permission from '@/directive/permission/index.js' // 权限判断指令
import scroll from '@/directive/scroll' // 下拉加载更多指令
Vue.use(globalComponent).use(permission).use(clickagain).use(loadmore).use(scroll)
Vue.use(globalComponent).use(permission).use(clickagain).use(loadmore).use(scroll).use(copy)
// 导入 VConsole 清理工具
import '@/utils/vconsoleCleanup'
......
......@@ -14,6 +14,7 @@ const state = {
external_userid:''
},
userid:Cookies.get('userid'),
weixin_blongs_id:localStorage.getItem('weixin_blongs_id'),//客服号项目id
corp_id:'',
external_userid:'',
token:'',
......@@ -37,6 +38,12 @@ const state = {
}
const mutations = {
set_weixin_blongs_id(state,weixin_blongs_id){
state.weixin_blongs_id = weixin_blongs_id
// Cookies.set('weixin_blongs_id', weixin_blongs_id)
localStorage.setItem('weixin_blongs_id', weixin_blongs_id)
},
set_userInfo(state,userInfo){
state.userInfo = userInfo
},
......
......@@ -537,6 +537,10 @@ li {
height: 100%;
font-size: 300px;
}
.el-loading-spinner{
display: flex;
justify-content: center;
}
.el-loading-spinner .circular {
width: 60px !important;
......
<template>
<div class="h-full flex flex-col">
<el-input
placeholder="请输入内容"
prefix-icon="el-icon-search"
v-model.trim="searchText"
@input="debouncedGetVideoList"
>
</el-input>
<el-cascader
class="w-full mt-[8px]"
v-model="categoryValue"
:props="{ emitPath: false, expandTrigger: 'click' }"
:options="categoryList"
@change="debouncedGetVideoList"
></el-cascader>
<div
class="mt-[2px] space-y-[8px] flex-1 overflow-auto pb-[10px]"
v-loading="loading"
>
<div
v-for="item in videoList"
:key="item.id"
class="flex justify-between items-center py-[3px] px-[8px] bottom-[1px] border border-[#E5E7EB] rounded-[4px]"
>
<div class="text-[14px]">{{ item.video_name }}</div>
<div class="flex items-center">
<el-button
type="text"
size="small"
class="text-[12px] button-color-hover"
@click="previewVideo(item)"
>
<div class="flex items-center">
<iconpark-icon
name="xiaoxicaozuo-chakan"
class="mr-[4px] text-[14px]"
></iconpark-icon>
预览
</div>
</el-button>
<div
@click="sendVideo(item)"
class="h-[24px] ml-[8px] cursor-pointer hover:bg-[#E7F1FD] text-[12px] w-[58px] p-0 flex justify-center items-center rounded-full bg-[#F7F8FA] text-[#267EF0]"
>
<iconpark-icon
name="icon-fasonghuashu"
class="text-[14px] mr-[4px]"
></iconpark-icon>
<span> 发送</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import {
teachingVideoVideoListApi,
teachingVideoCategoryListApi,
} from "@/api/game";
import { mapMutations, mapState } from "vuex";
import { sendChatMessage } from "@/utils/index";
import { debounce } from "@/utils";
export default {
name: "InstructionalVideo",
data() {
return {
searchText: "",
categoryValue: {},
categoryList: [],
videoList: [],
debouncedGetVideoList: () => {},
loading: false,
};
},
mounted() {
this.getCategoryList();
// 初始化防抖函数,延迟300ms执行
this.debouncedGetVideoList = debounce(() => {
this.loading = true;
this.getVideoList().finally(() => {
this.loading = false;
});
}, 300);
},
computed: {
...mapState("user", ["userInfo", "weixin_blongs_id"]),
},
methods: {
...mapMutations("common", ["set_sendSkillMessage"]),
// 视频分类
async getCategoryList() {
// return;
const { data } = await teachingVideoCategoryListApi({
weixin_blongs_id: this.weixin_blongs_id,
});
this.categoryList = this.formatCategoryList(data);
},
formatCategoryList(data) {
return data.map((item) => {
return {
value: item,
label: item.main_game_name,
children: item.category.map((item) => ({
value: item,
label: item.category_name,
})),
};
});
},
// 视频列表
async getVideoList() {
if (!this.categoryValue.id) {
return;
}
const { data } = await teachingVideoVideoListApi({
weixin_blongs_id:
this.categoryValue.weixin_blongs_id || this.weixin_blongs_id,
main_game_id: this.categoryValue.main_game_id,
video_type: this.categoryValue.id,
video_name: this.searchText,
page: 1,
page_size: 200,
});
this.videoList = data.data;
},
sendVideo(item) {
try {
const link = {
title: item.video_name,
imgUrl: item.cover_url || "",
desc: "点击观看教学视频",
link: item.video_url,
};
sendChatMessage(link, "link");
} catch (error) {
console.error("发送视频链接失败:", error);
this.$message({ message: "发送视频链接失败", type: "error" });
}
},
previewVideo(item) {
window.open(item.video_url);
},
},
};
</script>
<style scoped>
.button-color-hover.el-button--text:hover {
color: #267ef0 !important;
}
.button-color-hover.el-button--text {
color: #86909c;
}
</style>
......@@ -3,51 +3,114 @@
<div v-if="!disabled && bindGameUserList.length > 0" class="btnRelease">
<div class="btntab">
<el-radio-group size="small" v-model="activeName" class="radio-group">
<el-radio-button border label="1" @click.native="activeName = '1'">转端</el-radio-button>
<el-radio-button border label="3" @click.native="recallTabChange">召回</el-radio-button>
<el-radio-button border label="2" @click.native="requestRegGameList">转游</el-radio-button>
<el-radio-button border label="1" @click.native="activeName = '1'"
>转端</el-radio-button
>
<el-radio-button border label="3" @click.native="recallTabChange"
>召回</el-radio-button
>
<el-radio-button border label="2" @click.native="requestRegGameList"
>转游</el-radio-button
>
</el-radio-group>
</div>
<div v-loading="contentLoading" class="gameList">
<!-- 转端 -->
<el-collapse v-if="activeName == '1' && conversionGameList.length > 0" :disabled="disabled"
@change="conversionChangeOld">
<el-collapse-item class="mb-[10px]" v-for="(item, index) in conversionGameList" :key="index"
:name="item.game_type">
<el-collapse
v-if="activeName == '1' && conversionGameList.length > 0"
:disabled="disabled"
@change="conversionChangeOld"
>
<el-collapse-item
class="mb-[10px]"
v-for="(item, index) in conversionGameList"
:key="index"
:name="item.game_type"
>
<template slot="title">
<div class="title-with-icon">
<svg-icon v-if="item.game_type == 1" icon-class="wxgame" class="game-icon" />
<svg-icon v-else-if="item.game_type == 5" icon-class="douyin" class="game-icon" />
<svg-icon v-else-if="item.game_type == 3" icon-class="Android" class="game-icon" />
<svg-icon v-else-if="item.game_type == 4" icon-class="IOS" class="game-icon" />
<svg-icon v-else-if="item.game_type == 2" icon-class="H5" class="game-icon" />
<svg-icon
v-if="item.game_type == 1"
icon-class="wxgame"
class="game-icon"
/>
<svg-icon
v-else-if="item.game_type == 5"
icon-class="douyin"
class="game-icon"
/>
<svg-icon
v-else-if="item.game_type == 3"
icon-class="Android"
class="game-icon"
/>
<svg-icon
v-else-if="item.game_type == 4"
icon-class="IOS"
class="game-icon"
/>
<svg-icon
v-else-if="item.game_type == 2"
icon-class="H5"
class="game-icon"
/>
{{ item.game_text }}
</div>
</template>
<div v-if="item.children && item.children.length > 0">
<div v-for="(items, indexs) in item.children" :key="indexs"
class="gameListItem rowFlex columnCenter spaceBetween">
<p>{{ items.game_name + '/' + items.game_id }}</p>
<div
v-for="(items, indexs) in item.children"
:key="indexs"
class="gameListItem rowFlex columnCenter spaceBetween"
>
<p>{{ items.game_name + "/" + items.game_id }}</p>
<el-popover placement="top" width="160" trigger="hover">
<div>
<p class="sendLink" @click="sendLink(items, item.game_type)">
<p
class="sendLink"
@click="sendLink(items, item.game_type)"
>
仅发送链接
</p>
<p class="sendLink" @click="sendPassword(items, item.game_type)">
<p
class="sendLink"
@click="sendPassword(items, item.game_type)"
>
仅发送账号密码
</p>
<p class="sendLink" @click="sendMessage(items, item.game_type)">
<p
class="sendLink"
@click="sendMessage(items, item.game_type)"
>
发送链接和账号密码
</p>
<p class="sendLink" @click="sendDownLoadPage(items, item.game_type, index)">
<p
class="sendLink"
@click="sendDownLoadPage(items, item.game_type, index)"
>
发送落地页
</p>
<p
class="sendLink"
v-if="[3, 4].includes(item.game_type)"
@click="sendDownLoadQrCode(items, item.game_type, index)"
>
下载二维码
</p>
</div>
<el-button slot="reference" size="mini" :disabled="accountSelect == ''">发送</el-button>
<el-button
slot="reference"
size="mini"
:disabled="accountSelect == ''"
>发送</el-button
>
</el-popover>
</div>
</div>
<div v-else-if="gameLoding" class="channelLoading rowFlex allCenter">
<div
v-else-if="gameLoding"
class="channelLoading rowFlex allCenter"
>
<i class="el-icon-loading"></i>
<el-button type="text">加载中</el-button>
</div>
......@@ -55,31 +118,75 @@
</el-collapse-item>
</el-collapse>
<!-- 召回 -->
<div v-else-if="activeName == '3' && recallGameList.length > 0" class="collapseContent">
<div
v-else-if="activeName == '3' && recallGameList.length > 0"
class="collapseContent"
>
<!-- v-if="chatUser.task_type && chatUser.task_type == 7"-->
<el-button v-if='false' type="primary" style="margin-left:50px;" :loading="sendLoading"
@click="sendTaskChannel">根据任务一键发送链接</el-button>
<el-button
v-if="false"
type="primary"
style="margin-left: 50px"
:loading="sendLoading"
@click="sendTaskChannel"
>根据任务一键发送链接</el-button
>
<el-collapse :disabled="disabled" @change="recallChange">
<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">
<div class="title-with-icon">
<svg-icon v-if="item.game_type == 1" icon-class="wxgame" class="game-icon" />
<svg-icon v-else-if="item.game_type == 5" icon-class="douyin" class="game-icon" />
<svg-icon v-else-if="item.game_type == 3" icon-class="Android" class="game-icon" />
<svg-icon v-else-if="item.game_type == 4" icon-class="IOS" class="game-icon" />
<svg-icon v-else-if="item.game_type == 2" icon-class="H5" class="game-icon" />
<svg-icon
v-if="item.game_type == 1"
icon-class="wxgame"
class="game-icon"
/>
<svg-icon
v-else-if="item.game_type == 5"
icon-class="douyin"
class="game-icon"
/>
<svg-icon
v-else-if="item.game_type == 3"
icon-class="Android"
class="game-icon"
/>
<svg-icon
v-else-if="item.game_type == 4"
icon-class="IOS"
class="game-icon"
/>
<svg-icon
v-else-if="item.game_type == 2"
icon-class="H5"
class="game-icon"
/>
{{ item.game_text }}
</div>
</template>
<div v-if="item.children && item.children.length > 0">
<div v-for="(items, indexs) in item.children" :key="indexs"
class="gameListItem rowFlex columnCenter spaceBetween">
<p>{{ items.game_name + '/' + items.game_id }}</p>
<el-button slot="reference" size="mini" :disabled="accountSelect == ''"
@click="sendChannel(items)">发送</el-button>
<div
v-for="(items, indexs) in item.children"
:key="indexs"
class="gameListItem rowFlex columnCenter spaceBetween"
>
<p>{{ items.game_name + "/" + items.game_id }}</p>
<el-button
slot="reference"
size="mini"
:disabled="accountSelect == ''"
@click="sendChannel(items)"
>发送</el-button
>
</div>
</div>
<div v-else-if="gameLoding" class="channelLoading rowFlex allCenter">
<div
v-else-if="gameLoding"
class="channelLoading rowFlex allCenter"
>
<i class="el-icon-loading"></i>
<el-button type="text">加载中</el-button>
</div>
......@@ -89,7 +196,12 @@
</el-collapse>
<div class="createChannel rowFlex allCenter">
<span class="label">找不到对应游戏的链接点此</span>
<el-button type="text" size="medium" @click="showCreateChannel = true">新建渠道链接</el-button>
<el-button
type="text"
size="medium"
@click="showCreateChannel = true"
>新建渠道链接</el-button
>
</div>
</div>
<!--
......@@ -100,21 +212,53 @@
-->
<div v-else-if="activeName == '2'">
<el-collapse :disabled="disabled">
<el-input v-model="filterGameText" placeholder="请输入游戏名 按回车搜索" style="margin-top: 10px"
@keydown.enter.native="changeGameText" @blur="changeGameText">
<el-input
v-model="filterGameText"
placeholder="请输入游戏名 按回车搜索"
style="margin-top: 10px"
@keydown.enter.native="changeGameText"
@blur="changeGameText"
>
<i slot="prefix" class="el-input__icon el-icon-search"></i>
</el-input>
<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">
<div class="title-with-icon">
<svg-icon v-if="item.label.includes('微信')" icon-class="wxgame" class="game-icon" />
<svg-icon v-else-if="item.label.includes('抖音')" icon-class="douyin" class="game-icon" />
<svg-icon v-else-if="item.label.includes('安卓')" icon-class="Android" class="game-icon" />
<svg-icon
v-else-if="item.label.includes('IOS') || item.label.includes('iOS') || item.label.includes('ios')"
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" />
v-if="item.label.includes('微信')"
icon-class="wxgame"
class="game-icon"
/>
<svg-icon
v-else-if="item.label.includes('抖音')"
icon-class="douyin"
class="game-icon"
/>
<svg-icon
v-else-if="item.label.includes('安卓')"
icon-class="Android"
class="game-icon"
/>
<svg-icon
v-else-if="
item.label.includes('IOS') ||
item.label.includes('iOS') ||
item.label.includes('ios')
"
icon-class="IOS"
class="game-icon"
/>
<svg-icon
v-else-if="
item.label.includes('H5') || item.label.includes('h5')
"
icon-class="H5"
class="game-icon"
/>
{{ item.label }}
</div>
</template>
......@@ -127,39 +271,64 @@
H5游戏 item.game_type == 2 icon 是 H5.svg
-->
<div v-if="regGameList.length > 0">
<div v-for="(items, indexs) in item.children" :key="indexs"
class="gameListItem rowFlex columnCenter spaceBetween">
<div
v-for="(items, indexs) in item.children"
:key="indexs"
class="gameListItem rowFlex columnCenter spaceBetween"
>
<p>{{ items.label + "/" + items.id }}</p>
<!--game_type: 1 微信小游戏 2 H5 游戏 3 安卓游戏 4 IOS 游戏 5 抖音小游戏 -->
<!-- 微信小游戏 安卓游戏 IOS游戏 处理逻辑 -->
<el-popover v-if="items.game_type == 1 || items.game_type == 3 || items.game_type == 4"
placement="top" trigger="click">
<el-popover
v-if="
items.game_type == 1 ||
items.game_type == 3 ||
items.game_type == 4
"
placement="top"
trigger="click"
>
<p class="sendLink" @click="sendChannelGame(items, item)">
发送链接/渠道二维码
</p>
<p class="sendLink" @click="handleGameType(items, item, item.game_type, index)">
<p
class="sendLink"
@click="
handleGameType(items, item, item.game_type, index)
"
>
发送落地页
</p>
<div v-if="items.game_type == 1">
<!-- 发送 H5 安卓分身包 -->
<p
class="sendLink"
@click="sendH5CloneGame(items,'android')"
@click="sendH5CloneGame(items, 'android')"
>
发送H5-安卓分身包
</p>
<!-- 发送 H5 IOS 分身包 -->
<p
class="sendLink"
@click="sendH5CloneGame(items,'ios')"
@click="sendH5CloneGame(items, 'ios')"
>
发送H5-IOS分身包
</p>
</div>
<el-button slot="reference" size="mini" :disabled="accountSelect == ''">发送</el-button>
<el-button
slot="reference"
size="mini"
:disabled="accountSelect == ''"
>发送</el-button
>
</el-popover>
<el-button v-else size="mini" :disabled="accountSelect == ''"
@click="noH5AndroidIOSGame(items, item)">发送</el-button>
<el-button
v-else
size="mini"
:disabled="accountSelect == ''"
@click="noH5AndroidIOSGame(items, item)"
>发送</el-button
>
</div>
</div>
<!-- <div
......@@ -170,12 +339,16 @@
<el-button type="text">加载中</el-button>
</div> -->
<div v-else class="rowFlex allCenter">暂无游戏</div>
</el-collapse-item>
</el-collapse>
<div class="createChannel rowFlex allCenter">
<span class="label">找不到对应游戏的链接点此</span>
<el-button type="text" size="medium" @click="showCreateChannel = true">新建渠道链接</el-button>
<el-button
type="text"
size="medium"
@click="showCreateChannel = true"
>新建渠道链接</el-button
>
</div>
</div>
</div>
......@@ -184,23 +357,62 @@
<p>暂未绑定关联账号,请先去绑定账号</p>
</div>
<!-- 新建渠道链接 -->
<createChannel v-if="showCreateChannel" :type="activeName" :show="showCreateChannel" :game-user-info="gameUserInfo"
@close="showCreateChannel = false" />
<sendPage v-if="showSendPage" :show.sync="showSendPage" :game-list="conversionGameList" @confirm="startSendPage" />
<createChannel
v-if="showCreateChannel"
:type="activeName"
:show="showCreateChannel"
:game-user-info="gameUserInfo"
@close="showCreateChannel = false"
/>
<sendPage
v-if="showSendPage"
:show.sync="showSendPage"
:game-list="conversionGameList"
@confirm="startSendPage"
/>
<!-- 小游戏转游判断 -->
<SendTransWxGame v-if="showWxGameDrawer" :show.sync="showWxGameDrawer" :game-list="selectedWxGameList"
:chat-user-info="chatUserInfo" @close="SendTransWxGameClose" @confirm="handleWxGameConfirm" />
<SendTransAppGame v-if="showAppGameDrawer" :show.sync="showAppGameDrawer" :game-list="selectedAppGameList"
:chat-user-info="chatUserInfo" @close="SendTransAppGameClose" @confirm="handleAppGameConfirm" />
<SendTransWxGame
v-if="showWxGameDrawer"
:show.sync="showWxGameDrawer"
:game-list="selectedWxGameList"
:chat-user-info="chatUserInfo"
@close="SendTransWxGameClose"
@confirm="handleWxGameConfirm"
/>
<SendTransAppGame
v-if="showAppGameDrawer"
:show.sync="showAppGameDrawer"
:game-list="selectedAppGameList"
:chat-user-info="chatUserInfo"
@close="SendTransAppGameClose"
@confirm="handleAppGameConfirm"
/>
<!-- 选择发送渠道 -->
<selectChannel v-if="showLayer" :show.sync="showLayer" :chat-user="chatUserInfo"
:channel-info-list="channelInfoList" />
<selectChannel
v-if="showLayer"
:show.sync="showLayer"
:chat-user="chatUserInfo"
:channel-info-list="channelInfoList"
/>
<!-- 如果选择发送的渠道链接只有一个 直接发送 -->
<sendSelectChannel :show.sync="showSendChannel" :chat-user="chatUserInfo" :channel-info-list="channelInfoList" />
<sendSelectChannel
:show.sync="showSendChannel"
:chat-user="chatUserInfo"
:channel-info-list="channelInfoList"
/>
<!-- 二维码生成组件 (隐藏) -->
<div v-show="false" class="qrcode-container">
<qrcode-vue
ref="qrcode"
:value="qrCodeValue"
:size="qrCodeSize"
level="H"
></qrcode-vue>
</div>
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex'
import { mapState, mapMutations, mapActions } from "vuex";
import {
memberExtensionGameList,
passwardEncryption,
......@@ -213,21 +425,29 @@ import {
getLandingPageMemberLink,
getClonePackageLink,
getLandingPageConfig,
getMemberTransStatus
} from '@/api/game'
import { getRecentSendLog, markTransScene, getZqCserGroup, getZqCserWxBelong, getMediaId, send_log_add } from '@/api/works'
import { companyviewConfig } from '@/api/user'
import { throttle, throttleStart } from '@/utils/index'
import createChannel from './sendGame/createChannel'
import sendPage from './sendGame/SendTransPage.vue'
import SendTransWxGame from './sendGame/SendTransWxGame.vue'
import SendTransAppGame from './sendGame/SendTransAppGame.vue'
import selectChannel from './sendGame/selectChannel.vue'
import sendSelectChannel from './sendGame/sendSelectChannel.vue'
import gameLogMixin from '@/mixins/gameLogMixin'
import { sendChatMessage } from '@/utils/index'
getMemberTransStatus,
} from "@/api/game";
import {
getRecentSendLog,
markTransScene,
getZqCserGroup,
getZqCserWxBelong,
getMediaId,
send_log_add,
} from "@/api/works";
import { companyviewConfig } from "@/api/user";
import { throttle, throttleStart } from "@/utils/index";
import createChannel from "./sendGame/createChannel";
import sendPage from "./sendGame/SendTransPage.vue";
import SendTransWxGame from "./sendGame/SendTransWxGame.vue";
import SendTransAppGame from "./sendGame/SendTransAppGame.vue";
import selectChannel from "./sendGame/selectChannel.vue";
import sendSelectChannel from "./sendGame/sendSelectChannel.vue";
import gameLogMixin from "@/mixins/gameLogMixin";
import { sendChatMessage } from "@/utils/index";
import QrcodeVue from "qrcode.vue";
export default {
name: 'sendGame',
name: "sendGame",
mixins: [gameLogMixin],
components: {
createChannel,
......@@ -235,7 +455,8 @@ export default {
SendTransWxGame,
SendTransAppGame,
selectChannel,
sendSelectChannel
sendSelectChannel,
QrcodeVue,
},
data() {
return {
......@@ -250,15 +471,15 @@ export default {
weixin_blongs_id: [],
regGameList: [],
allRegGameList: [],
filterGameText: '',
filterGameText: "",
channelselectList: [],
webForm: {
channel_id: ''
channel_id: "",
},
sendLoading: false,
belongList: [], // 项目列表
activeName: '1', // 转端 1 转游 2 召回 3
sendType: '', // 1 进发送链接 2 仅发送账号密码 3 发送链接和账号密码
activeName: "1", // 转端 1 转游 2 召回 3
sendType: "", // 1 进发送链接 2 仅发送账号密码 3 发送链接和账号密码
showCreateChannel: false,
showImageComposer: false,
showWxGameDrawer: false,
......@@ -270,206 +491,227 @@ export default {
showLayer: false,
showSendChannel: false,
channelInfoList: {},
transMemberStatus: true
}
transMemberStatus: true,
qrCodeValue: "", // 二维码内容
qrCodeSize: 200, // 二维码大小
};
},
mounted() {
this.initDisable()
this.sendGameInfo()
this.initDisable();
this.sendGameInfo();
},
computed: {
...mapState('game', ['accountSelect', 'bindGameUserList', 'chatUserInfo', 'gameUserInfo', 'send_game_log']),
...mapState('user', ['userInfo', 'corp_id'])
...mapState("game", [
"accountSelect",
"bindGameUserList",
"chatUserInfo",
"gameUserInfo",
"send_game_log",
]),
...mapState("user", ["userInfo", "corp_id"]),
},
// props: [ 'chatUserInfo', 'chatUser'],
watch: {
accountSelect(newVal, oldVal) {
// 切换 w 账号的时候清空 conversionGameList 数据
this.conversionGameList = []
this.getMemberTransStatus()
if (newVal && newVal !== '' && this.bindGameUserList.length > 0) {
this.disabled = false
this.conversionGameList = [];
this.getMemberTransStatus();
if (newVal && newVal !== "" && this.bindGameUserList.length > 0) {
this.disabled = false;
} else {
this.disabled = true
this.disabled = true;
}
},
activeName(newVal, oldVal) {
if (newVal) {
}
}
},
},
methods: {
...mapMutations('game', ['set_send_game_log']),
...mapMutations("game", ["set_send_game_log"]),
initDisable() {
// 切换 w 账号的时候清空 conversionGameList 数据
this.conversionGameList = []
this.getMemberTransStatus()
if (this.accountSelect && this.accountSelect !== '' && this.bindGameUserList.length > 0) {
this.disabled = false
this.conversionGameList = [];
this.getMemberTransStatus();
if (
this.accountSelect &&
this.accountSelect !== "" &&
this.bindGameUserList.length > 0
) {
this.disabled = false;
} else {
this.disabled = true
this.disabled = true;
}
},
channelInfo(info) {
this.channelInfoList = info
this.channelInfoList = info;
// 只有 1 个渠道的时候 直接发送不出现弹窗
if (info.channelList.length === 1) {
this.showSendChannel = true
this.showSendChannel = true;
} else {
this.showLayer = true
this.showLayer = true;
}
},
async sendH5CloneGame(items, type) {
const res = await getClonePackageLink({ mini_game_id: items.id })
if (res.status_code == 1 ) {
if(type == 'android' && !res?.data?.data?.android_download_url){
this.$message.warning('安卓分身包链接不存在,请联系掌游配置')
return
}else if(type == 'ios' && !res?.data?.data?.ios_download_url){
this.$message.warning('IOS分身包链接不存在,请联系掌游配置')
return
}
let srt = ''
if(type == 'android'){
srt = '安卓分身包链接: '+res.data.data.android_download_url
}else{
srt = 'IOS分身包链接: '+res.data.data.ios_download_url
}
sendChatMessage(srt,'text')
}else{
this.$message.warning(res.msg)
const res = await getClonePackageLink({ mini_game_id: items.id });
if (res.status_code == 1) {
if (type == "android" && !res?.data?.data?.android_download_url) {
this.$message.warning("安卓分身包链接不存在,请联系掌游配置");
return;
} else if (type == "ios" && !res?.data?.data?.ios_download_url) {
this.$message.warning("IOS分身包链接不存在,请联系掌游配置");
return;
}
let srt = "";
if (type == "android") {
srt = "安卓分身包链接: " + res.data.data.android_download_url;
} else {
srt = "IOS分身包链接: " + res.data.data.ios_download_url;
}
sendChatMessage(srt, "text");
} else {
this.$message.warning(res.msg);
}
},
requestConfig() {
return new Promise((resolve, reject) => {
companyviewConfig({ corp_id: this.corp_id }).then((res) => {
this.weixin_blongs_id = res.data.weixin_blongs_id
resolve()
})
})
this.weixin_blongs_id = res.data.weixin_blongs_id;
resolve();
});
});
},
// 请求当前 W 账号是否符合转端条件 如果不符合 提示 当前w账号不满足转端要求,请联系组长处理
async getMemberTransStatus() {
if (this.accountSelect && this.accountSelect !== '') {
const res = await getMemberTransStatus({ member_id: this.accountSelect })
if (this.accountSelect && this.accountSelect !== "") {
const res = await getMemberTransStatus({
member_id: this.accountSelect,
});
if (res.status_code == 1) {
this.transMemberStatus = res.data.data.allow_trans || false
this.transMemberStatus = res.data.data.allow_trans || false;
}
} else {
this.transMemberStatus = false
this.transMemberStatus = false;
}
},
recallTabChange() {
this.activeName = '3'
this.sendGameRecallList()
this.activeName = "3";
this.sendGameRecallList();
},
async requestGameSendLog() {
this.filterGameText = ''
const res = await getRecentSendLog()
this.filterGameText = "";
const res = await getRecentSendLog();
if (res.status_code == 1) {
if (res.status_code == 1 && res.data.length > 0) {
res.data.map((item) => {
item.label = item.game_name
item.id = item.game_id
})
item.label = item.game_name;
item.id = item.game_id;
});
}
// 检查是否已经存在"最近发送"项
const recentSendIndex = this.regGameList.findIndex(item => item.label === '最近发送')
const recentSendIndex = this.regGameList.findIndex(
(item) => item.label === "最近发送"
);
if (recentSendIndex !== -1) {
// 如果已存在,更新它
this.$set(this.regGameList[recentSendIndex], 'children', res.data)
this.$set(this.regGameList[recentSendIndex], "children", res.data);
} else {
// 如果不存在,添加它
this.regGameList.unshift({
label: '最近发送',
children: res.data
})
label: "最近发送",
children: res.data,
});
}
}
},
async sendGameInfo() {
this.activeName = '1'
this.conversionGameList = []
this.recallGameList = []
this.getMemberTransStatus()
await this.requestConfig()
this.sendGameList()
this.activeName = "1";
this.conversionGameList = [];
this.recallGameList = [];
this.getMemberTransStatus();
await this.requestConfig();
this.sendGameList();
},
requestRegGameList() {
this.activeName = '2'
if (this.gameUserInfo.main_game_id || this.gameUserInfo.main_game_id == 0) {
this.contentLoading = true
this.activeName = "2";
if (
this.gameUserInfo.main_game_id ||
this.gameUserInfo.main_game_id == 0
) {
this.contentLoading = true;
const data = {
type: 'gameListWithType',
value: '',
type: "gameListWithType",
value: "",
use_type: 2,
game_id: this.gameUserInfo.main_game_id,
use_user_id: this.userInfo.id,
weixin_blongs_id: this.weixin_blongs_id
}
weixin_blongs_id: this.weixin_blongs_id,
};
selectSearch(data).then((res) => {
this.contentLoading = false
this.contentLoading = false;
if (res.status_code == 1) {
// 暂时隐藏快手小游戏
const ksGameIndex = res.data.data.findIndex(item => item.label === '快手小游戏')
const ksGameIndex = res.data.data.findIndex(
(item) => item.label === "快手小游戏"
);
if (ksGameIndex !== -1) {
res.data.data.splice(ksGameIndex, 1)
res.data.data.splice(ksGameIndex, 1);
}
this.regGameList = res.data.data
this.allRegGameList = this.regGameList
this.regGameList = res.data.data;
this.allRegGameList = this.regGameList;
}
this.requestGameSendLog()
this.requestGameSendLog();
setTimeout(() => {
this.contentLoading = false
}, 2000)
})
this.contentLoading = false;
}, 2000);
});
} else {
}
},
onConfirm() { },
onConfirm() {},
// 召回发送渠道
sendChannel(items, type) {
items.type = 3
type ? this.sendType = type : ''
this.channelList(items)
items.type = 3;
type ? (this.sendType = type) : "";
this.channelList(items);
},
// 转游发送渠道
sendChannelGame(items, item, type) {
console.log(items, 'items', item)
type ? this.sendType = type : ''
const gameInfo = this.$clone(items)
gameInfo.type = 2
this.channelList(gameInfo)
console.log(items, "items", item);
type ? (this.sendType = type) : "";
const gameInfo = this.$clone(items);
gameInfo.type = 2;
this.channelList(gameInfo);
},
changeGameText() {
console.log(this.filterGameText)
if (this.filterGameText.trim() === '') {
this.regGameList = this.allRegGameList
console.log(this.filterGameText);
if (this.filterGameText.trim() === "") {
this.regGameList = this.allRegGameList;
} else {
const list = JSON.parse(JSON.stringify(this.allRegGameList))
const list = JSON.parse(JSON.stringify(this.allRegGameList));
list.map((item, index) => {
item.children = item.children.filter(
(items) => items.label.indexOf(this.filterGameText) !== -1
)
})
this.regGameList = list
);
});
this.regGameList = list;
}
},
// 获取渠道列表
channelList(items) {
console.log(items, 'items')
console.log(items, "items");
const data = {
game_id: items.game_id || items.id,
page_size: 200,
page: 1,
zq_user_id: this.userInfo.id,
weixin_blongs_id: items.weixin_blongs_id ? [items.weixin_blongs_id] : this.weixin_blongs_id,
request_system: 'company_wx',
weixin_blongs_id: items.weixin_blongs_id
? [items.weixin_blongs_id]
: this.weixin_blongs_id,
request_system: "company_wx",
member_id: this.accountSelect,
use_type: this.activeName
}
use_type: this.activeName,
};
channelList(data).then((res) => {
if (res?.data?.data?.data?.length > 0) {
// 只有一个的时候自动发送渠道链接
......@@ -477,89 +719,94 @@ export default {
game_id: items.game_id || items.id,
use_type: this.activeName,
sendType: this.sendType,
channelList: res.data.data.data
}
channelList: res.data.data.data,
};
// 只有 1 个渠道的时候 直接发送不出现弹窗
if (this.channelInfoList.channelList.length === 1) {
this.showSendChannel = true
this.showSendChannel = true;
} else {
this.showLayer = true
this.showLayer = true;
}
this.sendGameLog(items)
this.sendGameLog(items);
} else {
this.$message.warning('请到掌游创建运营渠道')
this.$message.warning("请到掌游创建运营渠道");
}
})
});
},
showSendGameLayer() {
this.showLayer = true
this.showLayer = true;
},
async sendGameList() {
if (this.conversionGameList.length == 0) {
this.contentLoading = true
this.contentLoading = true;
// 获取召回转端的游戏列表 user_type: 1 转端 3 召回
const res = await getGameConfig({ use_type: 1 })
this.contentLoading = false
const res = await getGameConfig({ use_type: 1 });
this.contentLoading = false;
if (res.status_code === 1 && res.data.data.length > 0) {
const ksGameIndex = res.data.data.findIndex(item => item.game_type == 6)
const ksGameIndex = res.data.data.findIndex(
(item) => item.game_type == 6
);
if (ksGameIndex != -1) {
res.data.data.splice(ksGameIndex, 1)
this.conversionGameList = res.data.data
res.data.data.splice(ksGameIndex, 1);
this.conversionGameList = res.data.data;
} else {
this.conversionGameList = res.data.data
this.conversionGameList = res.data.data;
}
}
setTimeout(() => {
this.contentLoading = false
}, 2000)
this.contentLoading = false;
}, 2000);
}
},
async conversionChangeOld(value) {
console.log('请求数据', this.conversionGameList)
console.log("请求数据", this.conversionGameList);
if (this.isReqeustData) {
return
return;
}
try {
this.isReqeustData = true
this.gameLoding = true
this.isReqeustData = true;
this.gameLoding = true;
// 使用 Promise.all 并发请求游戏列表数据
const promiseList = this.conversionGameList.map(async (item, index) => {
// 如果已有子项数据则跳过
if (this.conversionGameList[index].children?.length > 0) {
return
return;
}
try {
const params = {
member_id: this.accountSelect,
type: item.game_type
}
const reslist = await memberExtensionGameList(params)
type: item.game_type,
};
const reslist = await memberExtensionGameList(params);
if (reslist.status_code === 1) {
// 使用解构赋值简化数据设置
const updates = {
children: reslist.data?.length > 0 ? reslist.data : [],
send_trans_page_id: '', // 转端要发送的游戏 ID
isReqeustData: true
}
send_trans_page_id: "", // 转端要发送的游戏 ID
isReqeustData: true,
};
Object.entries(updates).forEach(([key, value]) => {
this.$set(this.conversionGameList[index], key, value)
})
this.$set(this.conversionGameList[index], key, value);
});
}
} catch (error) {
console.error(`Failed to fetch game list for index ${index}:`, error)
console.error(
`Failed to fetch game list for index ${index}:`,
error
);
// 设置空数组作为默认值
this.$set(this.conversionGameList[index], 'children', [])
this.$set(this.conversionGameList[index], "children", []);
}
})
});
await Promise.all(promiseList)
this.handleConversionGameList()
await Promise.all(promiseList);
this.handleConversionGameList();
} catch (error) {
console.error('Failed to fetch conversion game lists:', error)
console.error("Failed to fetch conversion game lists:", error);
} finally {
this.gameLoding = false
this.isReqeustData = false
this.gameLoding = false;
this.isReqeustData = false;
}
},
// 处理转端数据 之前王鑫和冯渊说要隐藏破日开天游戏 至于什么时候放开 没说
......@@ -567,38 +814,72 @@ export default {
if (this.conversionGameList.length > 0) {
this.conversionGameList.forEach((item, index) => {
// 隐藏 h5的游戏 912:神权之战 784:荣耀时刻
if (item.game_type === 2 && item.children && item.children.length > 0) {
const filteredChildren = item.children.filter(child => {
return child.game_id !== '912' && child.game_id != '784'
})
this.$set(this.conversionGameList[index], 'children', filteredChildren)
if (
item.game_type === 2 &&
item.children &&
item.children.length > 0
) {
const filteredChildren = item.children.filter((child) => {
return child.game_id !== "912" && child.game_id != "784";
});
this.$set(
this.conversionGameList[index],
"children",
filteredChildren
);
}
// 隐藏安卓游戏 安卓游戏 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 为"破日开天"的数据
const filteredChildren = item.children.filter(child => {
return child.game_name !== '破日开天' && child.game_name !== '英雄霸业' && child.game_id !== '741' && child.game_id !== '912'
})
this.$set(this.conversionGameList[index], 'children', filteredChildren)
const filteredChildren = item.children.filter((child) => {
return (
child.game_name !== "破日开天" &&
child.game_name !== "英雄霸业" &&
child.game_id !== "741" &&
child.game_id !== "912"
);
});
this.$set(
this.conversionGameList[index],
"children",
filteredChildren
);
}
// 隐藏 IOS 游戏 雄霸天下 有两个包 1 个是 691 一个是 819 王鑫说 暂时先隐藏 691 的功能
if (item.game_type === 4 && item.children && item.children.length > 0) {
const filteredChildren = item.children.filter(child => {
return Number(child.game_id) !== 691
})
this.$set(this.conversionGameList[index], 'children', filteredChildren)
}
})
console.log(this.conversionGameList, 'conversionGameList')
if (
item.game_type === 4 &&
item.children &&
item.children.length > 0
) {
const filteredChildren = item.children.filter((child) => {
return Number(child.game_id) !== 691;
});
this.$set(
this.conversionGameList[index],
"children",
filteredChildren
);
}
});
console.log(this.conversionGameList, "conversionGameList");
}
},
// 转端展开
async conversionChange(value) {
if (value && value.length > 0) {
const gameType = value[value.length - 1]
const gameIndex = this.conversionGameList.findIndex(item => item.game_type === gameType)
if (!this.conversionGameList[gameIndex].children || this.conversionGameList[gameIndex].children.length == 0) {
this.gameLoding = true
const gameType = value[value.length - 1];
const gameIndex = this.conversionGameList.findIndex(
(item) => item.game_type === gameType
);
if (
!this.conversionGameList[gameIndex].children ||
this.conversionGameList[gameIndex].children.length == 0
) {
this.gameLoding = true;
const params = {
page_size: 200,
page: 1,
......@@ -606,50 +887,60 @@ export default {
weixin_blongs_id: this.weixin_blongs_id,
use_type: 1,
member_id: this.accountSelect,
type: this.conversionGameList[gameIndex].game_type
}
const reslist = await getTransferRecallGameList(params)
this.gameLoding = false
type: this.conversionGameList[gameIndex].game_type,
};
const reslist = await getTransferRecallGameList(params);
this.gameLoding = false;
if (reslist.status_code === 1 && reslist.data.data.length > 0) {
this.$set(this.conversionGameList[gameIndex], 'children', reslist.data.data)
this.$set(
this.conversionGameList[gameIndex],
"children",
reslist.data.data
);
} else {
this.$set(this.conversionGameList[gameIndex], 'children', [])
this.$set(this.conversionGameList[gameIndex], "children", []);
}
setTimeout(() => {
this.gameLoding = false
}, 2000)
this.gameLoding = false;
}, 2000);
} else {
}
}
},
// 召回的游戏列表
async sendGameRecallList() {
if (this.recallGameList.length == 0) {
this.contentLoading = true
const res = await getGameConfig({ use_type: 3 })
this.contentLoading = false
this.contentLoading = true;
const res = await getGameConfig({ use_type: 3 });
this.contentLoading = false;
if (res.status_code === 1 && res.data.data.length > 0) {
const ksGameIndex = res.data.data.findIndex(item => item.game_type == 6)
const ksGameIndex = res.data.data.findIndex(
(item) => item.game_type == 6
);
if (ksGameIndex !== -1) {
res.data.data.splice(ksGameIndex, 1)
this.recallGameList = res.data.data
res.data.data.splice(ksGameIndex, 1);
this.recallGameList = res.data.data;
} else {
this.recallGameList = res.data.data
this.recallGameList = res.data.data;
}
}
setTimeout(() => {
this.contentLoading = false
}, 2000)
this.contentLoading = false;
}, 2000);
}
},
// 召回展开
async recallChange(value) {
if (value && value.length > 0) {
const gameType = value[value.length - 1]
const gameIndex = this.recallGameList.findIndex(item => item.game_type === gameType)
if (!this.recallGameList[gameIndex].children || this.recallGameList[gameIndex].children.length == 0) {
this.gameLoding = true
const gameType = value[value.length - 1];
const gameIndex = this.recallGameList.findIndex(
(item) => item.game_type === gameType
);
if (
!this.recallGameList[gameIndex].children ||
this.recallGameList[gameIndex].children.length == 0
) {
this.gameLoding = true;
const params = {
// type: 2,
page_size: 200,
......@@ -658,86 +949,90 @@ export default {
weixin_blongs_id: this.weixin_blongs_id,
use_type: 3,
member_id: this.accountSelect,
type: this.recallGameList[gameIndex].game_type
}
const reslist = await getTransferRecallGameList(params)
this.gameLoding = false
type: this.recallGameList[gameIndex].game_type,
};
const reslist = await getTransferRecallGameList(params);
this.gameLoding = false;
if (reslist.status_code === 1 && reslist.data.data.length > 0) {
this.$set(this.recallGameList[gameIndex], 'children', reslist.data.data)
this.$set(
this.recallGameList[gameIndex],
"children",
reslist.data.data
);
} else {
this.$set(this.recallGameList[gameIndex], 'children', [])
this.$set(this.recallGameList[gameIndex], "children", []);
}
setTimeout(() => {
this.gameLoding = false
}, 2000)
this.gameLoding = false;
}, 2000);
} else {
console.log('之前请求过了')
console.log("之前请求过了");
}
}
},
showPopover() {
this.showCreateChannel = false
this.isReqeustData = false
this.showCreateChannel = false;
this.isReqeustData = false;
},
handlePopover() {
this.showCreateChannel = false
this.showCreateChannel = false;
},
handleAccount() {
if (this.bindGameUserList.length > 0) {
const account = this.bindGameUserList.find(
(item) => item.member_id == this.accountSelect
)
);
if (account) {
return true
return true;
} else {
return false
return false;
}
} else {
return false
return false;
}
},
sendLink: throttle(function (item, type) {
if (!this.transMemberStatus) {
this.$message.warning('当前w账号不满足转端要求,请联系组长处理')
return
this.$message.warning("当前w账号不满足转端要求,请联系组长处理");
return;
}
console.log(item, '转端发送仅发送链接')
const result = this.handleAccount()
console.log(item, "转端发送仅发送链接");
const result = this.handleAccount();
if (!result) {
this.$message.warning('请稍后再试')
return false
this.$message.warning("请稍后再试");
return false;
}
let str = ''
let str = "";
if (type == 2) {
str = '网页游戏链接:'
str = "网页游戏链接:";
} else if (type == 3) {
str = '安卓游戏链接:'
str = "安卓游戏链接:";
} else if (type == 4) {
str = 'IOS游戏链接:'
str = "IOS游戏链接:";
} else {
}
// const list = [
// { msgtype: 'text', text: { content: `${str}${item.url}` }}
// ]
this.sendChatMessage(`${str}${item.url}`, 'text')
this.markTransScene(type)
item.type = 1
this.sendGameLog(item)
this.sendChatMessage(`${str}${item.url}`, "text");
this.markTransScene(type);
item.type = 1;
this.sendGameLog(item);
}, 500),
sendPassword: throttle(function (item, type) {
if (!this.transMemberStatus) {
this.$message.warning('当前w账号不满足转端要求,请联系组长处理')
return
this.$message.warning("当前w账号不满足转端要求,请联系组长处理");
return;
}
console.log(item, '转端仅发送账号密码')
const result = this.handleAccount()
console.log(item, "转端仅发送账号密码");
const result = this.handleAccount();
if (!result) {
this.$message.warning('请稍后再试')
return false
this.$message.warning("请稍后再试");
return false;
}
const username = this.bindGameUserList.find(
(items) => items.member_id == this.accountSelect
).username
).username;
passwardEncryption({ member_id: this.accountSelect })
.then((res) => {
// const list = [
......@@ -747,132 +1042,239 @@ export default {
// }
// ]
// this.set_sendSkillMessage(list)
this.sendChatMessage(`账号:${username} \n密码:${res.data.password}`, 'text')
this.markTransScene(type)
this.sendGameLog(item)
this.sendChatMessage(
`账号:${username} \n密码:${res.data.password}`,
"text"
);
this.markTransScene(type);
this.sendGameLog(item);
})
.catch((err) => {
const list = [
{ msgtype: 'text', text: { content: `账号:${username}` } }
]
{ msgtype: "text", text: { content: `账号:${username}` } },
];
// this.set_sendSkillMessage(list)
this.sendChatMessage(`账号:${username}`, 'text')
item.type = 1
this.sendGameLog(item)
console.log(err)
})
this.sendChatMessage(`账号:${username}`, "text");
item.type = 1;
this.sendGameLog(item);
console.log(err);
});
}, 500),
sendMessage: throttle(function (item, type) {
if (!this.transMemberStatus) {
this.$message.warning('当前w账号不满足转端要求,请联系组长处理')
return
this.$message.warning("当前w账号不满足转端要求,请联系组长处理");
return;
}
const result = this.handleAccount()
const result = this.handleAccount();
if (!result) {
this.$message.warning('请稍后再试')
return false
this.$message.warning("请稍后再试");
return false;
}
let str = ''
let str = "";
if (type == 2) {
str = '网页游戏链接:'
str = "网页游戏链接:";
} else if (type == 3) {
str = '安卓游戏链接:'
str = "安卓游戏链接:";
} else if (type == 4) {
str = 'IOS游戏链接:'
str = "IOS游戏链接:";
} else {
}
const username = this.bindGameUserList.find(
(items) => items.member_id == this.accountSelect
).username
).username;
passwardEncryption({ member_id: this.accountSelect })
.then((res) => {
const list = [
{
msgtype: 'text',
msgtype: "text",
text: {
content: `${str}${item.url} \n账号:${username} \n密码:${res.data.password}`,
key: res.data.key, iv: res.data.iv
}
}
]
key: res.data.key,
iv: res.data.iv,
},
},
];
// this.set_sendSkillMessage(list)
this.sendChatMessage(`${str}${item.url} \n账号:${username} \n密码:${res.data.password}`, 'text')
this.markTransScene(type)
item.type = 1
this.sendGameLog(item)
this.sendChatMessage(
`${str}${item.url} \n账号:${username} \n密码:${res.data.password}`,
"text"
);
this.markTransScene(type);
item.type = 1;
this.sendGameLog(item);
})
.catch((err) => {
const list = [
{
msgtype: 'text',
text: { content: `${str}${item.url} \n账号:${username}` }
}
]
msgtype: "text",
text: { content: `${str}${item.url} \n账号:${username}` },
},
];
// this.set_sendSkillMessage(list)
this.sendChatMessage(`${str}${item.url} \n账号:${username}`, 'text')
this.sendGameLog(item)
console.log(err)
})
this.sendChatMessage(`${str}${item.url} \n账号:${username}`, "text");
this.sendGameLog(item);
console.log(err);
});
}, 500),
// 发送游戏落地页
startSendPage(value) {
console.log(value, 'value')
console.log(value, "value");
// this.set_sendSkillMessage(list)
this.getMediaId(value, 'image')
this.getMediaId(value, "image");
},
// 转端发送落地页面
sendDownLoadPage: throttleStart(function (items, type, index) {
if (!this.transMemberStatus) {
this.$message.warning('当前w账号不满足转端要求,请联系组长处理')
return
this.$message.warning("当前w账号不满足转端要求,请联系组长处理");
return;
}
this.$set(
this.conversionGameList[index],
"send_trans_page_id",
items.game_id
);
this.showSendPage = true;
}, 500),
// 转端发送游戏二维码
sendDownLoadQrCode: throttleStart(async function (items, type, index) {
if (!this.transMemberStatus) {
this.$message.warning("当前w账号不满足转端要求,请联系组长处理");
return;
}
const result = this.handleAccount();
if (!result) {
this.$message.warning("请稍后再试");
return false;
}
try {
this.sendLoading = true;
// 获取游戏落地页链接
let landingPageUrl = "";
if (items.url) {
landingPageUrl = items.url;
}
if (!landingPageUrl) {
this.$message.error("没有有效的链接可生成二维码");
return;
}
// 设置二维码内容
this.qrCodeValue = landingPageUrl;
// 等待DOM更新,确保二维码已生成
await this.$nextTick();
// 获取二维码canvas并转换为Blob
const canvas = this.$refs.qrcode.$el.querySelector("canvas");
if (!canvas) {
throw new Error("获取二维码canvas失败");
}
const blob = await new Promise((resolve) => {
canvas.toBlob((blob) => {
resolve(blob);
}, "image/png");
});
// 创建File对象
blob.name = "qrcode.png";
// 上传图片
const uploadConfig = {
dir: "/company_wx/service/avatars/",
};
const uploadResult = await this.uploading(blob, uploadConfig);
debugger;
if (uploadResult.data) {
// 发送上传后的链接
// const list = [
// {
// msgtype: "image",
// image: {
// picurl: uploadResult.data,
// },
// },
// ];
// const image = {
// picurl: uploadResult.data,
// };
// console.log(image, 12312321);
this.sendChatMessage(uploadResult.data, "image");
this.markTransScene(type);
items.type = 1;
this.sendGameLog(items);
this.$message.success("二维码发送成功");
} else {
throw new Error("上传失败");
}
} catch (error) {
console.error("发送二维码失败:", error);
this.$message.error("发送二维码失败,请重试");
} finally {
this.sendLoading = false;
}
this.$set(this.conversionGameList[index], 'send_trans_page_id', items.game_id)
this.showSendPage = true
}, 500),
// 转端标记
async markTransScene(type) {
const data = {
external_userid: this.chatUserInfo.external_userid,
trans_scene: type
}
const res = await markTransScene(data)
trans_scene: type,
};
const res = await markTransScene(data);
if (res.status_code == 1) {
console.log('标记转端成功')
if (this.chatUserInfo.trans_scene && this.chatUserInfo.trans_scene !== '' && this.chatUserInfo.trans_scene != type) {
this.chatUserInfo.trans_scene = type
console.log("标记转端成功");
if (
this.chatUserInfo.trans_scene &&
this.chatUserInfo.trans_scene !== "" &&
this.chatUserInfo.trans_scene != type
) {
this.chatUserInfo.trans_scene = type;
}
}
},
getZqCserWxBelong() {
return new Promise(async (resolve, reject) => {
const data = {
zq_user_id: Number(this.userInfo.id)
}
const res = await getZqCserWxBelong(data)
zq_user_id: Number(this.userInfo.id),
};
const res = await getZqCserWxBelong(data);
if (res.status_code === 1 && res.data.data) {
this.belongList = res.data.data.map(item => {
this.belongList = res.data.data.map((item) => {
return {
value: item.value,
label: item.label && item.label.split('-')[0] ? item.label.split('-')[0] : ''
}
})
resolve(this.belongList)
label:
item.label && item.label.split("-")[0]
? item.label.split("-")[0]
: "",
};
});
resolve(this.belongList);
} else {
this.$message.warning('暂无绑定项目,请先绑定项目')
reject(null)
this.$message.warning("暂无绑定项目,请先绑定项目");
reject(null);
}
})
});
},
// 一键发送任务链接
async sendTaskChannel() {
let groupItem = {}
let belonsList = {}
const group = await getZqCserGroup({ zq_user_id: Number(this.userInfo.id) })
belonsList = await this.getZqCserWxBelong()
if (group.status_code == 1 && group.data.data.length > 0 && belonsList && belonsList.length > 0) {
groupItem = group.data.data[0]
const group_name_list = groupItem.label.split('-')
let groupItem = {};
let belonsList = {};
const group = await getZqCserGroup({
zq_user_id: Number(this.userInfo.id),
});
belonsList = await this.getZqCserWxBelong();
if (
group.status_code == 1 &&
group.data.data.length > 0 &&
belonsList &&
belonsList.length > 0
) {
groupItem = group.data.data[0];
const group_name_list = groupItem.label.split("-");
const data = {
blongs_name: belonsList[0].label,
member_id: this.accountSelect,
......@@ -880,27 +1282,27 @@ export default {
use_user_name: this.userInfo.username,
group_id: groupItem.value,
group_name: group_name_list[group_name_list.length - 1],
game_type: this.chatUserInfo.trans_scene || ''
}
this.sendLoading = true
game_type: this.chatUserInfo.trans_scene || "",
};
this.sendLoading = true;
try {
setTimeout(() => {
this.sendLoading = false
}, 3000)
const res = await quickRecallChannelLink(data)
this.sendLoading = false
this.sendLoading = false;
}, 3000);
const res = await quickRecallChannelLink(data);
this.sendLoading = false;
if (res.status_code == 1) {
this.sendGameInfoSave = res.data.data
this.handleSendType(res.data.data)
this.$message.success(res.msg)
this.sendGameInfoSave = res.data.data;
this.handleSendType(res.data.data);
this.$message.success(res.msg);
}
} catch (error) {
this.$message.error('获取召回链接失败,请重新再试')
this.sendLoading = false
this.$message.error("获取召回链接失败,请重新再试");
this.sendLoading = false;
}
} else {
this.$message.error('获取分组失败,请到掌权添加分组')
return
this.$message.error("获取分组失败,请到掌权添加分组");
return;
}
},
/**
......@@ -917,16 +1319,17 @@ export default {
*/
handleSendType(data) {
console.log(data, '获取一键发送的信息')
console.log(data, "获取一键发送的信息");
// 转端发送优先逻辑 不需要了 现在发送当前会话框选中的账号对应的注册游戏
data?.game_data?.game_type ? this.chatUserInfo.trans_scene = data.game_data.game_type : ''
data?.game_data?.game_type
? (this.chatUserInfo.trans_scene = data.game_data.game_type)
: "";
if (this.chatUserInfo.trans_scene && this.chatUserInfo.trans_scene != 1) {
this.sendCreateChannel(data.game_data, data.game_data.game_type)
this.sendCreateChannel(data.game_data, data.game_data.game_type);
} else {
// 没有转端标记过,发送小程序链接 判断标题和封面是否存在 存在发小程序卡片 不存在发二维码
if (data.share_data.share_title && data.share_data.share_img) {
const miniprogramInfo =
{
const miniprogramInfo = {
appid: data.share_data.app_id,
rawid: data.share_data.raw_id,
channle_id: data.share_data.channel_key,
......@@ -934,182 +1337,210 @@ export default {
title: data.share_data.share_title,
platform: 27,
page: data.share_data.page,
imgUrl: data.share_data.share_img
}
imgUrl: data.share_data.share_img,
};
// this.set_sendSkillMessage(list)
this.sendChatMessage(miniprogramInfo, 'miniprogram')
const game_data = this.$clone(data.game_data)
game_data.type = 3
console.log(game_data, 'data----------')
this.sendGameLog(game_data)
this.sendChatMessage(miniprogramInfo, "miniprogram");
const game_data = this.$clone(data.game_data);
game_data.type = 3;
console.log(game_data, "data----------");
this.sendGameLog(game_data);
} else {
// this.set_sendSkillMessage(list)
this.getMediaId(data.game_data.game_url, 'image')
this.sendGameLog(data.game_data)
this.getMediaId(data.game_data.game_url, "image");
this.sendGameLog(data.game_data);
}
}
this.recallChannelSeq(data)
this.recallChannelSeq(data);
},
// 召回染色
async recallChannelSeq(data) {
const param = {
game_id: data.game_data.game_id,
member_id: this.accountSelect,
key: data.game_data.channel_key || data.share_data.channel_key
}
const res = await recallChannelSeq(param)
key: data.game_data.channel_key || data.share_data.channel_key,
};
const res = await recallChannelSeq(param);
},
sendCreateChannel: throttle(function (item, type) {
const result = this.handleAccount()
const result = this.handleAccount();
if (!result) {
this.$message.warning('请稍后再试')
return false
this.$message.warning("请稍后再试");
return false;
}
let str = ''
let str = "";
if (type == 2) {
str = '网页游戏链接:'
str = "网页游戏链接:";
} else if (type == 3) {
str = '安卓游戏链接:'
str = "安卓游戏链接:";
} else if (type == 4) {
str = 'IOS游戏链接:'
str = "IOS游戏链接:";
} else {
}
const username = this.bindGameUserList.find(
(items) => items.member_id == this.accountSelect
).username
passwardEncryption({ member_id: this.accountSelect })
.then((res) => {
).username;
passwardEncryption({ member_id: this.accountSelect }).then((res) => {
const list = [
{
msgtype: 'text',
msgtype: "text",
// 一键发送渠道任务相关的参数
taskInfo: {
task_id: this.chatUser.task_id,
game_id: item.game_id,
member_id: this.accountSelect,
channel_key: item.channel_key
channel_key: item.channel_key,
},
text: {
content: `${str}${item.game_url} \n账号:${username} \n密码:${res.data.password}`,
key: res.data.key, iv: res.data.iv
}
}
]
key: res.data.key,
iv: res.data.iv,
},
},
];
// 这里需要特殊处理,因为有taskInfo参数
// this.set_sendSkillMessage(list)
this.sendChatMessage(`${str}${item.game_url} \n账号:${username} \n密码:${res.data.password}`, 'text')
item.type = 3
this.sendGameLog(item)
})
this.sendChatMessage(
`${str}${item.game_url} \n账号:${username} \n密码:${res.data.password}`,
"text"
);
item.type = 3;
this.sendGameLog(item);
});
}, 500),
async getLandingPageConfig(items, item) {
try {
const params = {
main_game_id: items.main_game_id,
weixin_blongs_id: items.weixin_blongs_id,
type: items.game_type == 1 ? 2 : items.game_type == 3 || items.game_type == 4 ? 1 : ''
}
const res = await getLandingPageConfig(params)
type:
items.game_type == 1
? 2
: items.game_type == 3 || items.game_type == 4
? 1
: "",
};
const res = await getLandingPageConfig(params);
if (res.status_code === 1 && res.data) {
return {
data: res.data,
game_type: items.game_type
}
game_type: items.game_type,
};
} else {
return null
}
} catch (error) {
return null;
}
} catch (error) {}
},
// 处理微信小程序游戏
handleWechatMiniGame(items, item, index) {
try {
this.selectedWxGameList = []
this.selectedWxGameList = [];
// 直接替换微信小游戏列表(单选)
this.selectedWxGameList = [item]
this.selectedWxGameList[0].send_trans_game_id = items.id
this.selectedWxGameList[0].send_trans_game_info = items
this.showWxGameDrawer = true
return true
this.selectedWxGameList = [item];
this.selectedWxGameList[0].send_trans_game_id = items.id;
this.selectedWxGameList[0].send_trans_game_info = items;
this.showWxGameDrawer = true;
return true;
} catch (error) {
console.error('处理微信小游戏失败:', error)
return false
console.error("处理微信小游戏失败:", error);
return false;
}
},
// 过滤游戏列表的公共方法
filterGameList(sourceGame, targetList) {
if (!sourceGame || !targetList?.length) return []
if (!sourceGame || !targetList?.length) return [];
return targetList.filter(game =>
return targetList.filter(
(game) =>
game.weixin_blongs_id === sourceGame.weixin_blongs_id &&
game.main_game_id === sourceGame.main_game_id
)
);
},
handleAndroidList(items, item) {
const androidGameList = this.regGameList.find(item => item.label.includes('安卓'))
if (androidGameList && androidGameList.children && androidGameList.children.length > 0) {
androidGameList.children = this.filterGameList(items, androidGameList.children)
const androidGameList = this.regGameList.find((item) =>
item.label.includes("安卓")
);
if (
androidGameList &&
androidGameList.children &&
androidGameList.children.length > 0
) {
androidGameList.children = this.filterGameList(
items,
androidGameList.children
);
} else {
androidGameList.children = []
androidGameList.children = [];
}
androidGameList.game_type = 3
androidGameList.game_type = 3;
if (items.game_type == 3) {
androidGameList.android_game_id = items.id
androidGameList.android_game_info = items
androidGameList.android_game_id = items.id;
androidGameList.android_game_info = items;
}
return androidGameList
return androidGameList;
},
handleIosList(items, item) {
const IOSGameList = this.regGameList.find(item => item.label.includes('IOS' || 'ios'))
IOSGameList.game_type = 4
if (IOSGameList && IOSGameList.children && IOSGameList.children.length > 0) {
IOSGameList.children = this.filterGameList(items, IOSGameList.children)
const IOSGameList = this.regGameList.find((item) =>
item.label.includes("IOS" || "ios")
);
IOSGameList.game_type = 4;
if (
IOSGameList &&
IOSGameList.children &&
IOSGameList.children.length > 0
) {
IOSGameList.children = this.filterGameList(items, IOSGameList.children);
} else {
IOSGameList.children = []
IOSGameList.children = [];
}
if (items.game_type == 4) {
IOSGameList.ios_game_id = items.id
IOSGameList.ios_game_info = items
IOSGameList.ios_game_id = items.id;
IOSGameList.ios_game_info = items;
}
return IOSGameList
return IOSGameList;
},
// 处理安卓 IOS 游戏
handleAppGameList(items, item, index) {
this.showAppGameDrawer = true
const androidGameList = this.handleAndroidList(items, item)
const IOSGameList = this.handleIosList(items, item)
androidGameList ? this.selectedAppGameList.push(androidGameList) : ''
IOSGameList ? this.selectedAppGameList.push(IOSGameList) : ''
console.log(this.selectedAppGameList, 'selectedAppGameList')
this.showAppGameDrawer = true;
const androidGameList = this.handleAndroidList(items, item);
const IOSGameList = this.handleIosList(items, item);
androidGameList ? this.selectedAppGameList.push(androidGameList) : "";
IOSGameList ? this.selectedAppGameList.push(IOSGameList) : "";
console.log(this.selectedAppGameList, "selectedAppGameList");
},
// 主方法
async handleGameType(items, item, type, index) {
if ((items.game_type == 1 || items.game_type == 3 || items.game_type == 4) && items.main_game_id && items.weixin_blongs_id) {
const result = await this.getLandingPageConfig(items, item)
if (
(items.game_type == 1 ||
items.game_type == 3 ||
items.game_type == 4) &&
items.main_game_id &&
items.weixin_blongs_id
) {
const result = await this.getLandingPageConfig(items, item);
if (result && result.data?.data?.tag) {
if (items.game_type == 1) {
// 处理微信小程序游戏
this.handleWechatMiniGame(items, item, index)
this.handleWechatMiniGame(items, item, index);
} else {
// 处理安卓/iOS游戏
this.handleAppGameList(items, item, index)
this.handleAppGameList(items, item, index);
}
} else {
this.sendChannelGame(items, item)
this.sendChannelGame(items, item);
}
} else {
this.sendChannelGame(items, item)
this.sendChannelGame(items, item);
}
},
// 不是小游戏 安卓 IOS 游戏处理
noH5AndroidIOSGame(items, item) {
this.sendChannelGame(items, item)
this.sendChannelGame(items, item);
},
// 小游戏游戏确认
async handleWxGameConfirm(value) {
console.log(value, 'value')
console.log(value, "value");
// const list = [
// {
// msgtype: 'image',
......@@ -1119,17 +1550,17 @@ export default {
// }
// ]
// this.set_sendSkillMessage(list)
this.getMediaId(value, 'image')
this.getMediaId(value, "image");
},
SendTransAppGameClose() {
this.selectedAppGameList = []
this.selectedAppGameList = [];
},
SendTransWxGameClose() {
this.selectedWxGameList = []
this.selectedWxGameList = [];
},
// 安卓或者 IOS 游戏处理
handleAppGameConfirm(data) {
this.selectedAppGameList = []
this.selectedAppGameList = [];
// const list = [
// {
// msgtype: 'text',
......@@ -1139,20 +1570,23 @@ export default {
// }
// ]
// this.set_sendSkillMessage(list)
this.sendChatMessage(`游戏地址:${data.landing_page_url} \n账号:${data.username} \n密码:${data.password}`, 'text')
this.sendChatMessage(
`游戏地址:${data.landing_page_url} \n账号:${data.username} \n密码:${data.password}`,
"text"
);
},
async getMediaId(picurl) {
// 发送图片作为链接消息
if (picurl) {
this.sendChatMessage(picurl, 'image')
this.sendChatMessage(picurl, "image");
} else {
// 如果没有图片URL,提示用户
this.$message.error('图片链接不存在,无法发送')
this.$message.error("图片链接不存在,无法发送");
}
},
}
}
},
};
</script>
<style lang="scss" scoped>
.sendGameContent {
......@@ -1181,7 +1615,7 @@ export default {
}
.channelLoading {
color: #3491FA;
color: #3491fa;
font-size: 16px;
text-align: center;
padding: 20px;
......@@ -1246,8 +1680,8 @@ export default {
}
::v-deep .el-button {
background: #3491FA;
border-color: #3491FA;
background: #3491fa;
border-color: #3491fa;
color: #fff;
font-size: 14px;
height: 32px;
......@@ -1268,8 +1702,8 @@ export default {
::v-deep .el-popover__reference {
.el-button {
background: #3491FA;
border-color: #3491FA;
background: #3491fa;
border-color: #3491fa;
color: #fff;
&:hover {
......@@ -1296,7 +1730,7 @@ export default {
font-size: 14px;
&:focus {
border-color: #3491FA;
border-color: #3491fa;
}
}
......@@ -1317,20 +1751,20 @@ export default {
/* 当转端按钮处于激活状态时保持自定义样式 */
::v-deep .el-radio-button.is-active {
.el-radio-button__inner {
background: #E8F7FF;
border-color: #3491FA;
border: 1px solid #3491FA;
color: #3491FA;
background: #e8f7ff;
border-color: #3491fa;
border: 1px solid #3491fa;
color: #3491fa;
box-shadow: none;
}
}
/* 统一collapse样式 */
::v-deep .el-collapse-item__header {
background-color: #F7F8FA;
background-color: #f7f8fa;
.el-collapse-item__arrow {
color: #3491FA;
color: #3491fa;
}
}
}
......@@ -1345,7 +1779,7 @@ export default {
}
.sendLink:hover {
color: #3491FA;
color: #3491fa;
background-color: #f5f7fa;
}
</style>
......@@ -6,23 +6,69 @@
<p class="textInfo">
角色充值金额信息会有5-10分钟延迟,请以订单信息为准
</p>
<el-button type="primary" size="small" class="h-[30px]" @click.stop="appealLayer()">申诉</el-button>
</div>
<el-collapse v-model="collapseActive" @change="handleChange">
<div v-for="(items, indexs) in roleList" :key="indexs" class="contentItem mb-[10px]">
<el-button
type="primary"
size="small"
class="h-[30px]"
@click.stop="appealLayer()"
>申诉</el-button
>
</div>
<el-collapse v-model="collapseActive">
<div
v-for="(items, indexs) in roleList"
:key="indexs"
class="contentItem"
>
<div class="title"></div>
<el-collapse-item :name="items.id">
<el-collapse-item :name="items.role_id">
<template slot="title">
<!-- <div class="collapseTitle rowFlex columnCenter spaceBetween">
<p class="hidden">
{{ items.role_name }} - {{ items.server_name }} - {{
items.recharge_total ? items.recharge_total + '元' : '0元' }}
</p>
<el-button type="primary" size="mini" class="collapseTitleBtn"
@click.stop="appealLayer(items)">申诉</el-button>
</div> -->
<div class="flex w-[100%] justify-between">
<div class="py-[10px]">
<div
class="grid grid-cols-7 w-[100%] leading-[24px] gap-[8px] py-[12px]"
>
<div class="col-span-3">
<div
class="text-[#323335] text-[16px] font-medium group hover:text-[#409EFF]"
>
<span class="flex items-center"
>{{ items.role_name
}}<i
class="group-hover:visible invisible"
v-copy="
`${items.role_name}-${items.server_name}-${
items.recharge_total || 0
}元`
"
></i>
</span>
</div>
<div class="text-[#4E5969] text-[14px]">
<span>区服:</span><span>{{ items.server_name }}</span>
</div>
</div>
<div class="col-span-2">
<div class="text-[#4E5969] text-[14px]">充值金额</div>
<div class="text-[#4E5969] text-[16px]">
<!-- <span>{{ items.recharge_total ? items.recharge_total + '元' : '0元' }}</span> -->
<span>{{ items.recharge_total || 0 }}</span>
</div>
</div>
<div
class="col-span-2"
@click.stop="
() =>
recentActivitiesPopupInstance.instance.open(
items.role_id,
`${items.role_name}-${items.server_name}-${items.recharge_total}元`
)
"
>
<div class="text-[#4E5969] text-[14px]">近期要开</div>
<el-button type="text" class="text-[16px] font-medium">{{
getNumRoleIdList(items.role_id)
}}</el-button>
</div>
<!-- <div class="py-[10px]">
<div class="leading-[25px]">
<span>角色名:</span><span>{{ items.role_name }}</span>
</div>
......@@ -30,46 +76,38 @@
<span>区服:</span><span>{{ items.server_name }}</span>
</div>
<div class="leading-[25px]">
<span>充值金额:</span><span>{{
items.recharge_total
? items.recharge_total + '元'
: '0元'
}}</span>
<span>充值金额:</span><span>{{ items.recharge_total ? items.recharge_total + '元' : '0元' }}</span>
<vip-level :role-info="items" />
</div>
</div>
<div class="flex-1 h-0 flex justify-end items-start pt-[10px]">
<el-badge :value="getNumRoleIdList(items.role_id)" class="text-center leading-[0] ml-[8px]">
<el-button type="primary" size="mini" @click.stop="
() =>
recentActivitiesPopupInstance.instance.open(
items.role_id,
`${items.role_name}-${items.server_name}-${items.recharge_total}元`
)
">
近期要开</el-button>
<el-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>
<div class="item rowFlex columnCenter spaceBetween">
<div
class="w-full border-t-[1px] border-t-[#E5E7EB] border-dashed"
>
<!-- <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">区服:</span>
<p class="text">{{ items.server_name }}</p>
</div>
</div>
</div> -->
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">合区区服:</span>
<p class="text">{{ items.merge_server_name }}</p>
</div>
</div>
<div class="item rowFlex columnCenter spaceBetween">
<!-- <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">角色名称:</span>
<p class="text">{{ items.role_name }}</p>
</div>
</div>
</div> -->
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">等级:</span>
......@@ -82,16 +120,16 @@
<p class="text">{{ items.combat_num }}</p>
</div>
</div>
<div class="item rowFlex columnCenter spaceBetween">
<!-- <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">充值金额:</span>
<p class="text">{{ items.recharge_total }}</p>
</div>
</div>
</div> -->
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">转端审核:</span>
<p class="text">{{ items.trans_status_name || '无' }}</p>
<p class="text">{{ items.trans_status_name || "无" }}</p>
</div>
</div>
<div class="item rowFlex columnCenter spaceBetween">
......@@ -106,7 +144,7 @@
<p class="text">
{{
$moment(items.last_login_time * 1000).format(
'YYYY-MM-DD HH:mm:ss'
"YYYY-MM-DD HH:mm:ss"
)
}}
</p>
......@@ -118,7 +156,7 @@
<p class="text">
{{
$moment(items.create_time * 1000).format(
'YYYY-MM-DD HH:mm:ss'
"YYYY-MM-DD HH:mm:ss"
)
}}
</p>
......@@ -130,29 +168,48 @@
<p class="text">{{ items.create_role_day }}天</p>
</div>
</div>
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">开/合服天数:</span>
<p class="text" v-if="items.server_day">
{{ items?.server_day }}天
</p>
</div>
</div>
</div>
</el-collapse-item>
</div>
</el-collapse>
</div>
<div v-else-if="!loading && roleList.length == 0" class="noContent rowFlex allCenter">
<noContent title="暂无数据" description="当前没有任何数据,请稍后再试或联系管理员" />
<div
v-else-if="!loading && roleList.length == 0"
class="noContent rowFlex allCenter"
>
<noContent
title="暂无数据"
description="当前没有任何数据,请稍后再试或联系管理员"
/>
</div>
</div>
<appeal v-if="showAppeal" :show.sync="showAppeal" :appeal-info="appealInfo" />
<appeal
v-if="showAppeal"
:show.sync="showAppeal"
:appeal-info="appealInfo"
/>
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
import { getRoleHoLo,marketingRoleGrade } from '@/api/game';
import noContent from '@/components/noContent.vue';
import appeal from './layer/appeal.vue';
import watchMember from '@/mixins/watchMember';
import { createDetails } from '@/views/popup/RecentActivitiesPopup/index.js';
import { createRoleRecentActivityNotPushNum } from '@/views/hooks/useGetCount.js';
import vipLevel from '@/views/userInfo/components/gameInfo/vipLevel.vue';
import { mapState, mapMutations, mapActions } from "vuex";
import { getRoleHoLo, marketingRoleGrade, getServerDayApi } from "@/api/game";
import noContent from "@/components/noContent.vue";
import appeal from "./layer/appeal.vue";
import watchMember from "@/mixins/watchMember";
import { createDetails } from "@/views/popup/RecentActivitiesPopup/index.js";
import { createRoleRecentActivityNotPushNum } from "@/views/hooks/useGetCount.js";
import vipLevel from "@/views/userInfo/components/gameInfo/vipLevel.vue";
export default {
name: 'roleInfo',
name: "roleInfo",
components: {
noContent,
appeal,
......@@ -162,7 +219,7 @@ export default {
return {
collapseActive: [],
roleList: [],
nowTime: '',
nowTime: "",
loading: false,
showAppeal: false,
appealInfo: {},
......@@ -178,7 +235,14 @@ export default {
};
},
computed: {
...mapState('game', ['accountSelect']),
...mapState("game", ["accountSelect"]),
},
watch: {
collapseActive(newVal, oldVal) {
if (newVal.length > 0) {
this.handleChange(newVal.filter((item) => !oldVal.includes(item)));
}
},
},
mixins: [watchMember],
mounted() {
......@@ -208,29 +272,42 @@ export default {
this
);
},
async handleRoleListLevel(roleList){
async handleRoleListLevel(roleList) {
try {
const role_id_list = roleList.map((item) => item.role_id)
const res = await marketingRoleGrade({role_id:role_id_list})
if(res.status_code == 1 && res?.data?.data?.length > 0){
const levelList = res.data.data
const role_id_list = roleList.map((item) => item.role_id);
const res = await marketingRoleGrade({ role_id: role_id_list });
if (res.status_code == 1 && res?.data?.data?.length > 0) {
const levelList = res.data.data;
roleList.forEach((item) => {
const levelItem = levelList.find((level) => level.role_id == item.role_id)
if(levelItem){
item.vip_level = levelItem.vip_level
const levelItem = levelList.find(
(level) => level.role_id == item.role_id
);
if (levelItem) {
item.vip_level = levelItem.vip_level;
}
})
});
}
} catch (error) {
console.log(error)
console.log(error);
} finally {
this.roleList = roleList.sort((a, b) => {
return Number(b.recharge_total) - Number(a.recharge_total)
})
return Number(b.recharge_total) - Number(a.recharge_total);
});
}
},
handleChange() { },
async handleChange(v) {
const index = this.roleList.findIndex(
(item) => v.includes(item.role_id) && !item.server_day
);
if (index !== -1) {
const res = await getServerDayApi({
role_id: this.roleList[index].role_id,
});
this.roleList[index].server_day = res.data.data?.server_day;
this.roleList = [...this.roleList];
}
},
memberChange() {
this.requestRoleList();
},
......@@ -240,15 +317,15 @@ export default {
this.showAppeal = true;
},
requestRoleList() {
if (this.accountSelect === '') {
this.$message.warning('暂无关联的账号,请先去关联账号!');
if (this.accountSelect === "") {
this.$message.warning("暂无关联的账号,请先去关联账号!");
return false;
}
this.loading = true;
const data = {
api_search_name: '',
api_search_name: "",
member_id: this.accountSelect,
search_type: 'list',
search_type: "list",
...this.pageInfo,
};
getRoleHoLo(data).then(
......@@ -256,7 +333,7 @@ export default {
this.loading = false;
if (res.status_code == 1) {
if (res.data.data.length > 0) {
this.handleRoleListLevel(res.data.data)
this.handleRoleListLevel(res.data.data);
} else {
this.roleList = [];
}
......@@ -396,11 +473,12 @@ export default {
}
::v-deep .el-collapse-item {
margin-bottom: 20px;
margin-bottom: 1px;
}
::v-deep .el-collapse-item__content {
padding-bottom: 10px;
// padding-bottom: 10px;
padding: 0 0 10px 0;
}
::v-deep .el-collapse {
......@@ -408,13 +486,17 @@ export default {
}
::v-deep .el-collapse-item__header {
flex-direction: row-reverse;
width: 100%;
height: auto;
background: #f9faff;
background: transparent;
color: #333333;
padding-left: 10px;
font-size: 14px;
font-weight: 400;
&:hover {
background: #f7f8fa;
}
}
::v-deep .el-collapse .el-collapse-item__header .el-collapse-item__arrow {
......@@ -428,7 +510,15 @@ export default {
::v-deep .el-card__header,
::v-deep .el-collapse,
::v-deep .el-collapse-item__header {
border: 0 !important;
// border: 0 !important;
}
::v-deep .el-collapse-item__arrow {
color: #b1b3b8 !important;
margin-right: 10px !important;
}
::v-deep .el-collapse-item__wrap {
background-color: transparent !important;
border-bottom: 1px solid #ebeef5 !important;
}
/* 已移除局部 el-collapse 样式,使用全局样式 */
......
......@@ -4,23 +4,49 @@
<!-- 标签 -->
<el-collapse-transition>
<div v-if="groupList.length > 0" class="tagList columnFlex">
<div v-for="(item, index) in groupList" :key="index" class="tagItem columnCenter" :draggable="false"
<div
v-for="(item, index) in groupList"
:key="index"
class="tagItem columnCenter"
:draggable="false"
:class="groupActive == item.value ? 'tagItemActiveText' : ''"
@dragstart="handleDragStart($event, item, index)" @dragover.prevent="handleDragOver($event, item)"
@dragenter="handleDragEnter($event, item, 'group')" @dragend="handleDragEnd($event, item, 'group')">
<div class="rowFlex columnCenter spaceBetween tagItemGroup" @click="groupFilter(item, index)">
@dragstart="handleDragStart($event, item, index)"
@dragover.prevent="handleDragOver($event, item)"
@dragenter="handleDragEnter($event, item, 'group')"
@dragend="handleDragEnd($event, item, 'group')"
>
<div
class="rowFlex columnCenter spaceBetween tagItemGroup"
@click="groupFilter(item, index)"
>
<div class="rowFlex columnCenter">
<el-tooltip effect="dark" placement="top" :content="item.name" v-if="item.name.length >= 6">
<el-tooltip
effect="dark"
placement="top"
:content="item.name"
v-if="item.name.length >= 6"
>
<p class="text hidden">{{ item.name }}</p>
</el-tooltip>
<p v-else class="text hidden">{{ item.name }}</p>
</div>
<i class="el-icon-caret-right rotageIcon" :class="groupActive == item.value ? 'rotage' : ''"></i>
<i
class="el-icon-caret-right rotageIcon"
:class="groupActive == item.value ? 'rotage' : ''"
></i>
</div>
<!-- 二级分组 -->
<div v-if="item.child.length > 0 && groupActive == item.value" class="childGroup">
<div v-for="child in item.child" :key="child._id" class="childGroupText"
:class="[groupActiveChild == child._id ? 'tagItemActive' : '']" @click.stop="groupFilterChild(child)">
<div
v-if="item.child.length > 0 && groupActive == item.value"
class="childGroup"
>
<div
v-for="child in item.child"
:key="child._id"
class="childGroupText"
:class="[groupActiveChild == child._id ? 'tagItemActive' : '']"
@click.stop="groupFilterChild(child)"
>
<p class="text hidden">{{ child.name }}</p>
</div>
</div>
......@@ -33,27 +59,67 @@
<!-- 话术 -->
<div class="libraryListContent">
<div class="inputContent">
<el-input v-model="requestData.title" placeholder="请输入话术内容" class="input-with-select">
<el-button slot="append" icon="el-icon-search" @click="contentSearch"></el-button>
<el-input
v-model="requestData.title"
placeholder="请输入话术内容"
class="input-with-select"
>
<el-button
slot="append"
icon="el-icon-search"
@click="contentSearch"
></el-button>
</el-input>
</div>
<div ref="skillLibrary" v-loading="skillLoading" @scroll="paperScroll" class="scrollList">
<div v-for="(items, indexs) in groupDataList" :key="indexs" class="answerContent">
<div class="question"><span class="title">Q:</span>{{ items.question }}</div>
<div v-for="(answer, answerIndex) in items.answer" :key="answerIndex" class="answerItem"
style="width: 100%">
<div
ref="skillLibrary"
v-loading="skillLoading"
@scroll="paperScroll"
class="scrollList"
>
<div
v-for="(items, indexs) in groupDataList"
:key="indexs"
class="answerContent"
>
<div class="question">
<span class="title">Q:</span>{{ items.question }}
</div>
<div
v-for="(answer, answerIndex) in items.answer"
:key="answerIndex"
class="answerItem"
style="width: 100%"
>
<!-- <span class="question">{{ answerIndex + 1 }}: {{ answer }}</span> -->
<div v-if="answer.msgtype == 'text'" class="answerText rowFlex spaceBetween">
<div
v-if="answer.msgtype == 'text'"
class="answerText rowFlex spaceBetween"
>
<span class="title rowFlex">A{{ answerIndex + 1 }}:</span>
<p v-if="answer.msgtype == 'text'" class="rowFlex textAnswer flex1">
{{ answer.text.content || '' }}
<p
v-if="answer.msgtype == 'text'"
class="rowFlex textAnswer flex1"
>
{{ answer.text.content || "" }}
</p>
<i class="el-icon-document-copy copyIcon rowFlex" @click="sendMessageEdit(answer, items._id)"></i>
<i
class="el-icon-document-copy copyIcon rowFlex"
@click="sendMessageEdit(answer, items._id)"
></i>
</div>
<div v-else-if="answer.msgtype == 'image'" class="answerText rowFlex">
<div
v-else-if="answer.msgtype == 'image'"
class="answerText rowFlex"
>
<span class="title rowFlex">A{{ answerIndex + 1 }}:</span>
<el-image style="max-width: 200px" :src="answer.image.picurl"
@click="sendMessageImage(answer, items._id)" :preview-src-list="[answer.image.picurl]"> </el-image>
<el-image
style="max-width: 200px"
:src="answer.image.picurl"
@click="sendMessageImage(answer, items._id)"
:preview-src-list="[answer.image.picurl]"
>
</el-image>
</div>
</div>
</div>
......@@ -65,26 +131,34 @@
<script>
// procedure_group, procedureList, procedureSort, procedureGroupSort, skillQuote,
import { cross_corp_robot_knowledge_group_index, cross_corp_robot_knowledge_group_getList } from '@/api/skill'
import { mapState, mapMutations, mapActions } from 'vuex'
import { throttle, debounce, copyToClipboard, sendChatMessage } from '@/utils/index'
import noContent from '@/components/noContent.vue'
import {
cross_corp_robot_knowledge_group_index,
cross_corp_robot_knowledge_group_getList,
} from "@/api/skill";
import { mapState, mapMutations, mapActions } from "vuex";
import {
throttle,
debounce,
copyToClipboard,
sendChatMessage,
} from "@/utils/index";
import noContent from "@/components/noContent.vue";
export default {
name: 'skillLibrary',
name: "skillLibrary",
components: {
noContent
noContent,
},
props: {
activeName: {
default: '',
type: String
}
default: "",
type: String,
},
},
data() {
return {
collapseActive: '',
groupActive: '0',
groupActiveChild: '0',
collapseActive: "",
groupActive: "0",
groupActiveChild: "0",
activeGroup: {},
groupList: [],
groupLastList: [],
......@@ -93,93 +167,93 @@ export default {
pageInfo: {
page: 1,
page_size: 20,
total: 0
total: 0,
},
skillLoading: false,
loading: false,
requestData: {
title: '',
first_group_id: '',
second_group_id: ''
title: "",
first_group_id: "",
second_group_id: "",
},
sortType: '',
sortType: "",
sortID: {
_id: '',
before_id: '',
after_id: ''
_id: "",
before_id: "",
after_id: "",
},
filterText: {},
dragging: null,
orderList: [
{ label: '知识库', type: 'library' },
{ label: '个人话术', type: 'personal' },
{ label: '企业话术', type: 'company' }
]
}
{ label: "知识库", type: "library" },
{ label: "个人话术", type: "personal" },
{ label: "企业话术", type: "company" },
],
};
},
computed: {
...mapState('game', ['accountSelect', 'chatUserInfo']),
...mapState("game", ["accountSelect", "chatUserInfo"]),
},
watch: {
accountSelect(newVal, oldVal) {
if (newVal && newVal !== '') {
if (newVal && newVal !== "") {
this.pageInfo = {
page: 1,
page_size: 20,
total: 0
}
total: 0,
};
}
},
activeName(newVal, oldVal) {
if (newVal == 'library' && newVal != oldVal) {
this.resizeSelect()
this.requestLibraryData()
}
if (newVal == "library" && newVal != oldVal) {
this.resizeSelect();
this.requestLibraryData();
}
},
},
mounted() {
this.requestLibraryData()
this.requestLibraryData();
},
methods: {
sendMessage: throttle(function (item, id) {
console.log(item, id)
console.log(item, id);
// this.skillQuote(id, item.length)
}, 500),
handleDragStart(e, item, index) {
this.sortID._id = item._id
this.dragging = item
this.sortID._id = item._id;
this.dragging = item;
},
paperScroll: debounce(function () {
const el = this.$refs.skillLibrary
const el = this.$refs.skillLibrary;
if (el.offsetHeight + el.scrollTop + 10 >= el.scrollHeight) {
console.log('下一页')
this.pageInfo.page++
this.searchTable()
console.log("下一页");
this.pageInfo.page++;
this.searchTable();
}
}, 500),
skillQuote(id, num) {
const data = {
type: this.activeName,
procedure_id: id,
quote_count: num || 1
}
quote_count: num || 1,
};
skillQuote(data).then((res) => {
console.log(res)
})
console.log(res);
});
},
sortSkill() {
procedureSort(this.sortID).then((res) => {
if (res.status_code == 1) {
this.$message.success(res.msg)
this.$message.success(res.msg);
}
})
});
},
sortSkillGroup() {
procedureGroupSort(this.sortID).then((res) => {
if (res.status_code == 1) {
this.$message.success(res.msg)
this.$message.success(res.msg);
}
})
});
},
// 发送语音的时候 先编辑再发送
sendMessageEdit(item, id) {
......@@ -189,98 +263,107 @@ export default {
item.text.content,
(message) => this.$message.success(message),
(message) => this.$message.error(message)
)
);
}
this.sendChatMessage(item.text.content || '', 'text')
this.sendChatMessage(item.text.content || "", "text");
},
sendMessageImage(item) {
console.log(item, 'item')
this.sendChatMessage(item.image.picurl || '', 'image')
console.log(item, "item");
this.sendChatMessage(item.image.picurl || "", "image");
},
contentSearch() {
this.pageInfo = {
page: 1,
page_size: 20,
total: 0
}
this.searchTable('msg')
total: 0,
};
this.searchTable("msg");
},
// 知识库话术
requestLibraryData() {
console.log(this.chatUserInfo, 'chatUserInfo')
this.loading = true
console.log(this.chatUserInfo, "chatUserInfo");
this.loading = true;
const data = {
page: 1,
page_size: 100,
userid: this.chatUserInfo.userid
}
userid: this.chatUserInfo.userid,
};
cross_corp_robot_knowledge_group_index(data).then((res) => {
this.loading = false
this.loading = false;
if (res.data.data) {
res.data.data.unshift({
name: '全部分组',
value: '',
child: []
})
name: "全部分组",
value: "",
child: [],
});
this.groupList = res.data.data.map((item, index) => {
item.label = item.name
item.value = item._id
return item
})
this.groupLastList = this.groupList
this.groupFilter(this.groupList[0])
item.label = item.name;
item.value = item._id;
return item;
});
this.groupLastList = this.groupList;
this.groupFilter(this.groupList[0]);
} else {
this.groupList = []
this.groupLastList = []
this.groupList = [];
this.groupLastList = [];
}
})
});
},
groupFilter(item, index) {
if (!item._id) {
this.requestData.second_group_id = ''
this.activeGroup = {}
}
this.groupActive = item.value
item.child && item.child[0] ? ((this.activeGroup = item.child[0]), (this.groupActiveChild = item.child[0]._id)) : ''
this.searchTable()
this.requestData.second_group_id = "";
this.activeGroup = {};
}
this.groupActive = item.value;
item.child && item.child[0]
? ((this.activeGroup = item.child[0]),
(this.groupActiveChild = item.child[0]._id))
: "";
this.searchTable();
},
groupFilterChild(child) {
this.groupActiveChild = 0
this.activeGroup = child
this.groupActiveChild = child._id
this.searchTable()
this.$forceUpdate()
this.groupActiveChild = 0;
this.activeGroup = child;
this.groupActiveChild = child._id;
this.searchTable();
this.$forceUpdate();
},
// 搜索结果
async searchTable(msg) {
this.skillLoading = true
this.requestData.second_group_id = this.activeGroup._id || ''
this.requestData.title = this.requestData.title.trim()
const data = { ...this.requestData, ...this.pageInfo, log_scan: msg ? 1 : 0, userid: this.chatUserInfo.userid }
this.skillLoading = true;
this.requestData.second_group_id = this.activeGroup._id || "";
this.requestData.title = this.requestData.title.trim();
const data = {
...this.requestData,
...this.pageInfo,
log_scan: msg ? 1 : 0,
userid: this.chatUserInfo.userid,
};
cross_corp_robot_knowledge_group_getList(data).then((res) => {
this.skillLoading = false
this.pageInfo.page === 1 ? this.groupDataList = res.data.data : this.groupDataList = this.groupDataList.concat(res.data.data)
this.groupLastDataList = this.groupDataList
})
this.skillLoading = false;
this.pageInfo.page === 1
? (this.groupDataList = res.data.data)
: (this.groupDataList = this.groupDataList.concat(res.data.data));
this.groupLastDataList = this.groupDataList;
});
},
handleChange() { },
handleChange() {},
// 重置select
resizeSelect() {
this.groupActive = '0'
this.isResize = true
this.groupDataList = []
this.requestData.content = ''
this.pageInfo.page = 1
this.groupActive = "0";
this.isResize = true;
this.groupDataList = [];
this.requestData.content = "";
this.pageInfo.page = 1;
setTimeout(() => {
this.isResize = false
}, 2000)
this.isResize = false;
}, 2000);
},
sendChatMessage(content, type) {
sendChatMessage(content, type)
sendChatMessage(content, type);
},
}
}
},
};
</script>
<style lang="scss" scoped>
.skillLibrary {
......@@ -321,7 +404,7 @@ export default {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #409EFF;
color: #409eff;
margin-right: 10px;
}
......@@ -467,7 +550,6 @@ export default {
.skillBox {
width: 100%;
height: calc(100% - 20px);
}
.tagList {
......@@ -513,14 +595,14 @@ export default {
}
.tagItemActive {
color: #409EFF !important;
color: #409eff !important;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
background: #e4fff1;
}
.tagItemActiveText {
color: #409EFF;
color: #409eff;
}
}
......@@ -607,7 +689,7 @@ export default {
.copyIcon {
width: 20px;
color: #409EFF;
color: #409eff;
font-size: 16px;
position: relative;
top: 2px;
......@@ -619,7 +701,7 @@ export default {
}
.scrollList::-webkit-scrollbar {
display: none
display: none;
}
.container {
......@@ -676,7 +758,7 @@ export default {
}
.skillLibrary::-webkit-scrollbar {
display: none
display: none;
}
::v-deep .el-icon-circle-close {
......
......@@ -312,7 +312,7 @@
taskDetails,
taskTrack,
} from '@/api/game'
import { memberBindExternalUser } from '@/api/works'
import { memberBindExternalUser,clientSessionBindTaskApi } from '@/api/works'
import layer from '@/components/dialog.vue'
import SendEmailDialog from './SendEmailDialog.vue'
import applyGift from '@/views/components/giftRecord/applyGift.vue'
......
......@@ -27,21 +27,21 @@
</template>
<script>
import * as ww from '@wecom/jssdk';
import * as ww from "@wecom/jssdk";
import {
getOrganization,
getAuthUser,
getSignature,
getUserList,
cserSelected,
} from '@/api/user';
import Cookies from 'js-cookie';
import { getParams } from '@/utils/index';
import { mapMutations, mapState } from 'vuex';
import { getToken, setToken } from '@/utils/auth';
import jsApiList from '@/utils/jsApiList';
} from "@/api/user";
import Cookies from "js-cookie";
import { getParams } from "@/utils/index";
import { mapMutations, mapState } from "vuex";
import { getToken, setToken } from "@/utils/auth";
import jsApiList from "@/utils/jsApiList";
export default {
name: 'login',
name: "login",
components: {},
data() {
return {
......@@ -57,10 +57,10 @@ export default {
showRefresh: false, // 控制刷新按钮显示
qrLoading: false, // 控制二维码 loading
redirectUri:
process.env.NODE_ENV === 'production'
? 'https://companywx.zwnet.cn/api/api/sidebar_login/ding'
: 'https://companywx.zwwlkj03.top/api/api/sidebar_login/ding',
DDTestUrl: '',
process.env.NODE_ENV === "production"
? "https://companywx.zwnet.cn/api/api/sidebar_login/ding"
: "https://companywx.zwwlkj03.top/api/api/sidebar_login/ding",
DDTestUrl: "",
token: getToken(),
userList: [],
cser_user_id: null,
......@@ -72,23 +72,24 @@ export default {
});
},
computed: {
...mapState('user', ['corp_id']),
...mapState("user", ["corp_id"]),
},
methods: {
...mapMutations('user', [
'set_corp_id',
'set_userid',
'set_userInfo',
'set_token',
'set_cser_info',
'set_signData',
'set_cser_id',
'set_cser_name',
'set_external_userid',
...mapMutations("user", [
"set_corp_id",
"set_userid",
"set_userInfo",
"set_token",
"set_cser_info",
"set_signData",
"set_cser_id",
"set_cser_name",
"set_external_userid",
"set_weixin_blongs_id",
]),
async initLogin() {
const urlParams = getParams();
const userid = Cookies.get('userid');
const userid = Cookies.get("userid");
if (this.token && userid) {
// 已经钉钉扫码过 重新获取授权 获取签名 注册企微js-sdk
this.getUserList(userid);
......@@ -101,20 +102,20 @@ export default {
},
async getUserList(userid) {
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 });
this.userList = res.data;
},
async userStartLogin() {
if (!this.cser_user_id) {
this.$message.error('请选择客服人员');
this.$message.error("请选择客服人员");
return;
}
const cser_user = this.userList.find(
(item) => item.zq_user_id === this.cser_user_id
);
const corp_id = Cookies.get('corp_id');
const userid = Cookies.get('userid');
const corp_id = Cookies.get("corp_id");
const userid = Cookies.get("userid");
this.cacheCser(cser_user.zq_user_id, cser_user.name);
try {
const res = await cserSelected({
......@@ -122,10 +123,10 @@ export default {
corp_id: corp_id,
userid: userid,
});
console.log(res, '选择客服人员登录');
console.log(res, "选择客服人员登录");
if (res.status_code === 1 && res.data.tokens) {
this.$message({
type: 'warning',
type: "warning",
message: `当前【${cser_user.name}】已上线,下班后请记得点击下线哦~`,
duration: 3 * 1000,
});
......@@ -137,20 +138,20 @@ export default {
setTimeout(() => {
window.location.href =
window.location.origin +
'/company_app/index.html?corp_id=' +
"/company_app/index.html?corp_id=" +
corp_id +
'&msg=cser_error';
"&msg=cser_error";
}, 5000);
}
} catch (error) {
console.log(error, '选择客服人员登录失败');
console.log(error, "选择客服人员登录失败");
this.$message.error(error.msg);
setTimeout(() => {
window.location.href =
window.location.origin +
'/company_app/index.html?corp_id=' +
"/company_app/index.html?corp_id=" +
corp_id +
'&msg=cser_error';
"&msg=cser_error";
}, 5000);
}
},
......@@ -160,32 +161,32 @@ export default {
);
this.$confirm(
`确认登录上线吗,上线后所有会话都会归属到客服【${cser_user.name}】`,
'提示',
"提示",
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(() => {
this.userStartLogin();
})
.catch(() => {
this.$message.info('已取消登录');
this.$message.info("已取消登录");
});
},
// 设置缓存
cacheCorp_id(corp_id) {
Cookies.set('corp_id', corp_id, { expires: 30 });
Cookies.set("corp_id", corp_id, { expires: 30 });
this.set_corp_id(corp_id);
},
cacheuserid(userid) {
Cookies.set('userid', userid, { expires: 30 });
Cookies.set("userid", userid, { expires: 30 });
this.set_userid(userid);
},
cacheCser(cser_id, cser_name) {
Cookies.set('cser_id', cser_id, { expires: 30 });
Cookies.set('cser_name', cser_name, { expires: 30 });
Cookies.set("cser_id", cser_id, { expires: 30 });
Cookies.set("cser_name", cser_name, { expires: 30 });
this.set_cser_info({
cser_id: cser_id,
cser_name: cser_name,
......@@ -194,16 +195,16 @@ export default {
this.set_cser_name(cser_name);
},
cacheSignData(signData) {
Cookies.set('signData', JSON.stringify(signData), { expires: 30 });
Cookies.set("signData", JSON.stringify(signData), { expires: 30 });
this.set_signData(signData);
},
// 进入的页面地址是 https://companywx.jianshuwenhua.com/company_app/index.html?corp_id=wweaefe716636df3d1
// 1. 企微静默授权
async startWeComSilentAuth() {
this.urlParams = getParams();
const corp_id = Cookies.get('corp_id') || this.urlParams.corp_id;
const corp_id = Cookies.get("corp_id") || this.urlParams.corp_id;
if (!corp_id) {
this.$message.error('当前客服号信息异常,请切换会话后重试');
this.$message.error("当前客服号信息异常,请切换会话后重试");
return;
}
// 确定是第一次进入页面 没有 code 和 state
......@@ -224,18 +225,19 @@ export default {
if (res.data.userid) {
this.cacheuserid(res.data.userid);
this.getUserList(res.data.userid);
this.set_weixin_blongs_id(res.data.weixin_blongs_id);
} else {
this.$message.error('获取用户id失败');
this.$message.error("获取用户id失败");
return;
}
} else {
console.log('获取useid失败', res);
console.log("获取useid失败", res);
// 错误处理
}
},
async getSignature() {
console.log('获取签名', window.location.href);
const corp_id = Cookies.get('corp_id');
console.log("获取签名", window.location.href);
const corp_id = Cookies.get("corp_id");
try {
const res = await getSignature({
corp_id: corp_id,
......@@ -247,42 +249,42 @@ export default {
try {
this.registerWeComSDK();
} catch (err) {
console.log(err, '初始化sdk 失败');
console.log(err, "初始化sdk 失败");
}
}
} catch (err) {
console.log(err, '获取签名失败');
console.log(err, "获取签名失败");
window.location.href =
window.location.origin +
'/company_app/index.html?corp_id=' +
"/company_app/index.html?corp_id=" +
corp_id +
'&msg=signerror';
"&msg=signerror";
}
},
getCurExternalContact() {
this.$ww.getCurExternalContact({
success: (res) => {
if (res.err_msg === 'getCurExternalContact:ok') {
console.log(res, '重新进入获取企微外部联系人');
if (res.err_msg === "getCurExternalContact:ok") {
console.log(res, "重新进入获取企微外部联系人");
this.set_external_userid(res.userId);
// 确保 Vuex 状态更新后再跳转
this.$nextTick(() => {
this.$router.replace('/');
console.log(window.location.href, 'window.location.hrefuserInfo');
this.$router.replace("/");
console.log(window.location.href, "window.location.hrefuserInfo");
});
}
},
fail: (err) => {
console.log(err, '获取企微外部联系人失败');
console.log(err, "获取企微外部联系人失败");
// 错误处理
},
});
},
// 2. 注册企微JS-SDK
registerWeComSDK() {
console.log('删除企业签名', 1231);
console.log("删除企业签名", 1231);
this.$ww.register({
corpId: Cookies.get('corp_id'),
corpId: Cookies.get("corp_id"),
agentId: this.signData.agent_id,
jsApiList: jsApiList,
// getConfigSignature: () => Promise.resolve({
......@@ -298,12 +300,12 @@ export default {
signature: this.signData.agent_signature,
}),
onAgentConfigSuccess: (res) => {
console.log('注册成功可以调用企微 js-sdk', res);
console.log("注册成功可以调用企微 js-sdk", res);
// 注册成功后不立即获取外部联系人,等钉钉扫码后再获取
this.getCurExternalContact();
},
onAgentConfigFail: (err) => {
console.log('注册失败不能使用企微js-sdk', err);
console.log("注册失败不能使用企微js-sdk", err);
// 错误处理123
},
});
......@@ -322,15 +324,15 @@ export default {
},
initCurrentApp() {
const currentApp = this.orgList.find(
(item) => item.app_key === 'dingjigp0ksn9nbljdli'
(item) => item.app_key === "dingjigp0ksn9nbljdli"
);
this.$set(this, 'currentOrg', currentApp);
this.$set(this, "currentOrg", currentApp);
},
// 7. 钉钉扫码回调页面处理
async handleDingCallback(token) {
// 在这里处理钉钉扫码成功的回调
const corp_id = Cookies.get('corp_id');
if (token && token != 'undefined') {
const corp_id = Cookies.get("corp_id");
if (token && token != "undefined") {
setToken(token);
this.set_token(token);
// 获取签名
......@@ -338,9 +340,9 @@ export default {
} else {
window.location.href =
window.location.origin +
'/company_app/index.html?corp_id=' +
"/company_app/index.html?corp_id=" +
corp_id +
'&msg=notoken';
"&msg=notoken";
}
},
},
......
......@@ -2,87 +2,81 @@
<div class="details columnFlex">
<div class="content search-form">
<el-tabs v-model="activeName">
<el-tab-pane
label="个人话术"
name="personal"
>
<el-tab-pane label="个人话术" name="personal">
<skillPersonal
v-if="activeName === 'personal'"
:active-name="activeName"
/>
</el-tab-pane>
<el-tab-pane
label="企业话术"
name="company"
>
<skillCompany
:active-name="activeName"
/>
<el-tab-pane label="企业话术" name="company">
<skillCompany :active-name="activeName" />
</el-tab-pane>
<el-tab-pane
label="知识库"
name="library"
>
<el-tab-pane label="知识库" name="library">
<skillLibrary
v-if="activeName === 'library'"
:active-name="activeName"
/>
</el-tab-pane>
<el-tab-pane
label="跨主体知识库"
name="robotLibrary"
>
<el-tab-pane label="跨主体知识库" name="robotLibrary">
<crossLibrary
v-if="activeName === 'robotLibrary'"
:active-name="activeName"
/>
</el-tab-pane>
<el-tab-pane label="教学视频" name="instructionalVideo">
<InstructionalVideo
v-if="activeName === 'instructionalVideo'"
:active-name="activeName"
/>
</el-tab-pane>
</el-tabs>
</div>
</div>
</template>
<script>
import skillCompany from './components/skill/skillCompany.vue'
import skillPersonal from './components/skill/skillPersonal.vue'
import skillLibrary from './components/skill/skillLibrary.vue'
import crossLibrary from './components/skill/crossLibrary.vue'
import { mapActions } from 'vuex'
import skillCompany from "./components/skill/skillCompany.vue";
import skillPersonal from "./components/skill/skillPersonal.vue";
import skillLibrary from "./components/skill/skillLibrary.vue";
import crossLibrary from "./components/skill/crossLibrary.vue";
import InstructionalVideo from "./components/InstructionalVideo/index.vue";
import { mapActions } from "vuex";
export default {
name: 'quickReply',
name: "quickReply",
components: {
skillCompany,
skillPersonal,
skillLibrary,
crossLibrary
crossLibrary,
InstructionalVideo,
},
data() {
return {
activeName: 'personal'
}
},
created() {
activeName: "personal",
};
},
created() {},
mounted() {
this.initializeWecom()
this.initializeWecom();
},
methods: {
...mapActions('user', ['initWecom']),
...mapActions("user", ["initWecom"]),
async initializeWecom() {
try {
console.log('🚀 开始初始化企业微信 SDK')
const result = await this.initWecom()
console.log('✅ 企业微信 SDK 初始化成功', result)
console.log("🚀 开始初始化企业微信 SDK");
const result = await this.initWecom();
console.log("✅ 企业微信 SDK 初始化成功", result);
} catch (error) {
console.error('❌ 企业微信 SDK 初始化失败:', error)
console.error("❌ 企业微信 SDK 初始化失败:", error);
}
},
}
}
},
};
</script>
<style lang="scss" scoped>
.details {
::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;
}
width: 100%;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论