|
@@ -105,6 +105,7 @@
|
|
|
</div>
|
|
</div>
|
|
|
</el-card>
|
|
</el-card>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
|
|
+
|
|
|
<el-col :span="18" :xs="24">
|
|
<el-col :span="18" :xs="24">
|
|
|
<el-card>
|
|
<el-card>
|
|
|
<div slot="header" class="clearfix">
|
|
<div slot="header" class="clearfix">
|
|
@@ -121,6 +122,177 @@
|
|
|
</el-card>
|
|
</el-card>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 绑定会员对话框 - 优化样式,无背景色 -->
|
|
|
|
|
+ <el-dialog
|
|
|
|
|
+ v-if="member && member.hasOwnProperty('title')"
|
|
|
|
|
+ :title="member.title"
|
|
|
|
|
+ :visible.sync="member.open"
|
|
|
|
|
+ width="800px"
|
|
|
|
|
+ append-to-body
|
|
|
|
|
+ class="bind-member-dialog"
|
|
|
|
|
+ :close-on-click-modal="false"
|
|
|
|
|
+ @open="handleDialogOpen"
|
|
|
|
|
+ >
|
|
|
|
|
+ <!-- 筛选表单 - 无背景色,优化排版 -->
|
|
|
|
|
+ <div class="filter-container">
|
|
|
|
|
+ <el-row :gutter="16" class="filter-row" type="flex" align="middle">
|
|
|
|
|
+ <el-col :span="6">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="memberQueryParams.userId"
|
|
|
|
|
+ placeholder="会员ID"
|
|
|
|
|
+ clearable
|
|
|
|
|
+ @keyup.enter="handleMemberQuery"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ prefix-icon="el-icon-user"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="6">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="memberQueryParams.nickName"
|
|
|
|
|
+ placeholder="昵称"
|
|
|
|
|
+ clearable
|
|
|
|
|
+ @keyup.enter="handleMemberQuery"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ prefix-icon="el-icon-user"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="6">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="memberQueryParams.phone"
|
|
|
|
|
+ placeholder="手机号"
|
|
|
|
|
+ clearable
|
|
|
|
|
+ @keyup.enter="handleMemberQuery"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ prefix-icon="el-icon-phone"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="6" class="filter-buttons">
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ type="primary"
|
|
|
|
|
+ icon="el-icon-search"
|
|
|
|
|
+ @click="handleMemberQuery"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ :loading="loading"
|
|
|
|
|
+ >搜索</el-button>
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ icon="el-icon-refresh"
|
|
|
|
|
+ @click="resetMemberQuery"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ >重置</el-button>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 表格区域 -->
|
|
|
|
|
+ <div class="table-section">
|
|
|
|
|
+ <el-table
|
|
|
|
|
+ :data="memberList"
|
|
|
|
|
+ height="300"
|
|
|
|
|
+ highlight-current-row
|
|
|
|
|
+ @current-change="selectMember"
|
|
|
|
|
+ v-loading="loading"
|
|
|
|
|
+ border
|
|
|
|
|
+ stripe
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ class="member-table"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ property="userId"
|
|
|
|
|
+ label="ID"
|
|
|
|
|
+ width="70"
|
|
|
|
|
+ align="center"
|
|
|
|
|
+ ></el-table-column>
|
|
|
|
|
+
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ property="nickName"
|
|
|
|
|
+ label="昵称"
|
|
|
|
|
+ min-width="130"
|
|
|
|
|
+ show-overflow-tooltip
|
|
|
|
|
+ >
|
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
|
+ <span class="nickname-cell">
|
|
|
|
|
+ <i class="el-icon-user"></i>
|
|
|
|
|
+ {{ scope.row.nickName || '--' }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ property="phone"
|
|
|
|
|
+ label="手机号"
|
|
|
|
|
+ width="130"
|
|
|
|
|
+ align="center"
|
|
|
|
|
+ >
|
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
|
+ <span v-if="scope.row.phone" class="phone-cell">
|
|
|
|
|
+ <i class="el-icon-phone"></i>
|
|
|
|
|
+ {{ scope.row.phone }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <span v-else class="no-data">--</span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ property="status"
|
|
|
|
|
+ label="绑定状态"
|
|
|
|
|
+ width="100"
|
|
|
|
|
+ align="center"
|
|
|
|
|
+ >
|
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
|
+ <el-tag
|
|
|
|
|
+ :type="scope.row.status === 1 ? 'success' : 'info'"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ effect="light"
|
|
|
|
|
+ class="status-tag"
|
|
|
|
|
+ >
|
|
|
|
|
+ <i :class="scope.row.status === 1 ? 'el-icon-check' : 'el-icon-close'"></i>
|
|
|
|
|
+ {{ scope.row.status === 1 ? '已绑定' : '未绑定' }}
|
|
|
|
|
+ </el-tag>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ </el-table>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 分页组件 - 支持每页条数选择 -->
|
|
|
|
|
+ <div class="pagination-wrapper" v-if="memberTotal > 0">
|
|
|
|
|
+ <pagination
|
|
|
|
|
+ :total="memberTotal"
|
|
|
|
|
+ :page.sync="memberQueryParams.pageNum"
|
|
|
|
|
+ :limit.sync="memberQueryParams.pageSize"
|
|
|
|
|
+ @pagination="getMemberList"
|
|
|
|
|
+ :page-sizes="[10, 20, 50,100,500]"
|
|
|
|
|
+ :layout="'total, sizes, prev, pager, next, jumper'"
|
|
|
|
|
+ class="custom-pagination"
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 空数据提示 -->
|
|
|
|
|
+ <div v-if="!loading && memberList.length === 0" class="empty-data">
|
|
|
|
|
+ <i class="el-icon-info"></i>
|
|
|
|
|
+ <span>暂无会员数据</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 底部按钮 -->
|
|
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
|
|
+ <div class="selected-info" v-if="selectedMember">
|
|
|
|
|
+ <i class="el-icon-success" style="color: #67C23A;"></i>
|
|
|
|
|
+ 已选中:{{ selectedMember.nickName || selectedMember.userId }}
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="action-buttons">
|
|
|
|
|
+ <el-button @click="cancelBindMember" size="medium">取 消</el-button>
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ type="primary"
|
|
|
|
|
+ @click="confirmBindMember"
|
|
|
|
|
+ size="medium"
|
|
|
|
|
+ :disabled="!selectedMember"
|
|
|
|
|
+ :loading="confirmLoading"
|
|
|
|
|
+ >确 定</el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-dialog>
|
|
|
|
|
+
|
|
|
<el-dialog
|
|
<el-dialog
|
|
|
title="订阅服务号通知"
|
|
title="订阅服务号通知"
|
|
|
:visible.sync="bindDialogVisible"
|
|
:visible.sync="bindDialogVisible"
|
|
@@ -188,6 +360,65 @@ export default {
|
|
|
},
|
|
},
|
|
|
methods: {
|
|
methods: {
|
|
|
|
|
|
|
|
|
|
+ confirmBindMember() {
|
|
|
|
|
+ if (!this.selectedMember) {
|
|
|
|
|
+ this.$message.warning('请选择要绑定的会员');
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ this.confirmLoading = true;
|
|
|
|
|
+ const bindData = {
|
|
|
|
|
+ companyUserId: this.currentCompanyId,
|
|
|
|
|
+ userId: this.selectedMember.userId
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ bindSaleAndFsUser(bindData)
|
|
|
|
|
+ .then(response => {
|
|
|
|
|
+ if (response.code === 200) {
|
|
|
|
|
+ this.$message.success('绑定会员成功');
|
|
|
|
|
+ this.cancelBindMember();
|
|
|
|
|
+ this.getUser();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.$message.error(response.msg || '绑定失败');
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch(error => {
|
|
|
|
|
+ console.error('绑定会员失败:', error);
|
|
|
|
|
+ this.$message.error('绑定会员失败');
|
|
|
|
|
+ })
|
|
|
|
|
+ .finally(() => {
|
|
|
|
|
+ this.confirmLoading = false;
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ cancelBindMember() {
|
|
|
|
|
+ this.member.open = false;
|
|
|
|
|
+ this.memberList = [];
|
|
|
|
|
+ this.selectedMember = null;
|
|
|
|
|
+ this.currentCompanyId = null;
|
|
|
|
|
+ this.memberQueryParams = {
|
|
|
|
|
+ nickName: null,
|
|
|
|
|
+ phone: null,
|
|
|
|
|
+ userId: null,
|
|
|
|
|
+ pageNum: 1,
|
|
|
|
|
+ pageSize: 10
|
|
|
|
|
+ };
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ selectMember(member) {
|
|
|
|
|
+ this.selectedMember = member;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ handleDialogOpen() {
|
|
|
|
|
+ this.selectedMember = null;
|
|
|
|
|
+ this.getMemberList();
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ handleMemberQuery() {
|
|
|
|
|
+ this.memberQueryParams.pageNum = 1;
|
|
|
|
|
+ this.getMemberList();
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
handleBindMember() {
|
|
handleBindMember() {
|
|
|
this.currentCompanyId = this.user.userId;
|
|
this.currentCompanyId = this.user.userId;
|
|
|
this.resetMemberQuery();
|
|
this.resetMemberQuery();
|
|
@@ -266,6 +497,12 @@ export default {
|
|
|
this.user = response.data;
|
|
this.user = response.data;
|
|
|
this.roleGroup = response.roleGroup;
|
|
this.roleGroup = response.roleGroup;
|
|
|
this.postGroup = response.postGroup;
|
|
this.postGroup = response.postGroup;
|
|
|
|
|
+ // 将 fsUserId 字符串拆分为数组
|
|
|
|
|
+ if (this.user.fsUserId) {
|
|
|
|
|
+ this.user.fsUserIdArray = this.user.fsUserId.split(',').map(id => id.trim());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.user.fsUserIdArray = [];
|
|
|
|
|
+ }
|
|
|
});
|
|
});
|
|
|
},
|
|
},
|
|
|
openWechatBindDialog() {
|
|
openWechatBindDialog() {
|