提交 146bd230 作者: 毛细亚

适配关联标签

上级 cb186d22
......@@ -177,6 +177,7 @@ export default {
},
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']),
// 设置缓存
cacheCorp_id(corp_id) {
Cookies.set('corp_id', corp_id, { expires: 7 })
......
......@@ -99,3 +99,11 @@ export function getSendingCodeList(data) {
data
})
}
// 标签
export function searchTags(data) {
return request({
url: returnApi('/tag/index'),
method: 'post',
data
})
}
\ No newline at end of file
<template>
<el-drawer
:lock-scroll="true"
:title="title || '选择标签'"
:visible="show"
size="360px"
:append-to-body="true"
@close="close"
>
<div class="newPageNovel">
<div class="input">
<el-input
v-model="searchValue"
style="max-width:200px;"
placeholder="请输入标签名称"
class="input-with-select"
>
<el-button
slot="append"
icon="el-icon-search"
@click="inputSearch"
></el-button>
</el-input>
<div v-if="checkbox" class="checkBox" style="margin-top:10px;">
<el-checkbox v-model="is_tag_sync" :true-label="1" :false-label="0">在当前主体不同客服号同步进行打标</el-checkbox>
</div>
</div>
<div class="contnet columnFlex spaceBetween">
<div class="contnetLeft">
<div class="title rowFlex columnCenter">可选择列</div>
<div
v-infinite-scroll="startSearch"
:infinite-scroll-immediate="false"
:infinite-scroll-disabled="isScrollBottom"
class="checkBoxList"
>
<div
v-for="(item,index) in handleCheckTagList"
:key="index"
class="boxItem memberItem"
>
<el-checkbox
v-model="item.checkAll"
:indeterminate="item.isIndeterminate"
@change="handleCheckAllChange(item)"
>{{ item.group_name }}</el-checkbox>
<div style="margin: 15px 0;"></div>
<el-checkbox-group
v-model="item.checkItem"
class="rowFlex flexWarp"
style="margin-left:20px;margin-top:-10px;"
@change="handleCheckedCitiesChange(item)"
>
<el-checkbox
v-for="(items,i) in item.tag"
:key="items.id+i"
style="margin-top:10px;"
:label="items.id"
>{{ items.name }}</el-checkbox>
</el-checkbox-group>
</div>
</div>
</div>
<div class="contnetRight" style="margin-top: 20px;">
<div class="title rowFlex columnCenter spaceBetween"> <label>已选择{{ allCheckoutList.length }}</label> <span
class="clear"
@click="clear"
>清空全部</span> </div>
<div class="checkList">
<div
v-for="(item,index) in allCheckoutList"
:key="item.id+index"
class="checkTagItem rowFlex spaceBetween columnCenter"
>
<p class="rowFlex"><i class="iconfont icon-caidan"></i> <span
class="hidden"
style="max-width:60px;"
>{{ item.name }}</span></p>
<i
class="el-icon-close"
style="color: rgba(0, 0, 0, 0.45);"
@click.stop="removeTag(item)"
></i>
</div>
</div>
</div>
</div>
</div>
<span class="dialog-footer rowFlex">
<el-button
class="btn"
type="primary"
size="small"
@click="submit"
>确 定</el-button>
<el-button
class="btn"
size="small"
@click="close"
>取 消</el-button>
</span>
</el-drawer>
</template>
<script type="text/javascript">
import { searchTags } from '@/api/works'
export default {
components: {
},
// checkList 选中的标签 checkbox 是否显示 在当前主体不同客服号同步进行打标
props: ['show', 'checkList', 'title', 'checkbox'],
data() {
return {
searchValue: '',
radio: 'add',
is_tag_sync: 1,
checkoutNum: 0,
checkTagList: [],
isScrollBottom: false,
tagPageInfo: {
page: 0,
page_size: 20
},
handleCheckTagList: [],
selectedTags: [],
searchTagsInput: '',
allCheckoutList: [] // 所有的选中标签
}
},
computed: {
},
watch: {
checkoutNum() {
const list = []
this.handleCheckTagList.map((item, index) => {
if (item.checkList && item.checkList.length > 0) {
item.checkList.map((items, indexs) => {
list.push(items)
})
}
})
this.allCheckoutList = list
}
},
mounted() {
this.selectedTags = this.checkList
this.startSearch()
},
methods: {
// 处理请求的数据
handleAllTagData() {
if (this.checkTagList.length > 0) {
this.checkTagList.map((item) => {
item.isIndeterminate = false
item.checkAll = false
item.checkItem = [] // 选中的label
item.checkList = []
})
const list = this.removeDp2(this.checkTagList, this.selectedTags, 'group_id')
this.handleDefaultCheck(list)
// // 处理默认勾选的数据
this.handleCheckTagList = list
} else {
this.handleCheckTagList = []
}
},
removeDp2(arr1, arr2) {
const list1 = JSON.parse(JSON.stringify(arr1))
let list2 = []
arr2.length === 0 ? list2 = [] : list2 = JSON.parse(JSON.stringify(arr2))
for (let k = 0; k < arr1.length; k++) {
for (let i = 0; i < arr2.length; i++) {
if (arr2[i].group_id === arr1[k].group_id) {
list2[i].isfilter = true
}
}
}
const list = list2.filter(item => !item.isfilter)
return list.concat(list1)
},
// 数组去重
removeDp(arr1, arr2, id) {
let arr
arr2 ? arr = arr1.concat(arr2) : arr = arr1
const obj = {}
const newArray = arr.reduce((pre, cur) => {
if (!obj[cur[id]]) {
obj[cur[id]] = true
pre.unshift(cur)
}
return pre
}, [])
return newArray
},
// 默认勾选的数据 有数据就处理
handleDefaultCheck(data) {
// 先删选出来 有哪些 标签组已选中
data.map(item => {
this.selectedTags.map(i => {
const list = []
if (item.group_id === i.group_id) { // 匹配到了
this.$set(item, 'checkList', i.tag)
this.allCheckoutList = this.removeDp(i.tag, this.allCheckoutList, 'id')
i.tag.map((k, j) => {
list.push(k.id)
})
this.$set(item, 'checkItem', list)
item.isIndeterminate = item.checkItem.length > 0 && item.checkItem.length < item.tag.length
return
} else {
return
}
})
item.checkItem.length === item.tag.length ? item.checkAll = true : item.checkAll = false
})
},
inputSearch() {
this.searchTagsInput = this.searchValue
this.tagPageInfo = {
page: 0,
page_size: 20
}
this.isScrollBottom = false
this.startSearch()
},
async startSearch(resize) {
if (!this.isScrollBottom) { // 数据未加载完
let data = {}
this.tagPageInfo.page++
const obj = { tag_name: this.searchTagsInput }
data = { ...obj }
this.requestCheckTag(data)
} else { // 数据已加载完
this.handleAllTagData()
}
},
requestCheckTag(data) {
const params = {
...data,
...this.tagPageInfo
}
searchTags(params).then(res => {
res.data.data.length < 20 ? this.isScrollBottom = true : this.isScrollBottom = false
if (this.tagPageInfo.page == 1) {
this.checkTagList = res.data.data
} else {
// 数据去重
this.checkTagList = this.removeDp(res.data.data, this.checkTagList, 'group_id')
}
this.handleAllTagData()
})
},
// 全选
handleCheckAllChange(item) {
this.checkoutNum++
if (item.checkAll) { // 全选的时候
const list = []
item.tag.map((items) => {
// items.group_id = item.group_id
list.push(items.id)
})
this.$set(item, 'checkItem', list)
} else {
this.$set(item, 'checkItem', [])
}
this.handleCheckoutItem(item)
item.isIndeterminate = item.checkItem.length > 0 && item.checkItem.length < item.tag.length
},
handleCheckedCitiesChange(item) {
this.checkoutNum++
if (item.checkItem.length === item.tag.length) { // 全部选中
item.checkAll = true
} else {
item.checkAll = false
}
this.handleCheckoutItem(item)
item.isIndeterminate = item.checkItem.length > 0 && item.checkItem.length < item.tag.length
},
// 单选的时候收集选中的item
handleCheckoutItem(item) {
const list = []
item.checkItem.map((items) => {
item.tag.map(i => {
if (items === i.id) {
list.push(i)
}
})
})
this.$set(item, 'checkList', list)
},
// 清除全部
clear() {
this.allCheckoutList = []
this.handleCheckTagList.map(item => {
item.checkItem = []
item.checkAll = false
item.checkList = []
})
},
close() {
this.allCheckoutList = []
this.$emit('update:show', false)
},
// 点击确定
submit() {
const list = JSON.parse(JSON.stringify(this.handleCheckTagList)).filter(item => item.checkItem.length > 0)
list.map(item => {
item.tag = item.checkList
delete item.checkItem
delete item.checkList
delete item.isIndeterminate
delete item.checkAll
return item
})
this.selectedTags = list
// 客户管理批量修改标签里面
this.$emit('submit', list, this.is_tag_sync)
this.$emit('update:show', false)
},
// 删除某一个tag
removeTag(item) {
const i = this.allCheckoutList.findIndex((items, index) => {
return items.id === item.id
})
this.allCheckoutList.splice(i, 1)
this.handleCheckTagList.map(k => {
if (k.checkList && k.checkList.length > 0) {
let a
a = k.checkList.findIndex(j => {
return j.id === item.id
})
if (a !== -1) {
k.checkList.splice(a, 1)
k.checkList.length > 0 ? '' : k.checkAll = false
}
}
if (k.checkItem && k.checkItem.length > 0) {
let b
b = k.checkItem.findIndex(c => {
return c === item.id
})
if (b !== -1) {
k.checkItem.splice(b, 1)
this.$set(k, 'checkItem', [].concat(k.checkItem))
k.checkItem.length > 0 ? '' : this.$set(k, 'checkAll', false)
}
}
k.isIndeterminate = k.checkItem.length > 0 && k.checkItem.length < k.tag.length
})
}
}
}
</script>
<style lang="scss" scoped>
.newPageNovel {
width: 100%;
padding: 0 20px;
height: 100%;
overflow: auto;
padding-bottom: 120px;
.input {
width: 250px;
::v-deep .el-input__inner {
width: vw(250);
}
::v-deep .el-button {
width: vw(76);
}
}
.contnet {
width: 100%;
height: auto;
margin-top: 20px;
.contnetLeft {
width: vw(500);
height: 600px;
border-radius: 8px;
border: 1px solid rgba(0, 0, 0, 0.06);
overflow: auto;
position: relative;
padding-top: 40px;
}
.contnetRight {
width: vw(260);
height: 600px;
border-radius: 8px;
border: 1px solid rgba(0, 0, 0, 0.06);
position: relative;
padding-top: 40px;
.checkList {
width: 100%;
height: 100%;
overflow: auto;
padding: 0 20px;
padding-bottom: 40px;
}
.checkTagItem {
width: 100%;
height: 26px;
margin-top: 10px;
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #333333;
background: #eeeeef;
border-radius: 4px;
padding: 0 10px;
line-height: 26px;
cursor: pointer;
.icon-caidan {
margin-right: 5px;
}
span {
max-width: 100px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: inline-block;
}
}
}
.title {
width: 100%;
height: 40px;
background: #f6f8f9;
border-radius: 8px 8px 0px 0px;
border-bottom: 1px solid rgba(0, 0, 0, 0.06);
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333333;
padding: 0 20px;
position: absolute;
left: 0;
top: 0;
.clear {
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #00bf8a;
cursor: pointer;
}
}
.checkBoxList {
width: 100%;
height: calc(100%);
padding: 20px;
overflow: auto;
.boxItem {
margin-bottom: 20px;
}
// 选择成员
.boxItemMember {
width: 100%;
height: auto;
.imageItem {
width: 100%;
height: 50px;
.image {
width: 30px;
height: 30px;
border-radius: 15px;
position: relative;
top: 10px;
margin-right: 5px;
}
}
}
}
}
}
.dialog-footer {
width: calc(100% - 20px);
position: absolute;
right: 20px;
bottom: 0;
padding-top: 20px;
padding-bottom: 20px;
border-top: 1px solid rgba(0, 0, 0, 0.06);
justify-content: flex-end;
background: #fff;
z-index: 100;
.btn {
width: 84px;
height: 32px;
}
}
.radioGroup {
margin-top: 20px;
margin-left: 20px;
}
</style>
\ No newline at end of file
......@@ -66,9 +66,9 @@ export default {
}
},
async mounted() {
console.log(this.external_userid,'external_userid')
this.bindUserList()
this.requestDetails()
this.gameMemberView()
},
methods: {
...mapMutations('game', [
......@@ -148,7 +148,7 @@ export default {
console.log(res.data,'1231')
this.chatUserDetails = res.data
this.set_chatUserInfo(this.chatUserDetails) // 设置云端信息
console.log(this.chatUserDetails,'1231')
console.log(this.chatUserDetails,'哈哈哈')
if (this.chatUserDetails.self_defined_columns && this.chatUserDetails.self_defined_columns.length > 0) {
this.memberCheckList =
this.chatUserDetails.self_defined_columns.map(
......
......@@ -3,7 +3,7 @@
:lock-scroll="true"
:title="title"
:visible="show"
size="450px"
size="320px"
@close="close"
>
<div>
......
......@@ -5,6 +5,7 @@
<span></span>
<el-button
type="primary"
size="small"
@click="showApplyGift = true"
>礼包申请</el-button>
</div>
......@@ -240,7 +241,6 @@
v-if="showApplyGift"
:show.sync="showApplyGift"
title="礼包申请"
width="25%"
@requestData="requestData"
/>
</div>
......@@ -428,7 +428,7 @@
<style lang="scss" scoped>
.detailsGiftApply {
width: 100%;
height: calc(100vh - 60px);
height: calc(100vh - 160px);
background: #fff;
position: relative;
overflow-y: hidden;
......
<template>
<!-- 单日累充 分 积分开和积分关两种情况 -->
<el-drawer :lock-scroll="true" :title="title" :visible="show" size="540px" :modal="false" :modal-append-to-body="false" class="giftDetails" @close="close">
<el-drawer :lock-scroll="true" :title="title" :visible="show" size="320px" :modal="false" :modal-append-to-body="false" class="giftDetails" @close="close">
<div class="content">
<div class="giftDetailsText">
<div class="activeItem rowFlex">
......@@ -121,8 +121,8 @@
</div>
<span class="dialog-footer rowFlex">
<el-button :disabled="requestLoading" class="btn" type="primary" @click="submit">确 定</el-button>
<el-button class="btn" @click="close">取 消</el-button>
<el-button :disabled="requestLoading" size="small" class="btn" type="primary" @click="submit">确 定</el-button>
<el-button class="btn" size="small" @click="close">取 消</el-button>
</span>
<!-- 确认弹窗 -->
<confirmLayer v-if="showConfirmLayer" :remark="remark" :active-info="[activeInfo]" :show.sync="showConfirmLayer" title="请核对申请奖品信息" @close="close" />
......@@ -246,7 +246,7 @@ export default {
<style lang="scss" scoped>
.giftDetails {
position: fixed;
right: 450px;
right: 0px;
top: 0;
box-shadow: 0px 9px 28px 0px rgba(0, 0, 0, 0.05);
.icon{
......
<template>
<!-- 角色累充 -->
<el-drawer :lock-scroll="true" :title="title" :visible="show" size="540px" :modal="false" :modal-append-to-body="false" class="giftDetails" @close="close">
<el-drawer :lock-scroll="true" :title="title" :visible="show" size="320px" :modal="false" :modal-append-to-body="false" class="giftDetails" @close="close">
<div class="content">
<div v-for="(item,index) in activeInfo" :key="index" class="list">
<div class="giftDetailsText">
......@@ -53,8 +53,8 @@
</div>
</div>
<span class="dialog-footer rowFlex">
<el-button class="btn" :disabled="requestLoading" type="primary" :loading='btnLoading' @click="submit">确 定</el-button>
<el-button class="btn" @click="close">取 消</el-button>
<el-button class="btn" :disabled="requestLoading" type="primary" size="small" :loading='btnLoading' @click="submit">确 定</el-button>
<el-button size="small" class="btn" @click="close">取 消</el-button>
</span>
<!-- 确认弹窗 -->
<confirmLayer :is-submit="isSubmit" :remark="remark" :active-info="activeInfo" :show.sync="showConfirmLayer" title="请核对申请奖品信息" @close="close" />
......@@ -144,7 +144,7 @@ export default {
<style lang="scss" scoped>
.giftDetails {
position: fixed;
right: 450px;
right: 0px;
top: 0;
box-shadow: 0px 9px 28px 0px rgba(0, 0, 0, 0.05);
.icon{
......
......@@ -3,7 +3,7 @@
<el-drawer :lock-scroll="true"
:title="title"
:visible="show"
size="540px"
size="320px"
:modal="false"
:modal-append-to-body="false"
class="giftDetails"
......@@ -232,12 +232,14 @@
<el-button
class="btn"
type="primary"
size="small"
:disabled="requestLoading"
@click="submit"
:loading="btnLoading"
>确 定</el-button>
<el-button
class="btn"
size="small"
@click="close"
>取 消</el-button>
</span>
......@@ -426,7 +428,7 @@ export default {
<style lang="scss" scoped>
.giftDetails {
position: fixed;
right: 450px;
right: 0px;
top: 0;
box-shadow: 0px 9px 28px 0px rgba(0, 0, 0, 0.05);
.icon {
......
......@@ -93,7 +93,7 @@ import Clipboard from 'clipboard'
<style lang="scss" scoped>
.wx-gift-container {
height: calc(100vh - 160px);
height: calc(100vh - 200px);
width: 100%;
background-color: #fff;
......
......@@ -10,24 +10,16 @@
<p>②不能以任何形式推送APP/网页链接,也不可承认有APP/网页端口!!</p>
</div>
<div
v-if="change_appraisal && false"
style="
font-size: 12px;
color: red;
text-align: center;
"
v-if="change_appraisal"
class="warnText"
>
钓鱼号 禁止转端通知组长!
<p> 钓鱼号 禁止转端通知组长!</p>
</div>
<div
v-else-if="gameUserInfo.exp_ip"
style="
font-size: 12px;
color: red;
text-align: center;
"
class="warnText"
>
高风险用户,禁止转端 !!!
<p>高风险用户,禁止转端 !!!</p>
</div>
<div class="cser_name">
<span>当前客服:{{ cser_name }}</span>
......@@ -133,8 +125,7 @@
/>
<!-- 游戏标签 -->
<!-- <div
v-else-if="messageSource === 'company_work' && workerRouter !== 'novel'"
<div
class="item rowFlex columnCenter spaceBetween tagsLost"
>
<div class="rowFlex">
......@@ -159,13 +150,9 @@
</div>
</div>
</div>
<svg-icon
icon-class="edit"
class="icon"
style="font-size: 14px"
@click="editTags"
/>
</div> -->
<i class="el-icon-edit icon" style="font-size: 14px;margin-right: 10px;"
@click="editTags"></i>
</div>
<!-- 共享信息 -->
<shareInfo :chat-user-details="chatUserDetails" />
</div>
......@@ -178,6 +165,14 @@
title="修改手机号"
width="350px"
/>
<!-- 修改标签 -->
<selectTag
v-if="showTag"
:show.sync="showTag"
:checkbox="true"
:check-list="chatUserDetails.tag_group || []"
@submit="selectTags"
/>
</div>
</template>
<script>
......@@ -188,12 +183,14 @@ import changePhone from './changePhone.vue'
import watchMember from '@/mixins/watchMember'
import { autoResetPassword,bindUserSelfAdd } from '@/api/game'
import { memberBindCser,editUser,zyouUnBind } from '@/api/works'
import selectTag from '@/components/selectTag.vue'
export default {
name: 'UserDetailsPanel',
components: {
gameDetails,
changePhone,
shareInfo
shareInfo,
selectTag
},
props: {
// 用户详情
......@@ -212,7 +209,8 @@ import watchMember from '@/mixins/watchMember'
showInput: false,
showInputValue: '',
inputIndex: -1,
changePhone:false
changePhone:false,
showTag:false
}
},
computed: {
......@@ -376,12 +374,35 @@ import watchMember from '@/mixins/watchMember'
},
// 编辑标签
editTags() {
this.$emit('edit-tags')
this.showTag = true
},
// 处理评估变更
changeAppraisal(val) {
this.change_appraisal = val
},
// 选择的标签
selectTags(data, is_tag_sync) {
this.chatUserDetails.tag_group = data
const params = {
userid: this.chatUserDetails.userid,
external_userid: this.chatUserDetails.external_userid,
remark: this.chatUserDetails.remark,
is_tag_sync: is_tag_sync,
self_defined_columns: this.chatUserDetails.self_defined_columns,
tag_group: this.chatUserDetails.tag_group
}
this.editUserInfo(params)
},
editUserInfo(data) {
editUser(data).then((res) => {
if (res.status_code == 1) {
this.$message({
type: 'success',
message: res.msg
})
}
})
},
}
}
</script>
......
......@@ -18,13 +18,12 @@ export default {
}
},
computed:{
...mapState('user',['chatUserInfo']),
...mapState('game',['chatUserInfo']),
},
created(){
// 初始化 vuex 中的值
},
methods:{
...mapMutations('game',['set_chatUserInfo']),
}
}
</script>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论