Commit 8257e41f by 曾经

冻结会员

parent d3f1af58
......@@ -35,7 +35,7 @@
</el-form>
<div class="dialogTips">
<h3>导入规则</h3>
<p>1. 通过导入Excel表格的形式变更GIC已存在会员的积分等级门店;不支持导入新会员数据 </p>
<p>1. 通过导入Excel表格的形式变更GIC已存在的会员信息;不支持导入新会员数据 </p>
<p>2. 仅支持.xlsx 文件的导入;每次导入数据量最多为10000条;文件大小不超过1M </p>
<p>3. 导入类型不同,文件模板也不同,请严格按照模板内容填入会员数据,否则将会报错 </p>
<p>4. 请仔细核对需要变更的会员数据是否准确,否则GIC校验不通过将无法执行成功</p>
......
......@@ -108,7 +108,11 @@ const urlConfig = {
saveAbnormalSetting: '/api-member/exception-config-save',// 保存异常配置
getUnfreezeCount: '/api-member/no_froze_member_count',// 获取当前选中的异常会员的未冻结数量
getEnableDownload:'/api-auth/get-enable-download-data-config-by-user',
updateFrozen: '/api-member/exception-frozen',
updateFrozen: '/api-member/exception-frozen',// 异常更新冻结状态
getMembersForFrozen:'/api-member/ajax-members-do-frozen',
getFrozenWhiteList: '/api-member/white-member-list',//获取冻结白名单列表
removeFrozenWhiteMember:'/api-member//white-member-remove',// 移出白名单
frozenMemberExportExcel: '/api-admin/frozen-member-export-excel',// 异常会员搜索结果导出
}
const defaultUrl = Object.assign({}, urlConfig);
......
......@@ -2,17 +2,16 @@ import { doFetch, doFetchGet } from "@/components/axios/api";
import url from "@/components/axios/url";
import {
checkFalse,
checkStatus,
checkSuccess
} from "../../../../../static/js/checkStatus";
import authMethods from "@/mixins/auth";
import defaultImg from "../../../../../static/img/default.png";
import { formatLongTime } from "@/utils/utils";
import FreezeDialog from "../components/dialog/freeze.vue";
import MemberFieldsDialog from "../components/dialog/fieldsSettingDialog.vue";
import ExportFieldsDialog from "../components/dialog/fieldsSettingDialog.vue";
import FreezeDialog from "../../components/dialog/freeze.vue";
import MemberFieldsDialog from "../../components/dialog/fieldsSettingDialog.vue";
import ExportFieldsDialog from "../../components/dialog/fieldsSettingDialog.vue";
export default {
name: "forzenlist",
name: "abnormal-member-list",
components: {
ExportFieldsDialog,
MemberFieldsDialog,
......@@ -30,35 +29,17 @@ export default {
return arr[1] || "";
}
return str;
},
formatCardName(val) {
if (val) {
if (val.length > 10) {
val = val.substr(0, 10) + "...";
}
}
return val;
},
formatMember(val) {
if (val) {
if (val.length > 3) {
val = val.substr(0, 3) + "...";
}
}
return val;
},
formatPhone(value) {
if (!value) {
return "--";
}
if (value.length != 11) {
return value;
}
return `${value.substr(0, 3)}****${value.substr(7, 4)}`;
}
},
data() {
return {
pickerOptions:{
disabledDate(date){
let minDate = new Date();
minDate.setFullYear(minDate.getFullYear() - 1);
return date > new Date() || date < minDate;
}
},
dateValue: ['',''],
freezeDialogOptions: {
count: 1,
......@@ -94,21 +75,21 @@ export default {
total: 0,
memberFields: [], // 顶部标题配置
exportFields: [], // 导出顶部配置
frozenList: [],
list: [],
multipleList: [],
abnormalSettingSave: 0
};
},
created() {
if (sessionStorage.getItem("frozenListSearchData")) {
if (sessionStorage.getItem("abnormalListSearchData")) {
this.searchData = JSON.parse(
sessionStorage.getItem("frozenListSearchData")
sessionStorage.getItem("abnormalListSearchData")
);
}
if(sessionStorage.getItem("frozenListSearchDateRange")){
if(sessionStorage.getItem("abnormalListSearchDateRange")){
this.dateValue = JSON.parse(
sessionStorage.getItem("frozenListSearchDateRange")
sessionStorage.getItem("abnormalListSearchDateRange")
);
}
},
......@@ -118,7 +99,7 @@ export default {
watch: {
searchData: {
handler(newval) {
sessionStorage.setItem("frozenListSearchData", JSON.stringify(newval));
sessionStorage.setItem("abnormalListSearchData", JSON.stringify(newval));
},
deep: true,
immediate: false
......@@ -129,11 +110,11 @@ export default {
if(value[0] && value[1]){
this.searchData.startDate = +value[0];
this.searchData.endDate = +value[1];
sessionStorage.setItem("frozenListSearchDateRange",JSON.stringify([+value[0],+value[1]]));
sessionStorage.setItem("abnormalListSearchDateRange",JSON.stringify([+value[0],+value[1]]));
}else{
this.searchData.startDate = '';
this.searchData.endDate = '';
sessionStorage.removeItem("frozenListSearchDateRange");
sessionStorage.removeItem("abnormalListSearchDateRange");
}
}
},
......@@ -174,7 +155,7 @@ export default {
nowDate.getFullYear() == updateDate.getFullYear() &&
nowDate.getMonth() == updateDate.getMonth() &&
nowDate.getDate() == updateDate.getDate() &&
exceptionRate == 0
!exceptionRate
) {
resolve(3);
} else if (exceptionRate > 3) {
......@@ -225,7 +206,11 @@ export default {
if (errorCode === 0) {
let { page, fields, fieldsStr } = result || {};
let { result: list, totalCount } = page || {};
this.frozenList = list || [];
list = list || [];
list.forEach((item)=>{
item.exceptionReasonList = (item.exceptionReason||'').split(';');
})
this.list = list || [];
this.total = totalCount || 0;
}
})
......@@ -254,6 +239,13 @@ export default {
this.searchData.currentPage = val;
this.getList();
},
handleSizeChange(pageSize){
this.searchData.pageSize = pageSize;
if((this.searchData.currentPage - 1) * this.searchData.pageSize > this.total){
this.searchData.currentPage = 1;
}
this.getList();
},
dateRangeChange(){
this.getList();
},
......@@ -328,14 +320,6 @@ export default {
});
}
})
// this.freezeDialogOptions = {
// count: 1,
// isBatchFreeze: 0,
// visible: true,
// submit:()=>{
// console.log('item---->',item)
// }
// };
},
// 解冻
unfreezeItem(item) {
......@@ -390,9 +374,16 @@ export default {
},
// 批量冻结
async clickBatchFreeze() {
let { multipleList } = this;
let { multipleList,list } = this;
if(!(list && list.length)){
this.$message({
message: "暂无数据,无法冻结",
type: "warning"
});
return;
}
if (!(multipleList && multipleList.length)) {
return this.$message.warning("请勾选要修改的商户");
return this.$message.warning("请勾选要修改的会员");
}
let count = await this.getUnfreezeCount();
if (count) {
......@@ -449,7 +440,7 @@ export default {
doFetch(url.exceptionMemberBatchFrozen, data)
.then(res => {
if (res.data.errorCode === 0) {
this.freezeStatusChangeSuccess();
this.freezeStatusChangeSuccess(res.data.result);
}
})
.finally(() => {
......
......@@ -11,7 +11,7 @@
style="width: 260px"
v-model="searchData.phoneNameCard"
prefix-icon="el-icon-search"
placeholder="输入姓名/昵称/手机号/会员卡号"
placeholder="输入手机号/会员卡号"
@change="onSearchDataChange"
></el-input>
<el-select
......@@ -26,12 +26,13 @@
</el-select>
<el-date-picker v-model="dateValue"
style="margin-left: 10px"
format="yyyy 年 MM 月 dd 日"
format="yyyy-MM-dd"
type="daterange"
range-separator=""
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['00:00:00', '23:59:59']"
:pickerOptions="pickerOptions"
@change="dateRangeChange"></el-date-picker>
</el-row>
<span
......@@ -42,9 +43,10 @@
v-if="getCodeAuth('searchReasultDownload')"
:limit-code="getCode('searchReasultDownload')"
-->
<el-button icon="el-icon-download" @click="download"
>搜索结果导出</el-button
>
<el-button @click="download">
<i class="iconfont icon-xiazairizhi"></i>
<span> 搜索结果导出</span>
</el-button>
<!--
v-if="getCodeAuth('batchFreeze')"
:limit-code="getCode('batchFreeze')"
......@@ -65,7 +67,7 @@
<el-table
v-loading="load"
ref="multipleTable"
:data="frozenList"
:data="list"
tooltip-effect="dark"
style="width: 100%"
@sort-change="sortChange"
......@@ -83,7 +85,7 @@
:type="selectPage.type"
:data-ready="selectPage.dataReady"
:table-vm="$refs.multipleTable"
:table-data="frozenList"
:table-data="list"
:total="total"
@change="(t) => (selectPage.type = t)"
@selection-change="(data) => (multipleList = data)"
......@@ -324,13 +326,13 @@
<el-table-column label="异常原因" min-width="220">
<template slot-scope="{ row }">
<el-popover placement="top-start" width="200" trigger="hover" :disabled="!row.exceptionReason">
<el-row type="flex" v-for="(item,index) in (row.exceptionReason||'').split(',')" :key="index">
<el-popover placement="top-start" trigger="hover" :disabled="!row.exceptionReason">
<el-row type="flex" v-for="(item) in (row.exceptionReason||'').split(';')" :key="item">
<div class="dm-status--info"></div>
<div>{{ item }}</div>
</el-row>
<span slot="reference"
>{{ row.exceptionReason || '--' }}</span
>{{ (row.exceptionReason||'').split(';')[0] || '--' }}</span
>
</el-popover>
</template>
......@@ -387,7 +389,8 @@
@current-change="handleCurrentChange"
:current-page="searchData.currentPage"
:page-size="searchData.pageSize"
layout="total, prev, pager, next"
:page-sizes="[20, 50, 75, 100]"
layout="total,sizes,prev, pager, next"
:total="total"
>
</dm-pagination>
......@@ -469,7 +472,7 @@
/>
<vue-gic-export-excel
:dataArr="frozenList"
:dataArr="list"
:dialogVisible.sync="exportData.dialogVisible"
:type="exportData.type"
:excelUrl="exportData.excelUrl"
......
import { doFetch,doFetchGet } from "@/components/axios/api";
import url from "@/components/axios/url";
import {
checkFalse,
checkStatus,
checkSuccess
checkFalse
} from "../../../../../static/js/checkStatus";
import AbnormalNumberInput from "../components/number-input.vue";
import AbnormalNumberInput from "./components/number-input.vue";
export default {
name: "AbnormalSetting",
......@@ -202,65 +200,95 @@ export default {
{
configType: 5,
name: "按“有效消费次数”配置:",
week: {
key: "weekCount",
checked: false,
value: 1,
min: 1,
max: 9999,
step: 1,
precision: 0
},
month: {
key: "monthCount",
checked: false,
value: 1,
min: 1,
max: 9999,
step: 1,
precision: 0
},
year: {
key: "yearCount",
checked: false,
value: 5,
min: 5,
max: 9999,
step: 1,
precision: 0
}
list:[
{
name: '单日',
key: "dayCount",
checked: false,
value: 1,
min: 1,
max: 9999,
step: 1,
precision: 0
},
{
name: '单周',
key: "weekCount",
checked: false,
value: 1,
min: 1,
max: 9999,
step: 1,
precision: 0
},
{
name: '单月',
key: "monthCount",
checked: false,
value: 1,
min: 1,
max: 9999,
step: 1,
precision: 0
},
{
name: '最近一年',
key: "yearCount",
checked: false,
value: 5,
min: 5,
max: 9999,
step: 1,
precision: 0
}
],
},
{
configType: 6,
name: "按“订单金额”配置:",
week: {
key: "weekAmount",
checked: false,
value: 500,
min: 500,
max: 999999,
step: 0.01,
precision: 2
},
month: {
key: "monthAmount",
checked: false,
value: 1000,
min: 1000,
max: 999999,
step: 0.01,
precision: 2
},
year: {
key: "yearAmount",
checked: false,
value: 2000,
min: 2000,
max: 999999,
step: 0.01,
precision: 2
}
list: [
{
name: '单日',
key: "dayAmount",
checked: false,
value: 100,
min: 100,
max: 999999,
step: 0.01,
precision: 2
},
{
name: '单周',
key: "weekAmount",
checked: false,
value: 500,
min: 500,
max: 999999,
step: 0.01,
precision: 2
},
{
name: '单月',
key: "monthAmount",
checked: false,
value: 1000,
min: 1000,
max: 999999,
step: 0.01,
precision: 2
},
{
name: '最近一年',
key: "yearAmount",
checked: false,
value: 2000,
min: 2000,
max: 999999,
step: 0.01,
precision: 2
}
],
}
]
},
......@@ -342,22 +370,13 @@ export default {
case 5:
case 6:
configsItem[item.week.key] = item.week.checked
? item.week.value
: "";
configsItem[item.month.key] = item.month.checked
? item.month.value
: "";
configsItem[item.year.key] = item.year.checked
? item.year.value
: "";
if (
configsItem[item.week.key] ||
configsItem[item.month.key] ||
configsItem[item.year.key]
) {
canSave = true;
}
item.list.forEach((item1)=>{
configsItem[item1.key] = item1.checked ? item1.value : '';
if(configsItem[item1.key]){
canSave = true;
}
})
break;
default:
......@@ -382,38 +401,6 @@ export default {
}, 200);
},
init() {
// this.updateData({
// frozen: 1,
// configs: [
// {
// configType: 1,
// dayCount: 100,
// dayAmount: 101,
// weekCount: 102,
// weekAmount: 503,
// monthCount: 104,
// monthAmount: 1005,
// yearCount: 1006,
// yearAmount: 2007
// },
// { configType: 2, continueTime: 8, weekCount: 9, weekAmount: 510 },
// {
// configType: 3,
// continueTime: 11,
// monthCount: 12,
// monthAmount: 1013
// },
// { configType: 4, skuNumber: 14, orderCount: 15 },
// { configType: 5, weekCount: 16, monthCount: 17, yearCount: 18 },
// {
// configType: 6,
// weekAmount: 519,
// monthAmount: 1020,
// yearAmount: 2021
// }
// ]
// });
doFetchGet(url.getAbnormalSetting).then(res => {
console.log("res--->",res);
let { errorCode, result, message } = res.data || {};
......@@ -490,24 +477,13 @@ export default {
case 5:
case 6:
if (configsItem[item.week.key]) {
item.week.checked = true;
item.week.value = configsItem[item.week.key];
canSave = true;
}
if (configsItem[item.month.key]) {
item.month.checked = true;
item.month.value = configsItem[item.month.key];
canSave = true;
}
if (configsItem[item.year.key]) {
item.year.checked = true;
item.year.value = configsItem[item.year.key];
canSave = true;
}
item.list.forEach((item1)=>{
if(configsItem[item1.key]){
item1.checked = true;
item1.value = configsItem[item1.key];
canSave = true;
}
})
break;
default:
break;
......
......@@ -277,20 +277,20 @@
<el-form-item class="cell-item" label="按“有效订单”配置:">
<div>
<el-form-item style="padding: 0px 0 10px">
<el-checkbox v-model="formData.configs[4].week.checked" @change="change">
<el-form-item style="padding: 0px 0 10px" v-for="(item,index) in formData.configs[4].list" :key="item">
<el-checkbox v-model="item.checked" @change="change">
<el-row type="flex" align="middle">
<span>单周有效订单大于等于 </span>
<span>{{ item.name }}有效订单大于等于 </span>
<el-form-item
class="input-form-item"
:rules="{
required: formData.configs[4].week.checked,
message: '单周有效订单数不能为空',
required: item.checked,
message: `${ item.name }有效订单数不能为空`,
}"
:prop="'configs[4].week.value'"
:prop="`configs[4].list[${ index }].value`"
>
<abnormal-number-input
v-bind.sync="formData.configs[4].week"
v-bind.sync="item"
class="count-input"
/>
</el-form-item>
......@@ -298,92 +298,25 @@
</el-row>
</el-checkbox>
</el-form-item>
<el-form-item style="padding: 10px 0">
<el-checkbox v-model="formData.configs[4].month.checked" @change="change">
<el-row type="flex" align="middle">
<span>单月有效订单大于等于 </span>
<el-form-item
class="input-form-item"
:rules="{
required: formData.configs[4].month.checked,
message: '单月有效订单数不能为空',
}"
:prop="'configs[4].month.value'"
>
<abnormal-number-input
v-bind.sync="formData.configs[4].month"
class="count-input"
/>
</el-form-item>
<span></span>
</el-row>
</el-checkbox>
</el-form-item>
<el-form-item style="padding: 10px 0">
<el-checkbox v-model="formData.configs[4].year.checked" @change="change">
<el-row type="flex" align="middle">
<span>最近一年有效订单大于等于 </span>
<el-form-item
class="input-form-item"
:rules="{
required: formData.configs[4].year.checked,
message: '最近一年有效订单数不能为空',
}"
:prop="'configs[4].year.value'"
>
<abnormal-number-input
v-bind.sync="formData.configs[4].year"
class="amount-input"
/>
</el-form-item>
<span></span>
</el-row>
</el-checkbox>
</el-form-item>
</div>
</el-form-item>
<el-form-item class="cell-item" label="按“订单金额”配置:">
<div>
<el-form-item style="padding: 0 0 10px">
<el-checkbox v-model="formData.configs[5].week.checked" @change="change">
<el-row type="flex" align="middle">
<span>单周订单金额大于等于 </span>
<el-form-item
class="input-form-item"
:rules="{
required: formData.configs[5].week.checked,
message: '单周订单金额不能为空',
}"
:prop="'configs[5].week.value'"
>
<abnormal-number-input
v-bind.sync="formData.configs[5].week"
class="count-input"
/>
</el-form-item>
<span></span>
</el-row>
</el-checkbox>
</el-form-item>
<el-form-item style="padding: 10px 0">
<el-checkbox v-model="formData.configs[5].month.checked" @change="change">
<el-form-item style="padding: 0px 0 10px" v-for="(item,index) in formData.configs[5].list" :key="item">
<el-checkbox v-model="item.checked" @change="change">
<el-row type="flex" align="middle">
<span>单月订单金额大于等于 </span>
<span>{{ item.name }}订单金额大于等于 </span>
<el-form-item
class="input-form-item"
:rules="{
required: formData.configs[5].month.checked,
message: '单月订单金额不能为空',
required: item.checked,
message: `${ item.name }订单金额不能为空`,
}"
:prop="'configs[5].month.value'"
:prop="`configs[5].list[${ index }].value`"
>
<abnormal-number-input
v-bind.sync="formData.configs[5].month"
v-bind.sync="item"
class="count-input"
/>
</el-form-item>
......@@ -392,27 +325,6 @@
</el-checkbox>
</el-form-item>
<el-form-item style="padding: 10px 0">
<el-checkbox v-model="formData.configs[5].year.checked" @change="change">
<el-row type="flex" align="middle">
<span>最近一年订单金额大于等于 </span>
<el-form-item
class="input-form-item"
:rules="{
required: formData.configs[5].year.checked,
message: '最近一年订单金额不能为空',
}"
:prop="'configs[5].year.value'"
>
<abnormal-number-input
v-bind.sync="formData.configs[5].year"
class="amount-input"
/>
</el-form-item>
<span></span>
</el-row>
</el-checkbox>
</el-form-item>
</div>
</el-form-item>
</el-form>
......
<template>
<div>
<el-dialog :title="isBatchFreeze ? '批量冻结会员' : '冻结会员'"
<el-dialog :title="title || (isBatchFreeze ? '批量冻结会员' : '冻结会员')"
:visible.sync="visible" width="600px" @close="onClose">
<div v-if="isBatchFreeze" class="freeze-tips">
<span>当前已选择</span>
......@@ -40,6 +40,7 @@ export default {
visible: false,
count: 0,
isBatchFreeze: false,// 是否批量冻结
title: '',
},
data() {
return {
......@@ -59,7 +60,6 @@ export default {
sure(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
this.onClose();
this.submit && this.submit(this.submitData);
this.$emit('submit', this.submitData);
} else {
......
<template>
<!-- 新建导入 -->
<el-dialog
title="新建导入"
custom-class="customer-dialog"
:visible.sync="dialogImport"
width="600px"
@closed="onDialogImportClosed"
>
<el-form
ref="formByImport"
:rules="rules"
:model="formByImport"
label-width="100px"
label-suffix=":"
style="margin-bottom: 36px"
>
<el-form-item label="导入类型" prop="importValue">
<el-select
v-model="formByImport.importValue"
placeholder="请选择导入类型"
@change="handleChangeType"
:disabled="importList.length < 2"
>
<el-option
:label="item.importValue"
:value="item.importType"
v-for="item in importList"
:key="item"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="选择文件" prop="file" required>
<dm-import-file :visible.sync="dialogVisible" :options="options"
ref="importFile" @change="fileChange"></dm-import-file>
</el-form-item>
</el-form>
<div class="dialogTips">
<h3>导入规则</h3>
<p>
1. 通过导入Excel表格的形式变更GIC已存在的会员信息;不支持导入新会员数据
</p>
<p>
2. 仅支持.xlsx 文件的导入;每次导入数据量最多为10000条;文件大小不超过1M
</p>
<p>
3.
导入类型不同,文件模板也不同,请严格按照模板内容填入会员数据,否则将会报错
</p>
<p>
4. 请仔细核对需要变更的会员数据是否准确,否则GIC校验不通过将无法执行成功
</p>
<p>
5.
超管账号支持导入变更全部会员信息,已分权商户的子管理员账号仅可修改管辖范围内的会员信息
</p>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="onDialogImportClosed">取 消</el-button>
<el-button type="primary" @click="importTable" :disable="load"
>确 定</el-button
>
</span>
</el-dialog>
</template>
<script>
import url from "@/components/axios/url";
import { checkFalse, checkSuccess } from "../../../../../static/js/checkStatus";
import { doFetch, doFetchGet } from "@/components/axios/api";
export default {
props: {
dialogVisible: {
type: Boolean,
default: false,
},
importList: {
type: Array,
default: [
{
importType: 15,
importValue: "批量冻结会员",
},
{
importType: 16,
importValue: "批量解冻会员",
},
],
},
},
filters: {
// 模板下载文字过滤
},
data() {
return {
visible: true,
options: {
desc: '下载模板并完善信息后,点击此处上传文件,支持格式:.XLSX',
downloadTemplate: [],
optType: 0, //required
accept: ['.xlsx'], // 默认 ['.xlsx', '.xls', '.csv']
maxSize: 100000, // 传递byte required
maxSizeDesc: '10M',
multiple: false, // 默认false
hiddleFile: false,
},
actionUrl: url.uploadExecl,
// 搜索选项值
importType: "",
// 新建dialog
dialogImport: false,
// 表单
formByImport: {
importValue: "",
fileList: [],
},
rules: {
importValue: [
{ required: true, message: "请选择导入类型", trigger: "change" },
],
},
rows: 0, // excel数据数量
// 上传验证加载
load: false,
};
},
watch: {
importList:{
handler(n){
let value = '';
if(n && n.length){
value = n[0].importType;
}else{
value = ''
}
this.formByImport.importValue = value;
this.handleChangeType(value);
},
deep: true,
immediate: true
},
dialogVisible(n, o) {
this.dialogImport = n;
},
},
methods: {
fileChange(res){
this.formByImport.fileList = res.files || [];
},
// batchType
// 表单清除
onDialogImportClosed() {
this.$refs.formByImport.resetFields();
this.$emit("update:dialogVisible", false);
},
handleChangeType(value){
let selectedImportItem = this.importList.find(item=>{
return item.importType == value;
})
this.options.downloadTemplate = selectedImportItem?[{
name: `下载${ selectedImportItem.importValue }模板`,
url: `${ url.downLoadExcelTemplate }?requestProject=member&batchType=${ selectedImportItem.importType }`
}]:[]
},
// 确认导入
importTable() {
this.$refs.formByImport.validateField("importValue", (err) => {
if (!err) {
// console.log(this.formByImport.fileList);
let {fileList,importValue} = this.formByImport;
if (fileList.length) {
this.load = true;
const formData = new FormData();
formData.append('file', fileList[0]);
formData.append('requestProject', 'member');
formData.append('batchType', importValue);
doFetch(url.uploadExecl,formData).then((res)=>{
let {errorCode} = res.data;
if(errorCode == 0){
checkSuccess('上传成功')
this.onDialogImportClosed();
}
}).finally(()=>{
this.load = false;
})
} else {
checkFalse("请上传文件");
}
}
});
},
},
};
</script>
<style lang="scss" scoped>
/deep/ .el-dialog__footer {
border: none;
}
.dialogTips {
padding-bottom: 8px;
padding-top: 22px;
border-top: 1px solid #e4e7ed;
color: #909399;
h3 {
font-weight: normal;
font-size: 14px;
margin-bottom: 10px;
}
p {
font-size: 12px;
}
}
.success_icon {
text-align: center;
color: #52c41a;
font-size: 47px;
}
.successHeader {
text-align: center;
color: #303133;
font-size: 16px;
line-height: 39px;
}
.successCon {
text-align: center;
color: #606266;
font-size: 12px;
}
.member-wechat-timer {
width: 20px;
height: 20px;
font-size: 10px;
line-height: 20px;
padding: 0;
}
.dialogSuccess /deep/ .el-dialog__footer {
text-align: center;
padding-bottom: 22px;
}
</style>
import { doFetch, doFetchGet } from "@/components/axios/api";
import url from "@/components/axios/url";
import {
checkFalse,
checkSuccess
} from "../../../../../static/js/checkStatus";
import authMethods from "@/mixins/auth";
import defaultImg from "../../../../../static/img/default.png";
import { formatLongTime } from "@/utils/utils";
import FreezeDialog from "../../components/dialog/freeze.vue";
import MemberFieldsDialog from "../../components/dialog/fieldsSettingDialog.vue";
import ExportFieldsDialog from "../../components/dialog/fieldsSettingDialog.vue";
export default {
name: "forzenlist",
components: {
ExportFieldsDialog,
MemberFieldsDialog,
FreezeDialog
},
mixins: [authMethods],
filters: {
formatDate(val, format) {
if (!val || val == -1) return format == "hms" ? "" : "--";
let str = formatLongTime(val, 1);
let arr = str.split(" ");
if (format == "ymd") {
return arr[0];
} else if (format == "hms") {
return arr[1] || "";
}
return str;
}
},
data() {
return {
freezeDialogOptions: {
count: 1,
isBatchFreeze: 0,
visible: false
},
exportData: {
projectName: "member", // 当前项目名
dialogVisible: false,
type: 1,
excelUrl: url.frozenMemberExportExcel, // 下载数据的地址
params: {} // 传递的参数
},
dialogMemberFieldVisible: false,
dialogExportFieldVisible: false,
defaultImg,
settingType: 0, // 0未查询 1已设置 2未设置
selectPage: {
type: 0,
dataReady: true
},
searchData: {
frozenType: "", //会员状态
phoneNameCard: "", // 搜索字段
pageName: "allCustomer",
pageSize: 20,
currentPage: 1,
sortColName: "", // 排序字段
sortType: "", // 排序方式
},
load: false,
total: 0,
memberFields: [], // 顶部标题配置
exportFields: [], // 导出顶部配置
list: [],
multipleList: [],
abnormalSettingSave: 0
};
},
created() {
if (sessionStorage.getItem("frozenListSearchData")) {
this.searchData = JSON.parse(
sessionStorage.getItem("frozenListSearchData")
);
}
},
beforeMount() {
this.init();
},
watch: {
searchData: {
handler(newval) {
sessionStorage.setItem("frozenListSearchData", JSON.stringify(newval));
},
deep: true,
immediate: false
},
},
methods: {
init() {
this.load = true;
this.getFindMemberFields(this.searchData.pageName)
.then(list => {
this.memberFields = list;
this.getList();
})
.catch(() => {
this.getList();
});
},
getFindMemberFields(pageName) {
return new Promise((resolve, reject) => {
if (!pageName) {
reject();
}
doFetch(url.findMemberFields, {
pageName
})
.then(res => {
let { errorCode, result } = res.data;
if (errorCode === 0 && Array.isArray(result)) {
resolve(result || []);
} else {
checkFalse(res.data.message);
reject(res);
}
})
.catch(err => {
reject(err);
});
});
},
getList() {
this.load = true;
this.selectPage.dataReady = false;
doFetch(url.getFrozenList, this.searchData)
.then(res => {
this.selectPage.dataReady = true;
this.load = false;
let { errorCode, result } = res.data || {};
if (errorCode === 0) {
let { result: list, totalCount } = result || {};
this.list = list || [];
this.total = totalCount || 0;
}
})
.catch(() => {
this.load = false;
this.selectPage.dataReady = true;
});
},
sortChange(column) {
let { prop, order } = column;
this.searchData.sortColName = prop;
if (order === "descending") {
this.searchData.sortType = "desc";
}
if (order === "ascending") {
this.searchData.sortType = "asc";
}
this.getList();
},
// 搜索选项改变时
onSearchDataChange() {
this.getList();
},
handleCurrentChange(val) {
this.searchData.currentPage = val;
this.getList();
},
handleSizeChange(pageSize){
this.searchData.pageSize = pageSize;
if((this.searchData.currentPage - 1) * this.searchData.pageSize > this.total){
this.searchData.currentPage = 1;
}
this.getList();
},
dateRangeChange(){
this.getList();
},
submitMemberFields(fields) {
doFetch(url.updateFields, {
pageName: this.searchData.pageName,
fields
}).then(res => {
if (res.data.errorCode === 0) {
checkSuccess();
// 需要对选中字段排序
this.init();
} else {
checkFalse(res.data.message);
}
});
},
// 导出选项选择完毕 点击确定
submitExportFields(fields) {
doFetch(url.updateFields, {
pageName: "memberTag",
fields
});
doFetch(url.getEnableDownload).then(res => {
let { errorCode, result } = res.data;
if (errorCode === 0 && result == 1) {
this.exportData.type = 2;
} else {
this.exportData.type = 1;
}
});
let { phoneNameCard, frozenType } = this.searchData || {};
this.exportData.params = {
frozenType,
phoneNameCard,
exportFields: fields
};
this.exportData.dialogVisible = true;
},
freezeConfim(options){
options = options || {};
this.freezeDialogOptions = options;
},
freezeDialogHidden(){
this.freezeDialogOptions = {
visible: false
}
},
// 解冻
unfreezeItem(item) {
doFetchGet(url.updateFrozen,{
status: 0,
memberId: item.memberId
}).then(res => {
if (res.data.errorCode === 0) {
this.$message({
message: "解冻成功",
type: "success"
});
this.$nextTick(_ => {
this.getList();
});
}
});
},
// 批量解冻
async clickBatchUnfreeze() {
let { multipleList,list } = this;
if(!(list && list.length)){
this.$message({
message: "暂无数据,无法解冻",
type: "warning"
});
return;
}
if (!(multipleList && multipleList.length)) {
return this.$message.warning("请勾选要修改的会员");
}
this.$confirm("确定解冻?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.batchUnfreeze();
});
},
batchUnfreeze(){
let ids = [];
let { selectPage, multipleList, searchData } = this;
let { phoneNameCard } = searchData;
multipleList.forEach(ele => {
ids.push(ele.memberId);
});
const datas = {
memberIds: ids.join(","), // 会员id
remark: "", // 备注暂留
//所有会员是2 当前是1 其他是0
isCurrent: selectPage.type == 2 ? 1 : 0,
status: 0, // 1 冻结 0 解冻
phoneNameCard,
};
doFetch(url.batchUpdateFrozen, datas).then(async res => {
let {errorCode,result} = res.data;
if (errorCode === 0) {
this.$message({
message: "解冻成功",
type: "success"
});
this.freezeStatusChangeSuccess(result);
}
});
},
freezeStatusChangeSuccess(taskId) {
this.$confirm(
"任务发起成功,请去【企业管理】-【任务中心】查看处理结果和执行进度",
"任务发起成功",
{
confirmButtonText: "去任务中心",
cancelButtonText: "取消",
closeOnClickModal: false,
customClass: "import-link-confirm-content",
type: "warning"
}
)
.then(() => {
this.getList();
window.open(`/gic-web/#/taskDetail/${taskId}`);
})
.catch(() => {
this.getList();
});
},
// 搜索结果导出
download() {
if (this.total) {
this.getFindMemberFields("memberTag").then(list => {
this.exportFields = list;
this.dialogExportFieldVisible = true;
});
} else {
this.$message.warning("无数据");
}
},
linkDetail(memberId) {
this.$router.push({
path: "/customerDetail",
query: { memberId }
});
},
// 去冻结会员页
toFrozenMember(){
this.$router.push({
path: "/frozenList/frozenMember",
});
},
toWhiteList(){
this.$router.push({
path: "/frozenWhiteList",
});
},
}
};
.forzen-container {
padding: 20px;
background-color: #fff;
.search {
margin-bottom: 24px;
.top-header {
display: flex;
align-items: center;
margin-bottom: 20px;
h2 {
margin-right: 20px;
font-size: 16px;
font-weight: bold;
color: #303133;
line-height: 22px;
}
}
.search-item {
display: flex;
justify-content: space-between;
}
}
.basic-info-table {
color: #303133;
font-size: 14px;
.nick-name {
color: #909399;
font-size: 14px;
}
.basic-img {
display: inline-block;
vertical-align: middle;
height: 40px;
width: 40px;
min-width: 40px;
border-radius: 50%;
overflow: hidden;
margin-right: 10px;
}
}
}
.frozen-table {
.pager {
text-align: right;
padding: 20px 0 0;
}
/deep/.el-table-column--selection {
.cell {
padding-left: 16px;
padding-right: 0px;
}
}
/deep/.cell {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/deep/.table-select-page .cell {
padding-left: 10px;
padding-right: 0;
display: flex;
align-items: center;
.el-dropdown {
padding: 0;
}
}
}
.frozen-list {
height: 100%;
}
.no-setting-page {
height: 100%;
position: relative;
display: flex;
align-items: center;
justify-content: center;
.tips-box {
height: auto;
margin-right: 150px;
.label {
color: #0a1c2b;
font-size: 20px;
font-weight: 500;
}
.el-button--primary {
margin-top: 40px;
border-radius: 2px;
}
}
}
.no-update-page {
position: relative;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
height: 100%;
.icon {
width: 120px;
height: 120px;
margin: 0 auto 16px;
}
.label {
color: #606266;
font-size: 14px;
}
.no-update-alert{
margin-top: 15px;
/deep/.el-icon-info{
color: #2F54EB;
}
}
}
.data-abnormal-page{
position: relative;
text-align: center;
height: calc(100% - 100px);
padding: 0 30px;
.icon{
margin: 116px auto 30px;
color: #FA8C16;
width: 72px;
height: 72px;
font-size: 72px;
}
.title{
color: #303133;
font-size: 14px;
line-height: 20px;
}
.subtitle{
color: #606266;
font-size: 14px;
line-height: 20px;
}
.el-button--primary{
margin: 30px auto;
}
}
.channel-box {
display: inline-block;
+ .channel-box {
margin-left: 6px;
}
.channel-icon {
width: 20px;
height: 20px;
vertical-align: middle;
}
}
.frozen-table /deep/.el-table {
.setting-cell.el-table__cell {
display: flex;
align-items: center;
height: 65px;
padding: 0;
.cell.setting-cell {
display: flex;
justify-content: space-between;
align-items: center;
height: 65px;
padding-right: 0;
.el-icon-setting {
display: flex;
justify-content: center;
align-items: center;
width: 60px;
height: 100%;
font-size: 20px;
color: #666;
cursor: pointer;
background: #eaeaea;
&:hover {
color: #000;
}
}
}
}
/deep/.el-table__empty-block {
z-index: 1;
position: relative;
background: white;
}
}
import { doFetch, doFetchGet } from "@/components/axios/api";
import url from "@/components/axios/url";
import {
checkFalse,
checkSuccess
} from "../../../../../static/js/checkStatus";
import authMethods from "@/mixins/auth";
import defaultImg from "../../../../../static/img/default.png";
import ImportDialog from '../components/importDialog.vue';
import { formatLongTime } from "@/utils/utils";
export default {
name: "frozen-member",
components: {
ImportDialog
},
mixins: [authMethods],
filters: {
formateTime(val){
if (!val || val == -1) return "--";
return formatLongTime(val, 1);
},
},
data() {
return {
dialogImportVisible: false,
defaultImg,
searchData: {
pageSize: 20,
currentPage: 1,
frozenType: -1,
phoneNameCard: '',
wxOrPos: -1,
fieldNames:
"name,nickName,photoUrl,cardNo,crateCardDateString,wxMember,posMember",
},
total: 0,
list: [],
multipleList: [],
formData:{
frozenType: '',
remark: ''
}
};
},
created() {
this.loadData();
},
watch: {
},
methods: {
loadData(){
doFetch(url.getMembersForFrozen, this.searchData).then((res) => {
let {errorCode,result} = res.data;
if (errorCode === 0) {
let {result:list,totalCount} = result;
this.list = list || [];
this.total = totalCount || 0;
} else {
checkFalse(res.data.message);
}
});
},
clearSelectedAll(){
this.$refs.multipleTable.clearSelection();
},
delSelectedItem(item){
this.$refs.multipleTable.toggleRowSelection(item,false);
},
handleSizeChange(pageSize){
this.searchData.pageSize = pageSize;
if((this.searchData.currentPage - 1) * this.searchData.pageSize > this.total){
this.searchData.currentPage = 1;
}
this.loadData();
},
handleCurrentChange(currentPage){
this.searchData.currentPage = currentPage;
this.loadData();
},
handleSelectionChange(selectionList){
selectionList = selectionList || [];
this.multipleList = selectionList;
},
resetSelected(){
this.$refs.selectedForm.resetFields();
this.$refs.multipleTable.clearSelection();
},
submitForm(formName) {
// if(!(this.multipleList && this.multipleList.length)){
// this.$message.warning('请选择要冻结的会员');
// return;
// }
// this.$refs[formName].validate((valid) => {
// if (valid) {
// alert('submit!');
// } else {
// console.log('error submit!!');
// return false;
// }
// });
this.$confirm("是否冻结所选会员?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
this.frozenMethod();
});
},
frozenMethod() {
let memberIds = this.multipleList.map((item)=>{
return item.memberId
}).join(',')
const datas = {
memberIds: memberIds, // 会员id 多个拼接起来, 隔开
remark: this.formData.remark, // 备注暂留
isCurrent: 0, // 所有会员是2 当前是1 其他是0
status: 1, // 1 冻结 0 解冻
frozenType: this.formData.frozenType, // 101.异常冻结、102.会员主动冻结
};
this.loading = true;
doFetch(url.batchUpdateFrozen, datas)
.then((res) => {
if (res.data.errorCode === 0) {
this.resetSelected();
this.handleToTaskCenter(res.data.result);
} else {
checkFalse(res.data.message);
}
})
.catch((err) => {
this.loading = false;
checkFalse(err);
});
},
handleToTaskCenter(id) {
this.$confirm(
`请去【系统】-【操作任务】-【任务中心】查看处理结果和执行进度`,
`任务发起成功`,
{
type: "success",
confirmButtonText: "去任务中心",
cancelButtonText: "取消",
showClose: false,
}
).then(()=>{
this.loadData();
window.open(`/gic-web/#/taskDetail/${id}`);
}).catch(()=>{
this.loadData();
});
},
batchUpload(){
this.dialogImportVisible = true;
}
}
};
.container {
// background-color: #fff;
// position: relative;
// box-sizing: border-box;
width: 100%;
display: flex;
height: 100%;
.table-box{
padding: 20px;
border-right: 1px solid #DCDFE6;
.search-box{
margin-bottom: 20px;
}
.basic-info-table {
color: #303133;
font-size: 14px;
.nick-name {
color: #909399;
font-size: 14px;
}
.basic-img {
display: inline-block;
vertical-align: middle;
height: 40px;
width: 40px;
min-width: 40px;
border-radius: 50%;
overflow: hidden;
margin-right: 10px;
}
}
.pager{
display: flex;
justify-content: flex-end;
align-items: center;
margin-top: 10px;
}
}
.page-right{
padding: 20px 20px 76px;
box-sizing: border-box;
width: 420px;
position: relative;
.selected-result-box{
height: 522px;
width: 380px;
overflow-y: scroll;
position: relative;
border: 1px solid #DCDFE6;
border-radius: 4px;
.selected-top{
display: flex;
align-items: center;
justify-content: space-between;
position: sticky;
top: 0;
z-index: 1;
width: 100%;
height: 60px;
padding: 0 16px;
.selected-count{
color: #37383A;
font-size: 14px;
}
}
.selected-list .selected-item{
display: flex;
align-items: center;
height: 40px;
&:hover{
background: #F7F8FA;
.icon-close{
background: #E5E6EB;
}
}
.user-header{
width: 30px;
height: 30px;
border-radius: 50%;
margin-left: 17px;
}
.user-name{
color: #47494C;
font-size: 14px;
margin: 0 10px;
flex: 1;
}
.icon-close{
color: #606266;
font-size: 14px;
padding: 3px;
border-radius: 50%;
margin-right: 12px;
}
}
}
.selected-bottom-box{
display: flex;
align-items: center;
justify-content: center;
height: 56px;
position: fixed;
width: 420px;
z-index: 1;
right: 0;
bottom: 0;
box-shadow: 0px -2px 8px 0px rgba(220,223,230,0.6000);
background: white;
}
}
}
.frozen-table {
.pager {
text-align: right;
padding: 20px 0 0;
}
/deep/.el-table-column--selection {
.cell {
padding-left: 16px;
padding-right: 0px;
}
}
/deep/.cell {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/deep/.table-select-page .cell {
padding-left: 10px;
padding-right: 0;
display: flex;
align-items: center;
.el-dropdown {
padding: 0;
}
}
}
/deep/.el-table {
/deep/.el-table__empty-block {
z-index: 1;
position: relative;
background: white;
}
}
<template>
<el-contaniner class="container">
<el-main class="table-box">
<el-row
type="flex"
align="middle"
justify="space-between"
class="search-box"
>
<el-input
v-model="searchData.phoneNameCard"
placeholder="输入姓名/昵称/手机号/会员卡号"
style="width: 260px"
@change="loadData"
>
<i slot="prefix" class="el-input__icon el-icon-search"></i>
</el-input>
<el-button plain @click="batchUpload"
><i class="iconfont icon-shangchuan"></i> 批量导入</el-button
>
</el-row>
<el-table
:data="list"
tooltip-effect="dark"
ref="multipleTable"
class="member-table"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
min-width="30"
fixed="left"
></el-table-column>
<el-table-column label="会员信息">
<template slot-scope="{ row }">
<!-- 基本信息 -->
<el-row type="flex" align="middle" class="basic-info-table">
<img :src="row.thirdImgUrl || defaultImg" class="basic-img" />
<div>
<div>
<span v-if="row.memberName">{{ row.memberName }}</span>
<span class="nick-name" v-if="row.nickName"
>({{ row.nickName }})</span
>
</div>
<div v-if="row.phoneNumber">
{{ row.phoneNumber }}
</div>
</div>
</el-row>
</template>
</el-table-column>
<el-table-column label="会员卡号" prop="cardNum"></el-table-column>
<el-table-column label="开卡时间">
<template slot-scope="{ row }">
{{ row.crateCardDateString | formateTime }}
</template>
</el-table-column>
</el-table>
<div class="pager" v-if="total > 0">
<dm-pagination
:page-size="searchData.pageSize"
:currentPage="searchData.currentPage"
:page-sizes="[20, 50, 75, 100]"
layout="total,sizes,prev, pager, next"
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
:total="total"
>
</dm-pagination>
</div>
<import-dialog
:dialogVisible.sync="dialogImportVisible"
@successImport="(taskId) => handleToTaskCenter(taskId)"
/>
</el-main>
<el-aside width="420px" class="page-right">
<div class="selected-result-box">
<el-row
class="selected-top"
type="flex"
align="middle"
justify="space-between"
>
<div class="selected-count">
已选:{{ multipleList.length }} 位会员
</div>
<el-button type="text" @click="clearSelectedAll">全部清除</el-button>
</el-row>
<div class="selected-list">
<div class="selected-item" v-for="item in multipleList" :key="item">
<img :src="item.thirdImgUrl || defaultImg" class="user-header" />
<div class="user-name">
<span v-if="item.memberName">{{ item.memberName }}</span>
<span class="nick-name" v-if="item.nickName"
>({{ item.nickName }})</span
>
</div>
<div
class="el-icon-close icon-close"
@click="delSelectedItem(item)"
></div>
</div>
</div>
</div>
<el-form
:model="formData"
label-position="top"
label-width="80px"
ref="selectedForm"
>
<el-form-item
label="冻结原因"
prop="frozenType"
required
:rules="{
required: true,
message: '请选择冻结原因',
}"
>
<el-select
v-model="formData.frozenType"
placeholder="请选择冻结原因"
style="width: 380px"
>
<el-option label="会员主动冻结" :value="1"></el-option>
<el-option label="异常冻结" :value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item
label="原因备注"
prop="remark"
required
:rules="{
required: true,
message: '请输入原因备注',
}"
>
<el-input
v-model="formData.remark"
:maxlength="20"
show-word-limit
placeholder="请输入原因备注"
></el-input>
</el-form-item>
</el-form>
<div class="selected-bottom-box">
<el-button plain @click="$router.go(-1)">取消</el-button>
<el-button
type="primary"
@click="submitForm('selectedForm')"
:disabled="
!(
multipleList &&
multipleList.length &&
formData.frozenType &&
formData.remark
)
"
>冻结选中会员</el-button
>
</div>
</el-aside>
</el-contaniner>
</template>
<script src="./frozen-member.js"></script>
<!-- <script>
import action from './abnormal-member.js';
export default { ...action };
</script> -->
<style lang="less">
</style>
<style lang="less" scoped src="./frozen-member.less"></style>
import { doFetch, doFetchGet } from "@/components/axios/api";
import url from "@/components/axios/url";
import {
checkFalse,
checkSuccess
} from "../../../../../static/js/checkStatus";
import authMethods from "@/mixins/auth";
import defaultImg from "../../../../../static/img/default.png";
import ImportDialog from '../components/importDialog.vue';
import { formatLongTime } from "@/utils/utils";
import FreezeDialog from '../../components/dialog/freeze.vue';
export default {
name: "frozen-member",
components: {
FreezeDialog,
ImportDialog
},
mixins: [authMethods],
filters: {
formatDate(val, format) {
if (!val || val == -1) return format == "hms" ? "" : "--";
let str = formatLongTime(val, 1);
let arr = str.split(" ");
if (format == "ymd") {
return arr[0];
} else if (format == "hms") {
return arr[1] || "";
}
return str;
},
formateTime(val){
if (!val || val == -1) return "--";
return formatLongTime(val, 1);
},
},
data() {
return {
freezeDialogOptions: {
count: 1,
isBatchFreeze: 0,
visible: false
},
whiteImportList:[
{
importType: 17,
importValue: "移入白名单",
}
],
dialogImportVisible: false,
defaultImg,
searchData: {
pageSize: 20,
currentPage: 1,
cardNo: '',
},
total: 0,
list: [],
multipleList: [],
formData:{
frozenType: '',
remark: ''
}
};
},
created() {
this.loadData();
},
watch: {
},
methods: {
loadData(){
doFetchGet(url.getFrozenWhiteList, this.searchData).then((res) => {
let {errorCode,result} = res.data;
if (errorCode === 0) {
let {result:list,totalCount} = result;
this.list = list || [];
this.total = totalCount || 0;
} else {
checkFalse(res.data.message);
}
});
},
handleSizeChange(pageSize){
this.searchData.pageSize = pageSize;
if((this.searchData.currentPage - 1) * this.searchData.pageSize > this.total){
this.searchData.currentPage = 1;
}
this.loadData();
},
handleCurrentChange(currentPage){
this.searchData.currentPage = currentPage;
this.loadData();
},
batchUpload(){
this.dialogImportVisible = true;
},
// 移出白名单
clickRemoveItem(item){
doFetchGet(url.removeFrozenWhiteMember,{
removeType: 1,
memberId: item.memberId,
}).then(res=>{
if(res.data.errorCode) {
this.$message({
message: "移出成功",
type: "success"
});
this.$nextTick(_ => {
this.loadData();
});
}
})
},
// 点击删除并冻结
clickRemoveAndFreeze(item){
this.freezeDialogOptions= {
count: 1,
isBatchFreeze: 0,
visible: true,
title: '移出并冻结',
submit:async (options)=>{
doFetchGet(url.removeFrozenWhiteMember,{
removeType: 2,
status: 1,
memberId: item.memberId,
frozenType: options.frozenType,
remark: options.remark || ""
}).then((res)=>{
if (res.data.errorCode === 0){
checkSuccess();
this.freezeDialogOptions = {
visible: false
};
}
})
}
}
},
linkDetail(memberId){
this.$router.push({
path: "/customerDetail",
query: { memberId }
});
}
}
};
.container {
padding: 20px;
background: white;
.top-header {
display: flex;
align-items: center;
margin-bottom: 20px;
h2 {
margin-right: 20px;
font-size: 16px;
font-weight: bold;
color: #303133;
line-height: 22px;
}
}
.search-box {
margin-bottom: 20px;
.tips-box{
margin: 0 16px;
i{
color: #2F54EB;
font-size: 14px;
}
span{
color: #606266;
font-size: 14px;
margin-left: 5px;
}
}
}
.member-table {
.basic-info-table {
color: #303133;
font-size: 14px;
.nick-name {
color: #909399;
font-size: 14px;
}
.basic-img {
display: inline-block;
vertical-align: middle;
height: 40px;
width: 40px;
min-width: 40px;
border-radius: 50%;
overflow: hidden;
margin-right: 10px;
}
}
.reason-label {
word-break: break-all;
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
}
/deep/.el-dialog__footer{
border-top: none;
padding: 10px 30px;
}
/deep/.el-dialog__body{
padding: 6px 30px 16px;
}
/deep/.el-dialog__header{
padding: 20px 30px 10px;
}
.pager {
display: flex;
justify-content: flex-end;
align-items: center;
margin-top: 10px;
}
}
/deep/.el-table {
/deep/.el-table__empty-block {
z-index: 1;
position: relative;
background: white;
}
}
<template>
<div class="container">
<div class="top-header">
<h2>白名单会员 {{ total }}</h2>
</div>
<el-row
type="flex"
align="middle"
justify="space-between"
class="search-box"
>
<el-row type="flex" align="middle">
<el-input
v-model="searchData.cardNo"
placeholder="输入会员卡号"
style="width: 260px"
@change="loadData"
>
<i slot="prefix" class="el-input__icon el-icon-search"></i>
</el-input>
<div class="tips-box">
<i class="el-icon-info"></i>
<span>处于白名单列表中的会员不会被冻结(外部接口冻结除外)</span>
</div>
</el-row>
<el-button plain @click="batchUpload"
><i class="icon iconfont icon-shangchuan"></i> 批量导入</el-button
>
</el-row>
<el-table
:data="list"
tooltip-effect="dark"
ref="multipleTable"
class="member-table"
>
<el-table-column label="会员信息">
<template slot-scope="{ row }">
<!-- 基本信息 -->
<el-row
type="flex"
align="middle"
class="basic-info-table"
@click="linkDetail(row.memberId)"
>
<img :src="row.thirdImgUrl || defaultImg" class="basic-img" />
<div>
<div>
<span v-if="row.memberName">{{ row.memberName }}</span>
<span class="nick-name" v-if="row.nickName"
>({{ row.nickName }})</span
>
</div>
<div v-if="row.phoneNumber">
{{ row.phoneNumber }}
</div>
</div>
</el-row>
</template>
</el-table-column>
<el-table-column label="会员等级" prop="memberGrade"></el-table-column>
<el-table-column label="会员生日" prop="birth"></el-table-column>
<el-table-column label="会员卡号" prop="cardNum"></el-table-column>
<el-table-column label="最近消费时间">
<template slot-scope="{ row }">
<div>
TODO
<div>{{ row.createTime | formatDate("ymd") }}</div>
<div>{{ row.createTime | formatDate("hms") }}</div>
</div>
</template>
</el-table-column>
<el-table-column
label="移入原因"
prop="reason"
label-class-name="reason-label"
></el-table-column>
<el-table-column label="操作" fixed="right" width="220">
<template slot-scope="{ row }">
<!--
:limit-code="getCode('memberIntoCustomDetail')"
v-if="getCodeAuth('memberIntoCustomDetail')"
-->
<el-button type="text" @click="linkDetail(row.memberId)"
>查看</el-button
>
<dm-delete
tips="确认移出白名单吗?"
@confirm="clickRemoveItem(row)"
placement="top-start"
>
<el-button type="text">仅移出</el-button>
</dm-delete>
<el-button
type="text"
@click="clickRemoveAndFreeze(row)"
v-if="row.frozenStatus != 1"
>移出并冻结</el-button
>
</template>
</el-table-column>
</el-table>
<div class="pager" v-if="total > 0">
<dm-pagination
:page-size="searchData.pageSize"
:currentPage="searchData.currentPage"
:page-sizes="[20, 40, 50]"
layout="total,sizes,prev, pager, next"
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
:total="total"
>
</dm-pagination>
</div>
<import-dialog
:importList="whiteImportList"
:dialogVisible.sync="dialogImportVisible"
@successImport="(taskId) => handleToTaskCenter(taskId)"
/>
<freeze-dialog
v-bind.sync="freezeDialogOptions"
v-if="freezeDialogOptions.visible"
/>
</div>
</template>
<script src="./white-list.js"></script>
<!-- <script>
import action from './abnormal-member.js';
export default { ...action };
</script> -->
<style lang="less">
</style>
<style lang="less" scoped src="./white-list.less"></style>
......@@ -120,14 +120,21 @@ export const constantRouterMap = [
},
{
path: '/frozenList',
component: _import('wechatmembers', 'frozenList'),
component: _import('wechatmembers', 'frozen-member/frozen-list/frozen-list'),
meta: {
title: '冻结会员列表',
},
},
{
path: '/frozenWhiteList',
component: _import('wechatmembers', 'frozen-member/white-list/white-list'),
meta: {
title: '冻结会员白名单',
},
},
{
path: '/frozenList/frozenMember',
component: _import('wechatmembers', 'frozenMember'),
component: _import('wechatmembers', 'frozen-member/frozen-member/frozen-member'),
meta: {
title: '冻结会员',
},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment