Commit 90a479bc by member

会员分层

parents 225fc223 baf3faf6
<!DOCTYPE html><html><head><meta charset=utf-8><link rel="shortcut icon" href=./favicon.ico><title>GIC-会员标签</title><link href=./static/css/app.381718fe43ab99a2ee84ef8039b2d8cf.css rel=stylesheet></head><body style="background-color: #f0f2f5;min-width: 1400px;"><div id=app></div><script src=//web-1251519181.file.myqcloud.com/lib/vue/2.6.6/vue.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vue-router/3.0.2/vue-router.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vuex/3.1.0/vuex.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/elementUI/index.2.5.4.js></script><script src=//web-1251519181.file.myqcloud.com/components/header.2.0.35.js></script><script src=//web-1251519181.file.myqcloud.com/components/footer.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-new.2.0.55.js></script><script src=//web-1251519181.file.myqcloud.com/components/aside-menu.2.0.11.js></script><script src=//web-1251519181.file.myqcloud.com/components/area-ab.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/card.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/selector.1.1.95.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.13.js></script><script type=text/javascript src=./static/js/manifest.155689b03bd2fedf0a24.js></script><script type=text/javascript src=./static/js/vendor.4aa38b9b9bf3652c83db.js></script><script type=text/javascript src=./static/js/app.874fe4e33ce7ce37428d.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><link rel="shortcut icon" href=./favicon.ico><title>GIC-会员标签</title><link href=./static/css/app.d9a1259c4c97b52cb74769fb16e83b29.css rel=stylesheet></head><body style="background-color: #f0f2f5;min-width: 1400px;"><div id=app></div><script src=//web-1251519181.file.myqcloud.com/lib/vue/2.6.6/vue.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vue-router/3.0.2/vue-router.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vuex/3.1.0/vuex.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/elementUI/index.2.5.4.js></script><script src=//web-1251519181.file.myqcloud.com/components/header.2.0.35.js></script><script src=//web-1251519181.file.myqcloud.com/components/footer.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-new.2.0.55.js></script><script src=//web-1251519181.file.myqcloud.com/components/aside-menu.2.0.11.js></script><script src=//web-1251519181.file.myqcloud.com/components/area-ab.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/card.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/selector.1.1.95.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.13.js></script><script type=text/javascript src=./static/js/manifest.b7b1e78509078bc85086.js></script><script type=text/javascript src=./static/js/vendor.4aa38b9b9bf3652c83db.js></script><script type=text/javascript src=./static/js/app.874fe4e33ce7ce37428d.js></script></body></html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
!function(e){var c=window.webpackJsonp;window.webpackJsonp=function(a,t,o){for(var f,b,d,i=0,u=[];i<a.length;i++)b=a[i],n[b]&&u.push(n[b][0]),n[b]=0;for(f in t)Object.prototype.hasOwnProperty.call(t,f)&&(e[f]=t[f]);for(c&&c(a,t,o);u.length;)u.shift()();if(o)for(i=0;i<o.length;i++)d=r(r.s=o[i]);return d};var a={},n={34:0};function r(c){if(a[c])return a[c].exports;var n=a[c]={i:c,l:!1,exports:{}};return e[c].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.e=function(e){var c=n[e];if(0===c)return new Promise(function(e){e()});if(c)return c[2];var a=new Promise(function(a,r){c=n[e]=[a,r]});c[2]=a;var t=document.getElementsByTagName("head")[0],o=document.createElement("script");o.type="text/javascript",o.charset="utf-8",o.async=!0,o.timeout=12e4,r.nc&&o.setAttribute("nonce",r.nc),o.src=r.p+"static/js/"+e+"."+{0:"a3bfe3171fca68d88c04",1:"1a66f3452cb905b67755",2:"51c10f307a1867be3bbc",3:"ea9a2b3e1cccc88cf5b7",4:"3087e4cbcb99538cc174",5:"aa7046daf624677aeaa5",6:"24c76afcd0a00f1d28b0",7:"463c410b570dea893bef",8:"00c99a671866c96c95b7",9:"d6e86c55d9ed30932539",10:"921af27f26a9d92cd622",11:"7696c743e78e8fa58ee3",12:"db122dd8c01704284b65",13:"4cbb12cbf7a9b8c30ba8",14:"012b850d5f8cb0572383",15:"3917aa09ec184a6ec064",16:"8b5816be3cf77b0756a0",17:"b43a253e53779917cbec",18:"16936cf5d39aeb5c8313",19:"308e228686726571bdcf",20:"41af8655086750d6262e",21:"642ea8376342e403d331",22:"1f5fb7a3cf35a2d10b33",23:"5cd622ab4c1b1afa3f6f",24:"babff488cb202e2e3303",25:"75fb7d5b168203653102",26:"b708c6b0a0da9bd559cf",27:"a91f14144ead01b55416",28:"7e8ce9ee59e705c91770",29:"14583ddcefc3b8dbbad1",30:"6a5ee2a1c27c5a16c485",31:"4581161a7b4779f896f3"}[e]+".js";var f=setTimeout(b,12e4);function b(){o.onerror=o.onload=null,clearTimeout(f);var c=n[e];0!==c&&(c&&c[1](new Error("Loading chunk "+e+" failed.")),n[e]=void 0)}return o.onerror=o.onload=b,t.appendChild(o),a},r.m=e,r.c=a,r.d=function(e,c,a){r.o(e,c)||Object.defineProperty(e,c,{configurable:!1,enumerable:!0,get:a})},r.n=function(e){var c=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(c,"a",c),c},r.o=function(e,c){return Object.prototype.hasOwnProperty.call(e,c)},r.p="./",r.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
!function(e){var c=window.webpackJsonp;window.webpackJsonp=function(a,t,o){for(var f,d,b,i=0,u=[];i<a.length;i++)d=a[i],n[d]&&u.push(n[d][0]),n[d]=0;for(f in t)Object.prototype.hasOwnProperty.call(t,f)&&(e[f]=t[f]);for(c&&c(a,t,o);u.length;)u.shift()();if(o)for(i=0;i<o.length;i++)b=r(r.s=o[i]);return b};var a={},n={34:0};function r(c){if(a[c])return a[c].exports;var n=a[c]={i:c,l:!1,exports:{}};return e[c].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.e=function(e){var c=n[e];if(0===c)return new Promise(function(e){e()});if(c)return c[2];var a=new Promise(function(a,r){c=n[e]=[a,r]});c[2]=a;var t=document.getElementsByTagName("head")[0],o=document.createElement("script");o.type="text/javascript",o.charset="utf-8",o.async=!0,o.timeout=12e4,r.nc&&o.setAttribute("nonce",r.nc),o.src=r.p+"static/js/"+e+"."+{0:"d3fa8a7d5eedd301de63",1:"1a66f3452cb905b67755",2:"1e821bca0bf41785011d",3:"6d47633c055d15efc02c",4:"76c2c1a5d7c12ba68fc8",5:"7c7c8f86fde6c947e157",6:"176e10d735209c29da16",7:"463c410b570dea893bef",8:"00c99a671866c96c95b7",9:"d6e86c55d9ed30932539",10:"921af27f26a9d92cd622",11:"7696c743e78e8fa58ee3",12:"b9471a24276d301a1e38",13:"4cbb12cbf7a9b8c30ba8",14:"012b850d5f8cb0572383",15:"3917aa09ec184a6ec064",16:"8b5816be3cf77b0756a0",17:"b43a253e53779917cbec",18:"16936cf5d39aeb5c8313",19:"308e228686726571bdcf",20:"41af8655086750d6262e",21:"938961d07778dc041c56",22:"1f5fb7a3cf35a2d10b33",23:"5cd622ab4c1b1afa3f6f",24:"babff488cb202e2e3303",25:"75fb7d5b168203653102",26:"b708c6b0a0da9bd559cf",27:"a91f14144ead01b55416",28:"7e8ce9ee59e705c91770",29:"14583ddcefc3b8dbbad1",30:"6a5ee2a1c27c5a16c485",31:"4581161a7b4779f896f3"}[e]+".js";var f=setTimeout(d,12e4);function d(){o.onerror=o.onload=null,clearTimeout(f);var c=n[e];0!==c&&(c&&c[1](new Error("Loading chunk "+e+" failed.")),n[e]=void 0)}return o.onerror=o.onload=d,t.appendChild(o),a},r.m=e,r.c=a,r.d=function(e,c,a){r.o(e,c)||Object.defineProperty(e,c,{configurable:!1,enumerable:!0,get:a})},r.n=function(e){var c=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(c,"a",c),c},r.o=function(e,c){return Object.prototype.hasOwnProperty.call(e,c)},r.p="./",r.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
......@@ -5,7 +5,18 @@ export const baseUrl = host.indexOf('localhost') > '-1' ? 'http://gicdev.demogic
export const ERR_OK = 0;
export const aliasNames = [
{ name: '核心会员', title: '会员近一年,消费次数≥3次,且消费总额≥3倍商户近一年会员平均客单价'},
{ name: '潜力会员', title: '除核心会员、普通会员、未消费会员之外的其他会员' },
{ name: '普通会员', title: '会员历史累计消费,消费次数等于1' },
{ name: '未消费会员', title: '会员历史累计消费,消费次数等于0' }];
{ name: '核心活跃', title: '会员近一年,消费次数≥3次,消费总额≥3倍商户近一年会员平均客单价且消费休眠天数为0-90天'},
{ name: '潜力活跃', title: '除核心会员、普通会员、未消费会员之外的其他会员且消费休眠天数为0-90天' },
{ name: '普通活跃', title: '会员历史累计消费,消费次数等于1且消费休眠天数为0-90天' },
{ name: '核心休眠', title: '会员近一年,消费次数≥3次,消费总额≥3倍商户近一年会员平均客单价且消费休眠天数为91-180天'},
{ name: '潜力休眠', title: '除核心会员、普通会员、未消费会员之外的其他会员且消费休眠天数为91-180天' },
{ name: '普通休眠', title: '会员历史累计消费,消费次数等于1且消费休眠天数为91-180天' },
{ name: '核心沉睡', title: '会员近一年,消费次数≥3次,消费总额≥3倍商户近一年会员平均客单价且消费休眠天数为181-360天'},
{ name: '潜力沉睡', title: '除核心会员、普通会员、未消费会员之外的其他会员且消费休眠天数为181-360天' },
{ name: '普通沉睡', title: '会员历史累计消费,消费次数等于1且消费休眠天数为181-360天' },
{ name: '核心流失', title: '会员近一年,消费次数≥3次,消费总额≥3倍商户近一年会员平均客单价且消费休眠天数>360天'},
{ name: '潜力流失', title: '除核心会员、普通会员、未消费会员之外的其他会员且消费休眠天数>360天' },
{ name: '普通流失', title: '会员历史累计消费,消费次数等于1且消费休眠天数>360天' },
{ name: '有微信未消费会员', title: '会员历史累计消费,消费次数等于0' },
{ name: '有手机号未消费会员', title: '会员历史累计消费,消费次数等于0' },
];
......@@ -34,7 +34,7 @@
<span :class="['download-failed-btn', {disabled: scope.row.status === 5}]" @click="downloadErrorData(scope.row)">点击下载</span>
失败会员清单
</span>
<span v-show="uploadedTag.includes(scope.row.tagItemId)">
<span v-show="scope.row.errorCount > 0 || scope.row.successCount > 0">
成功{{scope.row.successCount}}条,失败{{scope.row.errorCount}}
</span>
</span>
......@@ -580,6 +580,7 @@ export default {
this.tagValTableData[tagItemIndex].errorCount = result.needError;
// 重置百分比为0
this.tagValTableData[tagItemIndex].percent = 0;
this.getValueData();
}
break;
default:
......
......@@ -118,12 +118,16 @@
</el-select>
</el-form-item>
<el-form-item label :class="{'m-l-60': ruleForm.selectedTags.length > 1}">
<el-tooltip class="item" effect="dark" content="您商户的非实时分组数量已达到上限" placement="top-start" v-if="isAllowAdd && ruleForm.isActive == 0">
<div class="tips-count" style="color: red;margin-bottom: 15px;" v-show="ruleForm.isActive == 0 && realCount.totalCount <= realCount.currCount">
您的非实时会员分组数量已达上限{{realCount.totalCount}},建议您删除或失效部分非实时会员分组!
</div>
<el-tooltip class="item" effect="dark" :disabled="ruleForm.isActive == 0 && realCount.totalCount <= realCount.currCount" content="您商户的非实时分组数量已达到上限" placement="top-start" v-if="isAllowAdd && ruleForm.isActive == 0">
<el-button type="primary" style="color: #c0c4cc;cursor: not-allowed;background-image: none;background-color: #F5F7FA;border-color: #DCDFE6;">{{$route.query.memberTagGroupId ? '保存': '创建会员分组'}}</el-button>
</el-tooltip>
<el-button
v-else
type="primary"
:disabled="ruleForm.isActive == 0 && realCount.totalCount <= realCount.currCount"
@click.stop="confirmSavePost"
>{{$route.query.memberTagGroupId ? '保存': '创建会员分组'}}</el-button>
<el-button>
......@@ -200,7 +204,7 @@ import tagsGroupList from './tags-group-list.vue';
import showMsg from '@/common/js/showmsg';
import { postRequest } from '@/api/api';
import { getMemberTagCount } from '@/request/memberGroup.js';
import { getMemberTagList, memberGroupList, getIsAllowAdd } from '@/request/api.js';
import { getMemberTagList, memberGroupList, getIsAllowAdd, groupCount } from '@/request/api.js';
export default {
name: 'memberGroupEdit',
......@@ -223,6 +227,7 @@ export default {
}
};
return {
realCount: {},
templateCode: '',
// 编辑数据
ruleForm: {
......@@ -403,6 +408,13 @@ export default {
}
},
methods: {
_groupCount() {
groupCount().then(res => {
if (res.errorCode == 1) {
this.realCount = res.result;
}
})
},
/**
* 路由跳转
*/
......@@ -698,6 +710,7 @@ export default {
this.getTagsGroupList();
this.getMemberGroupList();
this.getIsAllowAdd();
this._groupCount();
},
components: {
navCrumb,
......
......@@ -214,7 +214,7 @@
<el-table-column label="操作" width="150px">
<template slot-scope="scope">
<router-link
:to="`/memberLevelDetail?memberTagGradeId=${scope.row.memberTagGradeId}&aliasName=${scope.row.aliasName}`"
:to="`/memberLevelDetail?memberTagGroupId=${scope.row.memberTagGroupId}&aliasName=${scope.row.groupName}`"
class="edit-btn el-button--text p-r-12">
详情
</router-link>
......@@ -339,13 +339,12 @@ export default {
}
},
filters: {
aliasTips(aliasName) {
let item = aliasNames.find(el => el.name === aliasName);
if (aliasName && item) {
aliasTips(name) {
let item = aliasNames.find(el => el.name === name);
if (item) {
return item.title;
} else {
return '';
}
return '';
},
formatTimeYMD(data) {
return data && data != '- -' ? data.split(' ')[0] : '--';
......@@ -427,8 +426,8 @@ export default {
};
if (tag) {
// 分层
Ids = this.groupTableData.map(el => el.memberTagGradeId).join(',');
param.gradeIds = Ids;
Ids = this.groupTableData.map(el => el.memberTagGroupId).join(',');
param.memberTagGroupIds = Ids;
} else {
Ids = this.groupTableData.map(el => el.memberTagGroupId).join(',');
param.memberTagGroupIds = Ids;
......@@ -452,6 +451,7 @@ export default {
refreshList() {
this.getGroupList();
},
// 分层数据
_gradeList(id) {
const params = {
pageNum: this.currentPage,
......@@ -467,11 +467,12 @@ export default {
},
// 会员分组二级
getsecondList(list) {
console.log(list);
if (list === 'allLevel') {
this.isTag = true;
this.isRecommend = true;
this.isTagRecommend = true;
this.memberTagGradeId = '';
this.memberTagGroupId = '';
this.currentPage = 1;
this.pageSize = 20;
this._gradeList();
......@@ -487,7 +488,7 @@ export default {
return;
}
if (list.isTag) {
// 分层数据
// 分层数据 需要传memberTagGradeId字段
this.isTag = true;
this.isRecommend = true;
this.isTagRecommend = true;
......@@ -822,10 +823,12 @@ export default {
* 通过状态筛选列表
*/
searchByStatus(val) {
this.params.pageNum = 1;
this.params.effectiveStatus = val;
this.getGroupList();
},
realTimeStatus(val) {
this.params.pageNum = 1;
this.params.isRealTime = val;
this.getGroupList();
},
......
......@@ -8,7 +8,7 @@
<span>( {{ tips }} )</span>
<span class="group-total m-l-20 p-l-20">
覆盖人数
<span>{{ memberCount }}</span>
<span>{{ separator(total) }}</span>
</span>
<el-button type="primary" class="down-member-list__btn" @click="downMemberListPop.show = true" v-if="downMemberListPop.canDown">人群导出</el-button>
......@@ -301,7 +301,7 @@ export default {
data() {
return {
memberCount: 0,
aliasName: '',
aliasName: this.$route.query.aliasName,
loading: true,
// 自定义字段列表是否显示
showUserDefined: false,
......@@ -311,7 +311,7 @@ export default {
downMemberListPop: {
canDown: false,
show: false,
excelUrl: '/member-tag-member/memberTagGrade/memberExportExcel',
excelUrl: '/gic-member-tag-web/member-tag-member/memberExportExcel',
params: {
memberTagGroupId: '',
requestProject: 'member-tag'
......@@ -377,14 +377,12 @@ export default {
];
},
tips() {
let aliasName = this.$route.query.aliasName;
let item = aliasNames.find(el => el.name === aliasName);
if (aliasName && item) {
console.log(item)
let name = this.$route.query.aliasName;
let item = aliasNames.find(el => el.name === name);
if (item) {
return item.title;
} else {
return '';
}
return '';
}
},
......@@ -537,9 +535,9 @@ export default {
*/
getGroupDetail(list) {
let that = this;
let memberTagGradeId = this.$route.query.memberTagGradeId;
let memberTagGroupId = this.$route.query.memberTagGroupId;
let params = {
memberTagGradeId,
memberTagGroupId,
pageNum: this.currentPage,
pageSize: this.pageSize,
pageName: 'memberSign',
......@@ -645,9 +643,10 @@ export default {
getTagLists({ requestProject: 'gic-member-tag-web' }).then(res => {
if (res.errorCode === 1) {
const ret = res.result;
let memberTagGradeId = this.$route.query.memberTagGradeId;
let target = ret.find(el => el.memberTagGradeId === memberTagGradeId);
this.aliasName = target.aliasName;
console.log(ret);
let memberTagGroupId = this.$route.query.memberTagGroupId;
let target = ret.find(el => el.memberTagGroupId === memberTagGroupId);
// this.aliasName = target.aliasName;
this.memberCount = target.memberCount;
}
});
......
......@@ -112,14 +112,14 @@
<el-option v-for="(item, index) in rateData[tagConfig.updateType ? tagConfig.updateType - 1 : 0].options" :key="item" :label="item" :value="index + 1"></el-option>
</el-select>
</div>
<p class="tips-count" v-show="tagConfig.isRealTime == 0 && realCount.totalCount == realCount.currCount">
<p class="tips-count" v-show="tagConfig.isRealTime == 0 && realCount.totalCount <= realCount.currCount">
您的非实时会员分组数量已达上限{{realCount.totalCount}},建议您删除或失效部分非实时会员分组!
</p>
</div>
</div>
<div class="fixed-btn">
<el-button type="primary" @click="createNewGroup" :disabled="tagConfig.isRealTime == 0 && realCount.totalCount == realCount.currCount">创建会员分组</el-button>
<!-- 当前人数大于总人数 -->
<el-button type="primary" @click="createNewGroup" :disabled="tagConfig.isRealTime == 0 && realCount.totalCount <= realCount.currCount">创建会员分组</el-button>
</div>
</div>
<edit-tag :showEditTagPop.sync="showEditTagPop" :tagData="tagData" :title="editPopType === 'add' ? '添加标签' : '更新标签'" @returnTagData="returnTagData" @refersh="refersh"></edit-tag>
......
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