| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618 |
- <template>
- <div class="app-container">
- <!-- 查询表单 -->
- <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
- <el-form-item label="链接名称" prop="linkName">
- <el-input
- v-model="queryParams.linkName"
- placeholder="请输入链接名称"
- clearable
- size="small"
- @keyup.enter.native="handleQuery"
- />
- </el-form-item>
- <el-form-item label="企业微信" prop="corpName">
- <el-input
- v-model="queryParams.corpName"
- placeholder="请输入企业微信"
- clearable
- size="small"
- @keyup.enter.native="handleQuery"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
- <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
- </el-form-item>
- </el-form>
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="el-icon-plus"
- size="mini"
- @click="handleAdd"
- >新增</el-button>
- </el-col>
- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
- <!-- 列表 -->
- <el-table v-loading="loading" :data="list" border>
- <el-table-column label="链接名称" align="center" prop="linkName" />
- <el-table-column label="企业微信" align="center" prop="corpName" />
- <el-table-column label="渠道链接" align="center" prop="url" show-overflow-tooltip />
- <el-table-column label="创建人" align="center" prop="createBy" />
- <el-table-column label="创建时间" align="center" prop="createTime" />
- <el-table-column label="最后修改人" align="center" prop="updateBy" />
- <el-table-column label="修改时间" align="center" prop="updateTime" />
- <el-table-column label="今日添加数" align="center" prop="toDayAddNum" />
- <el-table-column label="累积添加数" align="center" prop="countAddNum" />
- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
- <template slot-scope="scope">
- <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">编辑</el-button>
- <el-button size="mini" type="text" icon="el-icon-view" @click="handleViewChannel(scope.row)">查看渠道</el-button>
- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button>
- </template>
- </el-table-column>
- </el-table>
- <!-- 分页 -->
- <pagination
- v-show="total>0"
- :total="total"
- :page.sync="queryParams.pageNum"
- :limit.sync="queryParams.pageSize"
- @pagination="getList"
- />
- <!-- 新增/编辑对话框 -->
- <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body @close="cancel">
- <el-form ref="form" :model="form" :rules="rules" label-width="100px">
- <el-form-item label="链接名称" prop="linkName">
- <el-input v-model="form.linkName" placeholder="请输入链接名称" />
- </el-form-item>
- <el-form-item label="企业微信" prop="corpId">
- <el-select v-model="form.corpId" placeholder="请选择企业微信" @change="handleCorpChange">
- <el-option v-for="item in qwCompanyList" :key="item.corpId" :label="item.corpName" :value="item.corpId" />
- </el-select>
- </el-form-item>
- <el-form-item label="自动通过好友" prop="skipVerify">
- <div style="display: flex; align-items: center; height: 32px;">
- <el-switch v-model="form.skipVerify" :active-value="1" :inactive-value="0" />
- </div>
- </el-form-item>
- <el-form-item label="员工选择" prop="linkUser">
- <el-select v-model="form.selectedUserIds" placeholder="请先选择企业微信" :disabled="!form.corpId" multiple @change="handleUserChange">
- <el-option v-for="item in qwUserList" :key="item.id" :label="item.qwUserName" :value="item.id" />
- </el-select>
- </el-form-item>
- </el-form>
- <div slot="footer" class="dialog-footer">
- <el-button type="primary" @click="submitForm">确 定</el-button>
- <el-button @click="cancel">取 消</el-button>
- </div>
- </el-dialog>
- <!-- 查看渠道链接对话框 -->
- <el-dialog title="查看渠道链接" :visible.sync="channelDialogOpen" width="900px" append-to-body @close="cancelChannel">
- <!-- 查询表单 -->
- <el-form :model="channelQueryParams" ref="channelQueryForm" :inline="true" v-show="channelShowSearch" label-width="68px">
- <el-form-item label="渠道名称" prop="linkName">
- <el-input
- v-model="channelQueryParams.linkName"
- placeholder="请输入渠道名称"
- clearable
- size="small"
- @keyup.enter.native="getChannelList"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="el-icon-search" size="mini" @click="getChannelList">搜索</el-button>
- <el-button icon="el-icon-refresh" size="mini" @click="resetChannelQuery">重置</el-button>
- </el-form-item>
- </el-form>
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button
- type="primary"
- plain
- icon="el-icon-plus"
- size="mini"
- @click="handleAddChannel"
- >新增</el-button>
- </el-col>
- <right-toolbar :showSearch.sync="channelShowSearch" @queryTable="getChannelList"></right-toolbar>
- </el-row>
- <!-- 渠道列表 -->
- <el-table v-loading="channelLoading" :data="channelList" border>
- <el-table-column label="渠道名称" align="center" prop="linkName" />
- <el-table-column label="渠道链接" align="center" prop="url" show-overflow-tooltip />
- <el-table-column label="今日添加数" align="center" prop="toDayAddNum" />
- <el-table-column label="累积添加数" align="center" prop="countAddNum" />
- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
- <template slot-scope="scope">
- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDeleteChannel(scope.row)">删除</el-button>
- </template>
- </el-table-column>
- </el-table>
- <!-- 分页 -->
- <pagination
- v-show="channelTotal>0"
- :total="channelTotal"
- :page.sync="channelQueryParams.pageNum"
- :limit.sync="channelQueryParams.pageSize"
- @pagination="getChannelList"
- />
- <div slot="footer" class="dialog-footer">
- <el-button @click="cancelChannel">关 闭</el-button>
- </div>
- </el-dialog>
- <!-- 新增渠道对话框 -->
- <el-dialog title="选择渠道" :visible.sync="selectChannelDialogOpen" width="900px" append-to-body>
- <el-row :gutter="20">
- <!-- 左侧:分组和渠道选择 -->
- <el-col :xs="24" :sm="12">
- <div style="border-right: 1px solid #dcdfe6; padding-right: 20px;">
- <h4 style="margin-top: 0; margin-bottom: 15px;">分组管理</h4>
- <div style="margin-bottom: 15px;">
- <el-input
- v-model="selectChannelQueryParams.channelName"
- placeholder="搜索分组"
- clearable
- size="small"
- @input="loadGroupList"
- />
- </div>
- <div style="border: 1px solid #dcdfe6; border-radius: 4px; max-height: 400px; overflow-y: auto;">
- <div
- v-for="item in groupList"
- :key="item.id"
- :class="['group-item', { active: selectedGroupId === item.id }]"
- @click="selectGroup(item)"
- style="padding: 10px 15px; cursor: pointer; border-bottom: 1px solid #f0f0f0; user-select: none;"
- >
- <span>{{ item.channelName }}</span>
- </div>
- <div v-if="groupList.length === 0" style="padding: 20px; text-align: center; color: #909399;">暂无分组</div>
- </div>
- </div>
- </el-col>
-
- <!-- 中间:渠道列表 -->
- <el-col :xs="24" :sm="12">
- <div style="padding: 0 20px;">
- <h4 style="margin-top: 0; margin-bottom: 15px;">渠道模板</h4>
- <div v-if="!selectedGroupId" style="padding: 40px 0; text-align: center; color: #909399;">
- 请上方选择分组
- </div>
- <div v-else>
- <div style="border: 1px solid #dcdfe6; border-radius: 4px; max-height: 400px; overflow-y: auto;">
- <div
- v-for="item in selectChannelList"
- :key="item.id"
- style="padding: 10px 15px; border-bottom: 1px solid #f0f0f0; display: flex; align-items: center; user-select: none; cursor: pointer; background-color: #fff; transition: all 0.3s;"
- :style="{ backgroundColor: isChannelSelected(item) ? '#e6f7ff' : '#fff' }"
- @click="toggleChannelSelection(item)"
- >
- <el-checkbox
- :value="isChannelSelected(item)"
- style="margin-right: 8px;"
- />
- <span>{{ item.channelName }}</span>
- </div>
- <div v-if="selectChannelList.length === 0" style="padding: 20px; text-align: center; color: #909399;">暂无渠道</div>
- </div>
- </div>
- </div>
- </el-col>
- </el-row>
-
- <!-- 右侧:已选渠道 -->
- <div style="margin-top: 20px; padding-top: 20px; border-top: 1px solid #dcdfe6;">
- <h4 style="margin-top: 0; margin-bottom: 10px;">已选渠道({{ selectedChannels.length }})</h4>
- <div style="border: 1px solid #dcdfe6; border-radius: 4px; padding: 10px; min-height: 80px; max-height: 150px; overflow-y: auto;">
- <el-tag
- v-for="(item, index) in selectedChannels"
- :key="item.channelId || index"
- closable
- @close="removeSelectedChannel(item)"
- style="margin: 5px; cursor: pointer;"
- >
- {{ item.channelName }}
- </el-tag>
- <div v-if="selectedChannels.length === 0" style="color: #909399; text-align: center; padding: 20px 0;">未选择任何渠道</div>
- </div>
- </div>
-
- <div slot="footer" class="dialog-footer">
- <el-button @click="selectChannelDialogOpen = false">取 消</el-button>
- <el-button type="primary" @click="confirmAddChannel">确 定</el-button>
- </div>
- </el-dialog>
- </div>
- </template>
- <script>
- import {
- pageCustomerLink,
- createOrUpdateCustomerLink,
- deleteCustomerLink,
- pageCustomerLinkChannel,
- createCustomerLinkChannel,
- deleteCustomerLinkChannel
- } from '@/api/qw/customerLink'
- import { getMyQwCompanyList, listUser } from '@/api/qw/user'
- import { pageProject } from '@/api/adv/channel'
- import Pagination from '@/components/Pagination'
- import RightToolbar from '@/components/RightToolbar'
- export default {
- name: 'CustomerLink',
- components: {
- Pagination,
- RightToolbar
- },
- data() {
- return {
- // 加载状态
- loading: false,
- channelLoading: false,
- // 是否显示查询表单
- showSearch: true,
- channelShowSearch: true,
- // 列表数据
- list: [],
- total: 0,
- // 查询参数
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- linkName: undefined,
- corpName: undefined
- },
- // 表单参数
- form: {},
- // 表单验证规则
- rules: {
- linkName: [
- { required: true, message: '请输入链接名称', trigger: 'blur' }
- ],
- corpId: [
- { required: true, message: '请选择企业微信', trigger: 'change' }
- ],
- linkUser: [
- { required: true, message: '请选择员工', trigger: 'change' }
- ]
- },
- // 对话框
- open: false,
- title: '',
- // 企业微信列表
- qwCompanyList: [],
- // 企业微信员工列表
- qwUserList: [],
- // 选中的企业微信ID
- selectedCorpId: undefined,
-
- // 渠道链接对话框
- channelDialogOpen: false,
- channelList: [],
- channelTotal: 0,
- channelQueryParams: {
- pageNum: 1,
- pageSize: 10,
- linkName: undefined,
- sysLinkId: undefined
- },
- // 新增渠道对话框
- selectChannelDialogOpen: false,
- selectChannelParams: {
- channelId: undefined
- },
- channelOptions: [],
- currentSysLinkId: undefined,
-
- // 渠道选择相关数据
- groupList: [], // 分组列表
- selectedGroupId: null, // 选中的分组ID
- selectChannelList: [], // 当前分组的渠道列表
- selectChannelLoading: false, // 渠道列表加载中
- selectedChannels: [], // 已选择的渠道列表(右侧)
- selectChannelPageNum: 1,
- selectChannelPageSize: 10,
- selectChannelTotal: 0,
- selectChannelQueryParams: {
- channelName: ''
- }
- }
- },
- created() {
- this.getList()
- this.loadQwCompanyList()
- },
- methods: {
- // 查询列表
- getList() {
- this.loading = true
- pageCustomerLink(this.queryParams).then(response => {
- this.list = response.data.records || []
- this.total = response.data.total || 0
- this.loading = false
- }).catch(() => {
- this.loading = false
- })
- },
- // 搜索
- handleQuery() {
- this.queryParams.pageNum = 1
- this.getList()
- },
- // 重置查询
- resetQuery() {
- this.resetForm('queryForm')
- this.handleQuery()
- },
- // 新增
- handleAdd() {
- this.reset()
- this.open = true
- this.title = '新增渠道管理'
- },
- // 编辑
- handleUpdate(row) {
- this.reset()
- this.form = Object.assign({}, row)
- this.selectedCorpId = row.corpId
- this.loadQwUserList(row.corpId)
- this.open = true
- this.title = '编辑渠道管理'
- },
- // 删除
- handleDelete(row) {
- this.$confirm('确定删除该渠道吗?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- }).then(() => {
- deleteCustomerLink(row.id).then(response => {
- this.$message.success('删除成功')
- this.getList()
- })
- }).catch(() => {})
- },
- // 查看渠道链接
- handleViewChannel(row) {
- this.channelDialogOpen = true
- this.currentSysLinkId = row.id
- this.channelQueryParams.sysLinkId = row.id
- this.getChannelList()
- },
- // 查询渠道链接列表
- getChannelList() {
- this.channelLoading = true
- pageCustomerLinkChannel(this.channelQueryParams).then(response => {
- this.channelList = response.data.records || []
- this.channelTotal = response.data.total || 0
- this.channelLoading = false
- }).catch(() => {
- this.channelLoading = false
- })
- },
- // 重置渠道查询
- resetChannelQuery() {
- this.channelQueryParams = {
- pageNum: 1,
- pageSize: 10,
- linkName: undefined,
- sysLinkId: this.currentSysLinkId
- }
- this.getChannelList()
- },
- // 新增渠道链接
- handleAddChannel() {
- this.selectChannelDialogOpen = true
- this.selectedChannels = []
- this.selectedGroupId = null
- this.selectChannelList = []
- this.selectChannelQueryParams.channelName = ''
- this.loadGroupList()
- },
- // 加载分组列表
- loadGroupList() {
- const params = { pageNum: 1, pageSize: 1000, parentId: 0 }
- pageProject(params).then(response => {
- this.groupList = response.data.records || []
- }).catch(() => {
- this.groupList = []
- })
- },
- // 选择分组
- selectGroup(group) {
- this.selectedGroupId = group.id
- this.selectChannelPageNum = 1
- this.getSelectChannelList()
- },
- // 获取渠道列表
- getSelectChannelList() {
- if (!this.selectedGroupId) return
- this.selectChannelLoading = true
- const params = { pageNum: this.selectChannelPageNum, pageSize: this.selectChannelPageSize, parentId: this.selectedGroupId }
- if (this.selectChannelQueryParams.channelName) {
- params.channelName = this.selectChannelQueryParams.channelName
- }
- pageProject(params).then(response => {
- this.selectChannelList = response.data.records || []
- this.selectChannelTotal = response.data.total || 0
- this.selectChannelLoading = false
- }).catch(() => {
- this.selectChannelLoading = false
- })
- },
- // 勾选渠道
- toggleChannelSelection(channel) {
- const index = this.selectedChannels.findIndex(item => item.channelId === channel.id)
- if (index > -1) {
- // 已选中,取消选择
- this.selectedChannels.splice(index, 1)
- } else {
- // 未选中,添加选择
- this.selectedChannels.push({ channelId: channel.id, channelName: channel.channelName })
- }
- },
- // 判断渠道是否已选择
- isChannelSelected(channel) {
- return this.selectedChannels.some(item => item.channelId === channel.id)
- },
- // 删除已选渠道
- removeSelectedChannel(channel) {
- const index = this.selectedChannels.findIndex(item => item.channelId === channel.channelId)
- if (index > -1) {
- this.selectedChannels.splice(index, 1)
- }
- },
- // 加载渠道选项
- loadChannelOptions() {
- // 这里需要加载渠道列表,根据实际接口调整
- // 暂时使用空数组,需要后续实现
- this.channelOptions = []
- },
- // 确认新增渠道
- confirmAddChannel() {
- if (this.selectedChannels.length === 0) {
- this.$message.error('请选择渠道')
- return
- }
- const data = {
- sysLinkId: this.currentSysLinkId,
- channelList: this.selectedChannels
- }
- createCustomerLinkChannel(data).then(response => {
- this.$message.success('新增成功')
- this.selectChannelDialogOpen = false
- this.getChannelList()
- })
- },
- // 删除渠道链接
- handleDeleteChannel(row) {
- this.$confirm('确定删除该渠道链接吗?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- }).then(() => {
- deleteCustomerLinkChannel(row.id).then(response => {
- this.$message.success('删除成功')
- this.getChannelList()
- })
- }).catch(() => {})
- },
- // 关闭渠道链接对话框
- cancelChannel() {
- this.channelDialogOpen = false
- this.currentSysLinkId = undefined
- },
- // 表单提交
- submitForm() {
- this.$refs.form.validate(valid => {
- if (valid) {
- const data = {
- linkName: this.form.linkName,
- corpId: this.form.corpId,
- corpName: this.form.corpName,
- skipVerify: this.form.skipVerify,
- linkUser: this.form.linkUser
- }
- if (this.form.id) {
- data.id = this.form.id
- }
- createOrUpdateCustomerLink(data).then(response => {
- this.$message.success(this.form.id ? '编辑成功' : '新增成功')
- this.open = false
- this.getList()
- })
- }
- })
- },
- // 重置表单
- reset() {
- this.form = {
- linkName: undefined,
- corpId: undefined,
- corpName: undefined,
- skipVerify: 0,
- selectedUserIds: [],
- linkUser: []
- }
- this.qwUserList = []
- this.selectedCorpId = undefined
- if (this.$refs.form) {
- this.$refs.form.clearValidate()
- }
- },
- // 取消
- cancel() {
- this.open = false
- this.reset()
- },
- // 加载企业微信列表
- loadQwCompanyList() {
- getMyQwCompanyList().then(response => {
- this.qwCompanyList = response.data || []
- }).catch(() => {
- this.qwCompanyList = []
- })
- },
- // 企业微信改变
- handleCorpChange(corpId) {
- this.form.selectedUserIds = []
- this.form.linkUser = []
- this.qwUserList = []
- const selectedCompany = this.qwCompanyList.find(item => item.corpId === corpId)
- if (selectedCompany) {
- this.form.corpName = selectedCompany.corpName
- }
- this.loadQwUserList(corpId)
- },
- // 加载企业微信员工列表
- loadQwUserList(corpId) {
- if (!corpId) {
- this.qwUserList = []
- return
- }
- listUser({ corpId: corpId }).then(response => {
- this.qwUserList = response.rows || []
- }).catch(() => {
- this.qwUserList = []
- })
- },
- // 员工改变
- handleUserChange(userIds) {
- // 根据选中的用户ID列表构建员工信息数组
- this.form.linkUser = userIds.map(userId => {
- const selectedUser = this.qwUserList.find(item => item.id === userId)
- return {
- sysQwUserId: selectedUser.id,
- qwUserName: selectedUser.qwUserName,
- qwUserId: selectedUser.qwUserId
- }
- })
- },
- // 表单重置
- resetForm(refName) {
- if (this.$refs[refName]) {
- this.$refs[refName].resetFields()
- }
- }
- }
- }
- </script>
- <style scoped>
- </style>
|