Commit e0cea002 by 陈羽

Merge branch 'dev' of http://git.gicdev.com/marketing-web/marketing into feature/门店签到需求

parents aca63fcf 1d920043
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=./static/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=static/fonts/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link rel=stylesheet href=//web-1251519181.file.myqcloud.com/components/element.2.12.0.css><link href=/marketing/static/css/main.611ef6dbce9d0672c7efe94156a40035.css rel=stylesheet></head><body><div id=app></div><script src=//web-1251519181.file.myqcloud.com/lib/vue/2.5.2/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/components/element.2.12.0.js></script><script src=//web-1251519181.file.myqcloud.com/components/header.2.0.45.js></script><script src=//web-1251519181.file.myqcloud.com/components/footer.2.0.04.js></script><script src=//web-1251519181.file.myqcloud.com/components/card.2.0.19.js></script><script src=//web-1251519181.file.myqcloud.com/components/store.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/img-preview.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/member-group.2.2.28.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-card.2.0.30.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-new.2.0.71.js></script><script src=//web-1251519181.file.myqcloud.com/components/confirm-people.2.0.06.js></script><script src=//web-1251519181.file.myqcloud.com/components/people.2.0.43.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.16.js></script><script src=//web-1251519181.file.myqcloud.com/components/input.2.0.20.js></script><script src=//web-1251519181.file.myqcloud.com/components/delete.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/selector.1.2.21.js></script><script src=//web-1251519181.file.myqcloud.com/components/pagination.1.0.8.js></script><script src=//web-1251519181.file.myqcloud.com/components/track.1.0.4.js></script><script src=//web-1251519181.file.myqcloud.com/components/activity-select.1.0.2.1.js></script><script type=text/javascript src=/marketing/static/js/manifest.8840a4288428b22b2c78.js></script><script type=text/javascript src=/marketing/static/js/vendor.fef1c3d3b3b586faaee2.js></script><script type=text/javascript src=/marketing/static/js/main.19fe2027c79604e65f20.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=./static/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=static/fonts/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link rel=stylesheet href=//web-1251519181.file.myqcloud.com/components/element.2.12.0.css><link href=/marketing/static/css/main.f88e627fe9c2f47fffeea67dfe83437e.css rel=stylesheet></head><body><div id=app></div><script src=//web-1251519181.file.myqcloud.com/lib/vue/2.5.2/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/components/element.2.12.0.js></script><script src=//web-1251519181.file.myqcloud.com/components/header.2.0.45.js></script><script src=//web-1251519181.file.myqcloud.com/components/footer.2.0.04.js></script><script src=//web-1251519181.file.myqcloud.com/components/card.2.0.19.js></script><script src=//web-1251519181.file.myqcloud.com/components/store.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/img-preview.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/member-group.2.2.28.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-card.2.0.30.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-new.2.0.71.js></script><script src=//web-1251519181.file.myqcloud.com/components/confirm-people.2.0.06.js></script><script src=//web-1251519181.file.myqcloud.com/components/people.2.0.43.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.16.js></script><script src=//web-1251519181.file.myqcloud.com/components/input.2.0.20.js></script><script src=//web-1251519181.file.myqcloud.com/components/delete.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/selector.1.2.21.js></script><script src=//web-1251519181.file.myqcloud.com/components/pagination.1.0.8.js></script><script src=//web-1251519181.file.myqcloud.com/components/track.1.0.4.js></script><script src=//web-1251519181.file.myqcloud.com/components/activity-select.1.0.2.1.js></script><script type=text/javascript src=/marketing/static/js/manifest.133046892ee2270320a7.js></script><script type=text/javascript src=/marketing/static/js/vendor.fef1c3d3b3b586faaee2.js></script><script type=text/javascript src=/marketing/static/js/main.8eb765b5e05106393576.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.
!function(e){var r=window.webpackJsonp;window.webpackJsonp=function(n,c,o){for(var f,i,u,d=0,s=[];d<n.length;d++)i=n[d],t[i]&&s.push(t[i][0]),t[i]=0;for(f in c)Object.prototype.hasOwnProperty.call(c,f)&&(e[f]=c[f]);for(r&&r(n,c,o);s.length;)s.shift()();if(o)for(d=0;d<o.length;d++)u=a(a.s=o[d]);return u};var n={},t={15:0};function a(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.e=function(e){var r=t[e];if(0===r)return new Promise(function(e){e()});if(r)return r[2];var n=new Promise(function(n,a){r=t[e]=[n,a]});r[2]=n;var c=document.getElementsByTagName("head")[0],o=document.createElement("script");o.type="text/javascript",o.charset="utf-8",o.async=!0,o.timeout=12e4,a.nc&&o.setAttribute("nonce",a.nc),o.src=a.p+"static/js/"+({0:"card",1:"game",2:"wechat",3:"message",4:"ewash",5:"scan",6:"ecm",7:"evaluation",8:"activity",9:"cdKey",10:"recharge",11:"msg",12:"calllog"}[e]||e)+"."+{0:"2f9603c116423b6b361f",1:"398009c91a7388812f00",2:"1aad863c428279c5a169",3:"83c06aa714fa01a48b43",4:"2aea6e7dfdf4a40cb08d",5:"8bd541c751250b17214b",6:"15abd389a209cbea82f5",7:"ecf8f42559b898ee9c01",8:"5ddb72b68fcdf6943011",9:"52134b24fc8b9e9e0f7a",10:"fd4ef6af3cd790ec9e39",11:"00a6edc9657c9e4c34fa",12:"f1c9fa1ccd0d36ae0602"}[e]+".js";var f=setTimeout(i,12e4);function i(){o.onerror=o.onload=null,clearTimeout(f);var r=t[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return o.onerror=o.onload=i,c.appendChild(o),n},a.m=e,a.c=n,a.d=function(e,r,n){a.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},a.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(r,"a",r),r},a.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},a.p="/marketing/",a.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
!function(e){var r=window.webpackJsonp;window.webpackJsonp=function(n,a,o){for(var f,i,u,d=0,s=[];d<n.length;d++)i=n[d],t[i]&&s.push(t[i][0]),t[i]=0;for(f in a)Object.prototype.hasOwnProperty.call(a,f)&&(e[f]=a[f]);for(r&&r(n,a,o);s.length;)s.shift()();if(o)for(d=0;d<o.length;d++)u=c(c.s=o[d]);return u};var n={},t={15:0};function c(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,c),t.l=!0,t.exports}c.e=function(e){var r=t[e];if(0===r)return new Promise(function(e){e()});if(r)return r[2];var n=new Promise(function(n,c){r=t[e]=[n,c]});r[2]=n;var a=document.getElementsByTagName("head")[0],o=document.createElement("script");o.type="text/javascript",o.charset="utf-8",o.async=!0,o.timeout=12e4,c.nc&&o.setAttribute("nonce",c.nc),o.src=c.p+"static/js/"+({0:"card",1:"game",2:"wechat",3:"message",4:"ewash",5:"scan",6:"ecm",7:"evaluation",8:"activity",9:"cdKey",10:"recharge",11:"msg",12:"calllog"}[e]||e)+"."+{0:"db1a71be3cfd9f2c2a27",1:"4e36dc6b55e0fd2d3c84",2:"1aad863c428279c5a169",3:"83c06aa714fa01a48b43",4:"c8a5e5c668cdc258c3c4",5:"b47c86054f1d394a7cc6",6:"45bb9fe80d5596758194",7:"ecf8f42559b898ee9c01",8:"35efeb2ae926b54b4341",9:"acd1803f49e3f7121560",10:"e5cd16e4f5e1229ea313",11:"00a6edc9657c9e4c34fa",12:"f1c9fa1ccd0d36ae0602"}[e]+".js";var f=setTimeout(i,12e4);function i(){o.onerror=o.onload=null,clearTimeout(f);var r=t[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return o.onerror=o.onload=i,a.appendChild(o),n},c.m=e,c.c=n,c.d=function(e,r,n){c.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},c.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(r,"a",r),r},c.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},c.p="/marketing/",c.oe=function(e){throw console.error(e),e}}([]);
\ 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.
......@@ -41,7 +41,7 @@ export default {
},
{
path: 'data-view/:id',
name: '数据对话数据概览',
name: '数据概览',
component: () => import(/* webpackChunkName: "activity" */ '../../views/activity/data-view.vue'),
meta: {
path: '/activity/list'
......
......@@ -75,6 +75,9 @@ export const exportBackCoupExcel = config.api + PREFIX + 'export-back-coup-excel
//卡券营销--卡券记录--投放记录--删除记录
export const deleteCardPuton = params => requests(PREFIX + 'delete-card-puton', params);
//卡券营销--卡券记录--投放记录--刷新记录
export const refreshPutOnCount = params => requests(PREFIX + 'refresh-put-on-count', params);
//卡券营销--卡券记录--领取记录--核销--(1)获取满足核销条件的订单
export const listCoupcardOrder = params => requests(PREFIX + 'list-coupcard-order', params);
......
......@@ -42,3 +42,5 @@ export const exportBatchSendDetails = config.api + PREFIX + 'export-batch-send-d
// 智能营销--实时人员列表--导出csv
export const exportCurrentSendDetails = config.api + PREFIX + 'export-current-send-details';
export const getUseStoredFalg = params => requests(PREFIX + 'get-ecm-store-flag', params);
......@@ -41,3 +41,15 @@ export const rechargeStep2 = params => requests(PREFIX + 'recharge-step-3', para
//获取账户状态 是否欠费
export const getAccountStateInfo = params => requests(PREFIX + 'account-state-info', params);
//计费中心--消费详情-视频列表
export const videoPage = params => requests('api-mall/' + 'get-traffic-cost-page', params);
//计费中心--视频流量
export const todayVideoTraffic = params => requests('api-mall/' + 'today-traffic', params);
//计费中心--消费详情-视频折线图
export const videoChartData = params => requests('api-mall/' + 'get-traffic-cost-picture', params);
//计费中心--消费详情-视频列表-导出
export const downloadTrafficCostListExcel = config.api + 'api-mall/' + 'download-traffic-cost-list-execl';
......@@ -180,7 +180,7 @@ export default {
},
created() {
this.$store.commit('aside_handler', false);
this.$store.commit('mutations_breadcrumb', [{ name: '数据对话', path: '/activity/list' }, { name: '数据概览', path: '' }]); // eslint-disable-line
this.$store.commit('mutations_breadcrumb', [{ name: '数据对话', path: '/activity/list' }, { name: '数据概览', path: '' }]); // eslint-disable-line
}
};
</script>
......
......@@ -20,7 +20,8 @@
</div>
</el-form-item>
<el-form-item label="门店范围">
<vue-gic-store-new :options="options" :isAdd="isAdd" :creatorId="creatorId" :scenesVal="scenes" scenes="auth" :uuid.sync="ruleForm.storeGroup" ref="storeNew" @store-change="storeChange"></vue-gic-store-new>
<!-- ruleForm.storeGroup:{{ ruleForm.storeGroup }}==info.storeGroup:{{ info.storeGroup }} -->
<vue-gic-store-new :options="options" :isAdd="isAdd" :creatorId="creatorId" :scenesVal="scenes" scenes="auth" :uuid="ruleForm.storeGroup" ref="storeNew" @store-change="storeChange"></vue-gic-store-new>
<div v-if="disabled && info.storeGroup != ruleForm.storeGroup" class="gray fz12"><i class="el-icon-warning mr5 red fz12"></i>数据对话已生效,门店修改无效</div>
</el-form-item>
<el-form-item>
......@@ -159,10 +160,8 @@ export default {
});
},
// *********门店选择器********
storeChange() {
return;
// if (this.disabled) {
// }
storeChange(storeId) {
this.ruleForm.storeGroup = storeId;
},
// *********会员分组**********
handleDataTransferred(data) {
......
......@@ -134,6 +134,7 @@ export default {
const that = this;
return {
requestProject: 'marketing',
gicCouponType: '', // gic定义的卡券类型(0:普通卡券, 1:e待洗, 2:好办卡券, 3:微盟外部券, 4:通用外部券
creatorId: '',
uuid: '',
canEdit: false,
......@@ -248,7 +249,8 @@ export default {
// 转赠页面首图
code: '015f1e5a-3b2f-42f5-b638-6a29c17e8f7e',
imgUrl: 'https://pic01-10001430.image.myqcloud.com/015f1e5a-3b2f-42f5-b638-6a29c17e8f7e'
}
},
showWeimobDemoSelector: false
};
},
watch: {
......@@ -404,6 +406,7 @@ export default {
},
// 改变用户使用有效期类型
changeCardEffectiveMode(val, cover = true) {
this.form.sendDateTime = [];
this.reCheckSendDateTime();
const { dateTime, sendDateTime } = this.form;
if (!cover && sendDateTime && sendDateTime[0]) {
......@@ -428,8 +431,8 @@ export default {
if (val == 0) {
// 想要设置为自动领取
this.$confirm(
`<div class="fz16 mb10">是否关闭用户手动领取?</div><div class="regular-font-color fz13">用户在领取卡券后需要<b class="bold">同步至ERP</b>,如果关闭用户<b class="bold">手动领取</b>,卡券在<b class="bold">批量投放</b>时会需要将卡券信息批量同步至ERP。
该过程可能需要持续一段时间(具体同步时间和同步卡券张数以及ERP性能有关,参考同步时间为1万张卡券1个小时)。
`<div class="fz16 mb10">是否关闭用户手动领取?</div><div class="regular-font-color fz13">用户在领取卡券后需要<b class="bold">同步至ERP</b>,如果关闭用户<b class="bold">手动领取</b>,卡券在<b class="bold">批量投放</b>时会需要将卡券信息批量同步至ERP。
该过程可能需要持续一段时间(具体同步时间和同步卡券张数以及ERP性能有关,参考同步时间为1万张卡券1个小时)。
当前支持不需要用户手动领取的卡券库存最大值为<b class="bold">${this.couponAutoGetStock}</b>张。</div>`,
'提示',
{
......@@ -512,7 +515,9 @@ export default {
if (res.result.card) {
const card = res.result.card;
// 3、4为外部券,不显示保存按钮
this.storeMode = card.storeMode === 0 ? 0 : 1;
this.gicCouponType = card.gicCouponType;
this.form.cardApplyChannel = card.cardApplyChannel ? card.cardApplyChannel.split(',') : [];
this.form.auditingStatus = card.auditingStatus || '';
this.form.giveFlag = card.giveFlag;
......@@ -562,7 +567,9 @@ export default {
this.only = Boolean(useCondition.only);
this.form.proNoList = useCondition.proNo ? [{ name: useCondition.proNo, id: useCondition.proNo }] : [];
}
if (card.weimobDemoCode && JSON.parse(card.weimobDemoCode).length > 0) {
this.showWeimobDemoSelector = true;
}
// 微盟券号 -- 复制不赋值
if (card.cardApplyChannel.indexOf('WMmicroMall') !== -1 && card.weimobDemoCode && (this.isAdd || this.isInfo || this.isEdit)) {
this.weimobDemoCodeList = JSON.parse(card.weimobDemoCode).map(v => {
......@@ -620,11 +627,38 @@ export default {
// 线下适用商品
if (card.goodsSearchDetail && card.goodsFilterId) {
this.xxSysp.goodsFilterId = card.goodsFilterId;
const goodsSearchDetail = JSON.parse(card.goodsSearchDetail);
const goodsSearchDetail = JSON.parse(card.goodsSearchDetail || '{}');
this.xxSysp.conditionList = this.xxSysp.conditionList_copy = goodsSearchDetail.conditionList; // ref selector此时放在modal里并没有渲染,之后赋值
this.xxSysp.conditionList = goodsSearchDetail.conditionList; // ref selector此时放在modal里并没有渲染,之后赋值
this.xxSysp.conditionList_copy = deepClone(goodsSearchDetail.conditionList); // 备份数据
this.xxSysp.filterAbbrInfo = goodsSearchDetail.filterAbbrInfo || [];
this.xxSysp.conditionList_copy = deepClone(goodsSearchDetail.conditionList || {}); // 备份数据
if (card.gicCouponType == 3 || card.gicCouponType == 4) {
const filterAbbrInfo = (goodsSearchDetail.filterAbbrInfo || []).map(el => {
return el.map((item, index) => {
if (index == 0) {
item.optName = null;
}
// intersect 或者,union 并且,diff 剔除
switch (item.optName) {
case 'intersect':
item.optName = '或者';
break;
case 'union':
item.optName = '并且';
break;
case 'diff':
item.optName = '剔除';
break;
default:
item.optName = null;
break;
}
return item;
});
});
this.xxSysp.filterAbbrInfo = this.xxSyspLabel(filterAbbrInfo);
} else {
this.xxSysp.filterAbbrInfo = goodsSearchDetail.filterAbbrInfo || [];
}
}
this.form.cardLimit = card.cardLimit;
......@@ -901,10 +935,7 @@ export default {
// sale_limit.fee 消费金额满,sale_limit.goods 消费指定商品; goods.ok 适用商品, goods.no 不适应商品, only: 1 不与其他优惠共享(不勾选only不传)
} else if (this.form.cardType === 2) {
card.useCondition = {
sale_limit: {
fee: this.sale_limit.fee,
goods: this.sale_limit.goods
},
sale_limit: {},
goods: {
ok: this.goods.ok,
no: this.goods.no
......@@ -913,6 +944,12 @@ export default {
proNo: this.form.proNoList.length ? this.form.proNoList[0].id : '',
products_exchange_number: this.form.proNoList.length ? this.form.products_exchange_number : 0
};
// 兑换券的使用条件参数只能传一个,不能同时传
if (this.sale_limit.type == 1) {
card.useCondition.sale_limit = { fee: this.sale_limit.fee };
} else if (this.sale_limit.type == 2) {
card.useCondition.sale_limit = { goods: this.sale_limit.goods };
}
if (this.only) {
card.useCondition.only = Number(this.only);
}
......@@ -998,7 +1035,7 @@ export default {
card.startDay = this.form.startDay || 0;
card.limitDay = this.form.limitDay || 0;
}
// 卡券模板投放期限 putEffectiveMode(0:固定日期,1:长期)
const { cardEffectiveMode, putEffectiveMode, sendDateTime } = this.form;
card.putEffectiveMode = cardEffectiveMode == 0 || (cardEffectiveMode == 1 && putEffectiveMode == 0) ? 0 : 1;
......@@ -1007,7 +1044,7 @@ export default {
card.putBeginDate = formatDateTimeByType(sendDateTime[0], 'yyyy-MM-dd');
card.putEndDate = formatDateTimeByType(sendDateTime[1], 'yyyy-MM-dd');
}
card.jumpFlag = this.form.jumpFlag;
card.jumpLink = card.jumpFlag ? this.form.jumpLink : {};
......@@ -1150,6 +1187,9 @@ export default {
if (now.expireDateType == 1) {
this.form.cardEffectiveMode = 0;
this.form.dateTime = [now.startDate, now.expireDate];
this.$nextTick(() => {
this.$refs.effectDate.$emit('change', 0, false);
})
}
if (now.expireDateType == 2) {
if (now.expDayCount > 1200) {
......
......@@ -18,7 +18,7 @@
</el-form-item>
<el-form-item prop="subName" label="备注名">
<dm-input v-model="form.subName" class="w400" placeholder="请输入备注名称" :disabled="isEdit || isInfo" :byteType="1" :maxlength="10"></dm-input>
<dm-input v-model="form.subName" class="w400" placeholder="请输入备注名称" :disabled="isEdit || isInfo" :byteType="1" :maxlength="15"></dm-input>
</el-form-item>
<el-form-item prop="subTitle" label="卡券副标题">
......@@ -30,7 +30,7 @@
</el-form-item>
<!-- 微盟微商城 微盟券号 -->
<template v-if="form.cardApplyChannel.indexOf('WMmicroMall') !== -1 && countFlag">
<template v-if="showWeimobDemoSelector || (form.cardApplyChannel.indexOf('WMmicroMall') !== -1 && countFlag)">
<el-alert type="warning" show-icon :closable="false" class="f-alert" style="margin-bottom: 10px;margin-left:130px;">
<span slot="title">选择设置微盟微商城-微盟券号时,卡券信息将以微盟侧为准,本页填写信息将视为无效。</span>
</el-alert>
......@@ -59,7 +59,7 @@
</el-form-item>
<!-- 抵金券 -->
<el-form-item prop="cardDenomination" label="减免金额" v-if="form.cardType === 0"> <el-input-number controls-position="right" :disabled="isEdit || isInfo" v-model="form.cardDenomination" class="200" :precison="0" :min="0"></el-input-number><span class="fz12 gray">请输入大于0的整数</span> </el-form-item>
<el-form-item prop="cardDenomination" label="减免金额" v-if="form.cardType === 0"> <el-input-number controls-position="right" :disabled="isEdit || isInfo" v-model="form.cardDenomination" class="200" :precison="0" :min="0" :max="10000000"></el-input-number><span class="fz12 gray">请输入大于0的整数</span> </el-form-item>
<!-- 折扣券 -->
<el-form-item prop="cardDenomination" label="折扣额度" v-if="form.cardType === 1"> <el-input-number controls-position="right" :disabled="isEdit || isInfo" v-model="form.cardDenomination" class="200" :precision="1" :step="0.1" :max="9.9" :min="0"></el-input-number><span class="fz12 gray">请填写1-9.9之间的数字</span></el-form-item>
......@@ -119,11 +119,13 @@
<span :key="idx" class="item">{{ item.text }}</span>
</template>
</div>
<template v-if="xxSysp.goodsEnable && (((isEdit || isInfo) && xxSysp.filterAbbrInfo.length) || isAdd || isCopy)">
<el-button type="primary" @click="handleXxSyspClick" class="fl mt5" size="mini">{{ isEdit || isInfo ? '查看' : '编辑' }}</el-button>
<el-button v-show="xxSysp.filterAbbrInfo.length && !isEdit && !isInfo" @click="handleXxSyspReset" class="fl mt5" size="mini">清空</el-button>
<template v-if="gicCouponType != 3 && gicCouponType != 4">
<template v-if="xxSysp.goodsEnable && (((isEdit || isInfo) && xxSysp.filterAbbrInfo.length) || isAdd || isCopy)">
<el-button type="primary" @click="handleXxSyspClick" class="fl mt5" size="mini">{{ isEdit || isInfo ? '查看' : '编辑' }}</el-button>
<el-button v-show="xxSysp.filterAbbrInfo.length && !isEdit && !isInfo" @click="handleXxSyspReset" class="fl mt5" size="mini">清空</el-button>
</template>
<p v-else class="fz14 gray">未选择</p>
</template>
<p v-else class="fz14 gray">未选择</p>
</div>
<div v-if="xxSysp.goodsEnable && (((isEdit || isInfo) && xxSysp.filterAbbrInfo.length) || isAdd || isCopy)" class="tips fz12 gray"><span class="w100 pr10 inline-block"></span>* 仅支持第三方api接口核销卡券时使用</div>
</div>
......@@ -232,7 +234,7 @@
</el-tooltip>
<div>
<el-radio @change="changeCardEffectiveMode" v-model="form.cardEffectiveMode" :disabled="isEdit || isInfo || cardValidity" :label="0">固定日期</el-radio>
<el-date-picker @change="changeCardEffectiveMode(0, false)" v-model="form.dateTime" @focus="form.cardEffectiveMode = 0" :disabled="isEdit || isInfo || cardValidity" :picker-options="pickerOptions" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
<el-date-picker ref="effectDate" @change="changeCardEffectiveMode(0, false)" v-model="form.dateTime" @focus="form.cardEffectiveMode = 0" :disabled="isEdit || isInfo || cardValidity" :picker-options="pickerOptions" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</div>
<div class="pt20">
<el-radio @change="changeCardEffectiveMode" v-model="form.cardEffectiveMode" :label="1" :disabled="isEdit || isInfo || cardValidity">领取后,</el-radio>
......@@ -249,13 +251,13 @@
<span class="tooltip-icon cursor">卡券模板投放期限</span>
</el-tooltip>
<div v-if="form.cardEffectiveMode == 0">
<el-date-picker v-model="form.sendDateTime" :disabled="isEdit || isInfo" :picker-options="pickerOptions2" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
<el-date-picker v-model="form.sendDateTime" :disabled="isEdit || isInfo || form.cardApplyChannel.indexOf('WMmicroMall') !== -1" :picker-options="pickerOptions2" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
<span class="gray fz13">* 卡券模板投放期限结束日期不能超过卡券使用有效期固定日期结束日期</span>
</div>
<div v-if="form.cardEffectiveMode == 1" style="height:35px;">
<el-radio @change="resetSendDateTime" v-model="form.putEffectiveMode" :disabled="isEdit || isInfo" :label="1">长期有效</el-radio>
<el-radio @change="resetSendDateTime" v-model="form.putEffectiveMode" :disabled="isEdit || isInfo" :label="0">固定日期</el-radio>
<el-date-picker v-if="form.putEffectiveMode == 0" v-model="form.sendDateTime" @focus="form.putEffectiveMode = 0" :disabled="isEdit || isInfo" :picker-options="pickerOptions" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
<el-radio @change="resetSendDateTime" v-model="form.putEffectiveMode" :disabled="isEdit || isInfo || form.cardApplyChannel.indexOf('WMmicroMall') !== -1" :label="1">长期有效</el-radio>
<el-radio @change="resetSendDateTime" v-model="form.putEffectiveMode" :disabled="isEdit || isInfo || form.cardApplyChannel.indexOf('WMmicroMall') !== -1" :label="0">固定日期</el-radio>
<el-date-picker v-if="form.putEffectiveMode == 0" v-model="form.sendDateTime" @focus="form.putEffectiveMode = 0" :disabled="isEdit || isInfo || form.cardApplyChannel.indexOf('WMmicroMall') !== -1" :picker-options="pickerOptions" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</div>
</el-form-item>
......
<template>
<li class="card-item inline-block" :style="'border:1px solid ' + item.cardColor">
<div class="card-item_head" :style="'background:' + item.cardColor">
<!-- gic定义的卡券类型(0:普通卡券, 1:e待洗, 2:好办卡券, 3:微盟外部券, 4:通用外部券 -->
<el-tooltip placement="top" v-if="item.gicCouponType == 3 || item.gicCouponType == 4">
<div style="max-width: 300px" slot="content">{{ item.gicCouponType | getTipText }}</div>
<span class="card-item_head-tip">外部券<i class="iconfont icon-xinxixianshi card-item_head-icon"></i></span>
</el-tooltip>
<h4>{{ item.cardName }}</h4>
<p>{{ item.subName }}</p>
</div>
......@@ -57,7 +62,7 @@
</p>
</div>
<div class="card-item_foot clearfix">
<div class="fl">
<div class="fl" v-if="item.gicCouponType != 3 && item.gicCouponType != 4">
<!-- 由外部api创建 仅展示详情、删除、报表按钮 -->
<span v-if="item.auditingStatus !== -1"
>剩余库存:{{ item.couponStock }} <a title="编辑库存" v-if="!shelfFlag && item.useCustomCode === 0 && item.canEdit !== false && !item.isApiCreate" @click="preAdjustStock(item)"><i class="el-icon-edit"></i></a
......@@ -146,6 +151,15 @@ export default {
}
},
filters: {
getTipText(type) {
let result = '--';
if (type == 3) {
result = '当前卡券由微盟侧创建,由微盟侧进行卡券控制。在GIC侧只能用于卡券直投、智能营销和扫码营销。';
} else if (type == 4) {
result = '当前卡券由外部创建,由外部进行卡券控制,无法在GIC侧进行发放。';
}
return result;
},
filterUseCondition(val) {
var _useCondition = JSON.parse(val);
return (typeof _useCondition.sale_limit === 'undefined' ? '' : (typeof _useCondition.sale_limit.fee === 'undefined' ? '' : (_useCondition.sale_limit.fee ? '最低消费满' + _useCondition.sale_limit.fee : '无最低消费要求') + ';') + (typeof _useCondition.sale_limit.goods === 'undefined' ? '' : '消费指定商品' + _useCondition.sale_limit.goods + ';')) + (typeof _useCondition['goods'] === 'undefined' ? '' : (typeof _useCondition.goods.ok === 'undefined' ? '' : '适用商品(' + (_useCondition.goods.ok || '无') + ');') + (typeof _useCondition.goods.no === 'undefined' ? '' : '不适用商品(' + (_useCondition.goods.no || '无') + ');')) + (typeof _useCondition.only === 'undefined' || _useCondition.only == 0 ? '' : '不可与其他优惠共享');
......@@ -163,11 +177,30 @@ export default {
vertical-align: middle;
min-height: 376px;
&_head {
position: relative;
width: 100%;
text-align: center;
color: #fff;
background: #63b359;
padding: 10px 0;
.card-item_head-tip {
position: absolute;
top: -1px;
left: -1px;
width: 76px;
height: 24px;
line-height: 24px;
background: #d9e9f8;
border-radius: 3px 0px 16px 0px;
font-size: 12px;
font-weight: 400;
color: #1890ff;
cursor: default;
.card-item_head-icon {
margin-left: 5px;
font-size: 12px;
}
}
h4 {
font-size: 16px;
font-weight: 500;
......
......@@ -11,11 +11,16 @@ export default Vue.component('render-temp', {
render(h) {
const canEdit = this.item.canEdit !== false; // 只有canEdit === false 才证明不能使用 没有权限仅可以详情/报表
const isApiCreate = this.item.isApiCreate || false; // 由外部api创建 仅展示详情、删除、报表按钮
const showPutonBtn = this.item.showPutonBtn || false;
// 当前卡券是否 是长期有效||在投放有效期内
// putEffectiveMode 0:固定日期,1:长期
const canGroupSend = this.item.putEffectiveMode == 1 ? true : new Date() > new Date(this.item.putBeginDate) && new Date() < new Date(this.item.putEndDate);
const isWeimo = this.item.gicCouponType == 3;
const isCommon = this.item.gicCouponType == 4;
// 微盟外部券:领取记录、投放、报表
// 通用外部券:领取记录、报表
const bind1 =
canEdit && !isApiCreate && canGroupSend ? (
canEdit && (!isApiCreate || isWeimo) && canGroupSend && !isCommon && showPutonBtn ? (
<a title="投放" onClick={this.handler.bind(null, 1)}>
<i class="iconfont icon-daohang-" />
</a>
......@@ -27,27 +32,29 @@ export default Vue.component('render-temp', {
<i class="el-icon-tickets" />
</a>
);
const bind3 = !isApiCreate ? (
<a title="编辑" onClick={this.handler.bind(null, 3)}>
<i class="el-icon-edit" />
</a>
) : (
''
);
const bind4 = canEdit ? (
<a title="删除" onClick={this.handler.bind(null, 4)}>
<i class="el-icon-delete" />
</a>
) : (
''
);
const bind3 =
!isWeimo && !isCommon && !isApiCreate ? (
<a title="编辑" onClick={this.handler.bind(null, 3)}>
<i class="el-icon-edit" />
</a>
) : (
''
);
const bind4 =
canEdit && !isWeimo && !isCommon ? (
<a title="删除" onClick={this.handler.bind(null, 4)}>
<i class="el-icon-delete" />
</a>
) : (
''
);
const bind5 = (
<a title="详情" onClick={this.handler.bind(null, 5)}>
<i class="el-icon-document" />
</a>
);
const bind6 =
canEdit && !isApiCreate ? (
canEdit && !isApiCreate && !isWeimo && !isCommon ? (
<a title="复制" onClick={this.handler.bind(null, 6)}>
<i class="iconfont icon-wxcard-copy" />
</a>
......@@ -56,7 +63,7 @@ export default Vue.component('render-temp', {
);
const bind7 =
canEdit && !isApiCreate ? (
(canEdit && !isApiCreate) || isWeimo || isCommon ? (
<a style="position:relative;top:1px" title="领取记录" onClick={this.handler.bind(null, 7)}>
<i class="iconfont icon-tubiaozhizuomoban-" />
</a>
......@@ -72,6 +79,7 @@ export default Vue.component('render-temp', {
{bind2}
{bind3}
{bind4}
{isWeimo || isCommon ? bind5 : ''}
</span>
);
const overDateHtml = (
......
......@@ -31,16 +31,21 @@
<div slot="content" style="max-width:300px">{{ scope.row.remark || '--' }}</div>
<i class="el-icon-warning" style="color:#f56c6c;cursor:pointer;margin-left:3px;"></i>
</el-tooltip>
<el-tooltip v-if="scope.row.putonStatus === 5" :open-delay="300" class="item" effect="dark">
<div slot="content" style="max-width:300px">{{ scope.row.remark || '--' }}</div>
<i class="el-icon-warning" style="color:#f56c6c;cursor:pointer;margin-left:3px;"></i>
</el-tooltip>
<div v-if="scope.row.putonStatus === 1">
<time-counts class="primary-color fz12" :defaultVal="scope.row.putonTime" :autoStart="true"></time-counts>
</div>
</template>
</el-table-column>
<el-table-column min-width="100" align="left" prop="creatorName" label="创建人" v-if="$store.state.marketing.openFlag"></el-table-column>
<el-table-column label="操作" align="left" width="150px" fixed="right">
<el-table-column label="操作" align="left" width="180px" fixed="right">
<template slot-scope="scope">
<el-button type="text" @click="refreshPutOnCount(scope.row.putonId)" v-if="scope.row.issuingQuantity - scope.row.getedQuantity > 0">刷新</el-button>
<el-button type="text" v-if="scope.row.putonStatus === 2 || scope.row.putonStatus === 3" @click="$router.push('/card/groupinfo/' + scope.row.putonId)">详情</el-button>
<el-button type="text" v-if="scope.row.putonStatus !== 2 && scope.row.putonStatus !== 3 && scope.row.canEdit !== false" @click="$router.push('/card/groupsend/' + scope.row.putonId)">编辑</el-button>
<el-button type="text" v-if="scope.row.putonStatus !== 2 && scope.row.putonStatus !== 3 && scope.row.canEdit !== false && scope.row.putonStatus !== 5 && scope.row.putonStatus !== 6" @click="$router.push('/card/groupsend/' + scope.row.putonId)">编辑</el-button>
<el-button type="text" v-if="scope.row.putonTime > nowDate" @click="$router.push('/card/record/sendInfo/' + scope.row.putonId)">记录</el-button>
<dm-delete v-if="scope.row.putonStatus !== 2 && scope.row.canEdit !== false" @confirm="delData(scope.row)" tips="是否删除该投放记录?">
<el-button type="text">删除</el-button>
......@@ -52,7 +57,7 @@
</section>
</template>
<script>
import { cardRecordPage, deleteCardPuton } from '@/service/api/cardApi.js';
import { cardRecordPage, deleteCardPuton, refreshPutOnCount } from '@/service/api/cardApi.js';
import { formatDateTimeByType } from '@/utils/index.js';
import timeCounts from '@/components/timeCount/index.vue';
import tableMethods from '@/mixins/tableMethods.js';
......@@ -155,6 +160,17 @@ export default {
this.$tips({ type: 'error', message: '删除失败!' });
});
},
// 刷新当条营销记录
refreshPutOnCount(putonId) {
refreshPutOnCount({ cardPutOnId: putonId }).then(res => {
if (res.errorCode === 0) {
this.$tips({ type: 'success', message: '更新成功!' });
this.getTableList();
} else {
this.$tips({ type: 'error', message: '更新失败!' });
}
});
},
filterStatus(val) {
let result = { label: '执行错误', type: 'danger' };
switch (val) {
......
......@@ -5,6 +5,7 @@
<el-select class="dm-select" clearable v-model="listParams.success" placeholder="所有条件" @change="search">
<el-option v-for="(v, i) in successOptions" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<!-- <el-button type="text" @click="goHistory"> 历史记录</el-button> -->
<el-button icon="iconfont icon-icon_yunxiazai" class="fr" type="primary" @click="exportCurrentSendDetails"> 导出列表</el-button>
</div>
<div class="dm-wrap">
......@@ -185,6 +186,9 @@ export default {
this.listParams.ecmMarketingTypeRelationIds = list;
this.ecmCurrentSendDetails();
},
// goHistory() {
// },
search() {
this.listParams.currentPage = 1;
this.ecmCurrentSendInfos();
......
import { _debounce } from '@/utils/index';
import { getEcmInfo, saveEcmInfo } from '@/service/api/ecmApi.js';
import { getEcmInfo, saveEcmInfo, getUseStoredFalg } from '@/service/api/ecmApi.js';
import { getCardManualSetting } from '@/service/api/cardApi.js';
import { listTemplateVariables } from '@/service/api/msgApi.js';
import { klflStrategy } from '@/service/api/gameApi.js'; // 会员等级列表接口
......@@ -19,7 +19,7 @@ export default {
creatorId: '',
code: '1001',
loading: false,
effectActionOptions: [{ value: 'subscribe', label: '关注触发' }, { value: 'authentication', label: '认证触发' }, { value: 'consume', label: '消费触发' }, { value: 'upgrade', label: '会员卡升级触发' }, { value: 'degrade', label: '会员卡降级触发' }], // eslint-disable-line
effectActionOptions: [{ value: 'subscribe', label: '关注触发' }, { value: 'authentication', label: '认证触发' }, { value: 'consume', label: '消费触发' }, { value: 'upgrade', label: '会员卡升级触发' }, ], // eslint-disable-line
marketingTimesTypeOptions: [{ value: 0, label: '总共触发' }, { value: 1, label: '每天触发' }, { value: 2, label: '每周触发' }, { value: 3, label: '每月触发' }, { value: 4, label: '每年触发' }, { value: -1, label: '无限次触发' }], // eslint-disable-line
execDateType: [
{ label: '每天', value: 1 },
......@@ -79,7 +79,9 @@ export default {
lowest_cost_count: '',
max_cost_count: '',
// store_mode: 0,
order_store: ''
order_store: '',
storedLowest: 0,
storedMax: 0
},
template: {
headerColor: '#173177',
......@@ -146,7 +148,9 @@ export default {
count: false, // 消费件数
good: false // 消费商品
},
discount_limit: { type: 1, count: undefined, flag: false } // 适用商品折扣
storedChecked: false,
discount_limit: { type: 1, count: undefined, flag: false }, // 适用商品折扣
useStoredFlag: 0 //显示储值触发和会员卡升级事件
};
},
components: {
......@@ -390,6 +394,13 @@ export default {
}
});
}
if (this.form.effectAction === 'stored' && result.effectTriggerJson) {
let cost = JSON.parse(result.effectTriggerJson) || {};
this.storedChecked = true;
this.form.storedLowest = cost.lowest_cost;
this.form.storedMax = cost.max_cost;
}
}
if (!this.form.templateUseEnable) return;
let template = null;
......@@ -620,6 +631,17 @@ export default {
return;
}
}
// 如果是储值触发
if (this.form.effectAction === 'stored') {
if (this.storedChecked && !this.form.storedLowest && !this.form.storedMax) {
this.$tips({ type: 'warning', message: '请填写储值金额区间值' });
return;
}
if (this.storedChecked && this.form.storedLowest && this.form.storedMax && this.form.storedLowest > this.form.storedMax) {
this.$tips({ type: 'warning', message: '储值金额区间值填写错误' });
return;
}
}
this.$refs[formName].validate(valid => {
if (valid) {
let params = {
......@@ -703,6 +725,9 @@ export default {
}
params = Object.assign(params, consumeObj); // 合并消费触发数据
}
if (this.form.effectAction === 'stored' && this.storedChecked) {
params.effectTriggerJson = JSON.stringify({ lowest_cost: this.form.storedLowest || 0, max_cost: this.form.storedMax || 0 });
}
params.marketingActivityId = this.form.marketingActivityId || ''; // 否 String 营销场景
// 如果适用人群-人群筛选器可编辑:需要调用await this.$refs.threshold.triggerPeopleSet(); 强制触发回显,否则数据保存有错误
// await this.triggerPeopleSet();
......@@ -1006,6 +1031,12 @@ export default {
);
},
created() {
getUseStoredFalg().then(res => {
this.useStoredFlag = res.result.useStoredFlag;
if (this.useStoredFlag) {
this.effectActionOptions.push({ value: 'stored', label: '储值触发' });
}
});
// 设置面包屑
let breadcrumbName = '智能营销编辑';
if (this.isAdd) {
......
......@@ -124,7 +124,7 @@
<el-button type="primary" @click="handleXxSyspClick" class="fl mt5" size="mini">{{ !isAdd ? '查看' : '编辑' }}</el-button>
<el-button v-show="xxSysp.filterAbbrInfo.length && isAdd" @click="handleXxSyspReset" class="fl mt5" size="mini">清空</el-button>
</div>
<div v-show="consumeChecked.good" class="fz12 gray">勾选消费商品后,消费金额、消费件数仅指适用消费商品的金额和件数。</div>
<div v-show="consumeChecked.good" class="fz12 gray" style="color:#f5222d">勾选消费商品后,消费金额、消费件数仅指适用消费商品的金额和件数。</div>
</div>
</div>
</el-form-item>
......@@ -143,7 +143,7 @@
<el-input-number controls-position="right" :disabled="!isAdd" v-model="discount_limit.count" :precision="2" :min="0" :max="10" class="w150"></el-input-number>&nbsp;&nbsp;
</div>
<span class="fz14 gray" v-else>不限制消费商品折扣</span>
<div v-if="discount_limit.flag" class="fz12 gray">* 商品折扣=订单实付/订单总金额</div>
<div v-if="discount_limit.flag" class="fz12 gray">* 商品折扣 = 订单项实付金额 / 订单项应付金额</div>
</div>
</div>
</el-form-item>
......@@ -187,6 +187,30 @@
</el-select>
</el-form-item>
</section>
<!-- 储值触发配置 -->
<section class="dm-form__wrap" v-if="form.effectType == 0 && form.effectAction === 'stored'">
<h3 class="dm-title__label">
储值触发配置
<i class="dm-title__label--icon iconfont icon-xinxixianshi"></i>
<span class="gray fz13">仅适用于线下单笔充值场景;消费、退款等不会触发</span>
</h3>
<p class="fz14 gray mb20 ml10">同时满足以下条件即可触发</p>
<el-form-item>
<div class="no_label_form_label">
<el-checkbox class="el-form-item__label align-left" :disabled="!isAdd" v-model="storedChecked">储值金额</el-checkbox>
<div>
<span class="fz14 gray" v-show="!storedChecked">任意储值金额</span>
<div v-show="storedChecked">
<el-input-number :disabled="!isAdd" controls-position="right" min="" :max="1000000" style="width:150px;" v-model="form.storedLowest"></el-input-number>
<span class="ml5 mr5"></span>
<el-input-number :disabled="!isAdd" controls-position="right" min="" :max="1000000" style="width:150px;" v-model="form.storedMax"></el-input-number>
<span class="pl5"></span>
<el-popover placement="right" title="" width="200" trigger="hover" content="最大值最小值可选填其一或两个都填写,包含边界值"><i class="el-icon-info ml5 gray" slot="reference"></i></el-popover>
</div>
</div>
</div>
</el-form-item>
</section>
<!-- 营销次数配置 重复 -->
<section class="dm-form__wrap" v-if="form.effectType == 1">
<h3 class="dm-title__label">
......@@ -251,7 +275,7 @@
<section class="dm-form__wrap">
<h3 class="dm-title__label">营销事件</h3>
<!-- 只有实时才是单图文 -->
<marketing-event :readOnly="isInfo" ref="marketingEvent" @has-card="hasCard" v-if="ecmPlanId" :singleFlag="form.effectType === 0" :integralMultiple="form.effectAction === 'consume'" :ecmPlanId="ecmPlanId" :isSupportVar="form.effectType === 0" :code="code" :enabledMessageState="enabledMessageState" :cardLimitType="-1"></marketing-event>
<marketing-event :readOnly="isInfo" show-out-coupon-icon ref="marketingEvent" @has-card="hasCard" v-if="ecmPlanId" :singleFlag="form.effectType === 0" :integralMultiple="form.effectAction === 'consume'" :ecmPlanId="ecmPlanId" :isSupportVar="form.effectType === 0" :code="code" :enabledMessageState="enabledMessageState" :cardLimitType="-1" :use-stored="useStoredFlag"></marketing-event>
<!-- 只有非实时&&选择卡券了展示提示 -->
<div v-if="currentCard.comName && form.effectType != 0 && couponAutoGetFlag" class="fz13 regular-font-color line-height2" style="margin-left:120px;margin-top:30px;">
* 用户在领取卡券后需要<b class="bold">同步至ERP</b>,如果关闭用户<b class="bold">手动领取</b>,卡券在<b class="bold">批量投放</b>时会需要将卡券信息批量同步至ERP。 <br />
......
......@@ -44,7 +44,7 @@
</template>
<script>
import activitySelect from '@/components/activity-select/index.vue';
import { loadEcmList, deleteEcm, offlineEcmPlan } from '@/service/api/ecmApi.js';
import { loadEcmList, deleteEcm, offlineEcmPlan, getUseStoredFalg } from '@/service/api/ecmApi.js';
import { formatDateTimeByType } from '@/utils/index.js';
const marketingTypeOptions = [{ value: '', label: '所有发送类型' }, { value: 'card', label: '卡券营销' }, { value: 'message', label: '短信营销' }, { value: 'teletext', label: '图文营销' }, { value: 'text', label: '文本营销' }, { value: 'teltask', label: '话务' }, { value: 'image', label: '微信图片' }]; // eslint-disable-line
export default {
......@@ -130,6 +130,11 @@ export default {
activitySelect
},
created() {
getUseStoredFalg().then(res => {
if (res.result.useStoredFlag) {
this.marketingTypeOptions.push({ value: 'grade', label: '会员卡升级' });
}
});
this.loadEcmList();
this.$store.commit('aside_handler', false);
this.$store.commit('mutations_breadcrumb', [{ name: '营销管理', path: '' }, { name: '智能营销', path: '/ecm' }]); // eslint-disable-line
......
......@@ -164,3 +164,6 @@ export const deleteMarketingType = params => requests(PREFIX + 'delete-marketing
//模板库--分页列表 (有效)
export const LoadTempList = params => requests(PREFIX + 'load-message-templateList', params);
//会员等级
export const getCardLevelList = params => requests('api-plug/member-grade-list', params);
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1616486164284" class="icon" viewBox="0 0 1025 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7879" xmlns:xlink="http://www.w3.org/1999/xlink" width="200.1953125" height="200"><defs><style type="text/css"></style></defs><path d="M833.532723 837.12H22.524723c-7.168 0-14.848-4.096-18.432-9.728-4.608-6.144-5.12-13.824-2.56-20.992l168.96-604.16c3.584-9.216 11.776-14.848 21.504-14.848h810.496c7.168 0 14.848 4.096 18.432 9.728 4.608 6.144 5.12 13.824 2.56 20.992l-168.96 604.16c-3.072 8.704-11.264 14.848-20.992 14.848z m-777.728-46.08h761.856l152.064-558.592H207.868723L55.804723 791.04z" fill="#606266" p-id="7880"></path><path d="M833.532723 837.12H22.524723c-7.168 0-14.848-4.096-18.432-9.728-4.608-6.144-5.12-13.824-2.56-20.992l168.96-604.16c3.584-9.216 11.776-14.848 21.504-14.848h810.496c7.168 0 14.848 4.096 18.432 9.728 4.608 6.144 5.12 13.824 2.56 20.992l-168.96 604.16c-3.072 8.704-11.264 14.848-20.992 14.848z m-777.728-46.08h761.856l152.064-558.592H207.868723L55.804723 791.04z" fill="#606266" p-id="7881"></path><path d="M478.204723 393.216L372.732723 634.88H320.508723L219.132723 393.216H276.988723l70.656 182.272 72.192-182.272h58.368z m25.088 241.664V393.216h51.712V634.88H503.292723z m152.064-83.968V634.88h-51.712V393.216h120.832c22.016 0 37.888 1.536 47.104 4.608 15.872 5.12 28.672 16.384 37.888 33.28 6.656 12.288 10.24 26.624 10.24 40.96 0 12.288-2.048 24.064-6.656 34.816-4.608 11.264-10.752 20.48-18.432 27.136-7.168 6.144-15.36 10.752-23.04 12.8-7.68 2.048-18.944 3.584-33.28 3.584H655.868723l-0.512 0.512z m0-43.52h70.144c12.288 0 21.504-1.536 26.624-5.632 7.168-6.144 11.264-16.384 11.264-31.744 0-16.384-5.632-26.624-16.896-30.72-4.096-1.536-10.752-2.56-19.456-2.56H655.868723v70.656h-0.512z" fill="#606266" p-id="7882"></path></svg>
\ No newline at end of file
......@@ -458,4 +458,12 @@
border-radius:4px;
display: inline-block;
position: relative;
}
\ No newline at end of file
}
.dm-grade__item__wrap {
width: 300px;
padding: 18px 20px;
border: 1px solid rgba(228,231,237,1);
border-radius:4px;
display: inline-block;
position: relative;
}
<template>
<div class="dm-grade__item__wrap">
<div class="fz16">会员卡升级</div>
<p class="mt15 fz24 primary-font-color">
{{ item.title }}
</p>
<p class="minor-font-color mt10 line-height1_5 fz12">*若当前会员卡等级超过该等级,则不会进行会员升级。</p>
</div>
</template>
<script>
export default {
name: 'item-grade',
props: {
item: {
type: Object,
default() {
return {};
}
}
}
};
</script>
File mode changed from 100755 to 100644
......@@ -22,9 +22,13 @@
</div>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" width="140" align="left" prop="cardName" label="卡券名称">
<el-table-column width="140" align="left" prop="cardName" label="卡券名称">
<template slot-scope="scope">
<p style="line-height:22px;">{{ scope.row.cardName }}</p>
<el-tooltip v-if="scope.row.showTooltip" :content="scope.row.cardName" placement="top">
<span class="card-name" :style="{ 'max-width': showOutCouponIcon && (scope.row.gicCouponType == 3 || scope.row.gicCouponType == 4) ? '65px' : '115px' }">{{ scope.row.cardName }}</span>
</el-tooltip>
<span v-else class="card-name">{{ scope.row.cardName }}</span>
<i class="out-coupon-icon" v-if="showOutCouponIcon && (scope.row.gicCouponType == 3 || scope.row.gicCouponType == 4)">外部券</i>
<p style="line-height:20px;color:#909399;font-size:13px;">{{ scope.row.subName }}</p>
</template>
</el-table-column>
......@@ -48,7 +52,7 @@
{{ scope.row.storeMode === 0 ? '所有门店' : scope.row.storeMode === 1 ? '部分分组' : '部分门店' }}
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="false" :width="100" align="left" prop="couponStock" label="库存"></el-table-column>
<el-table-column :show-overflow-tooltip="false" :width="100" align="left" prop="couponStock" label="库存" :formatter="(row, col, val) => (showOutCouponIcon ? '--' : val)"></el-table-column>
</el-table>
<dm-pagination v-show="tableList.length" class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="prev, pager, next" :total="total"></dm-pagination>
<span slot="footer" class="dialog-footer">
......@@ -71,6 +75,11 @@ export default {
cardLimitType: {
type: Number,
default: 1
},
// 是否展示外部券标识 true:展示 false不展示
showOutCouponIcon: {
type: Boolean,
default: false
}
},
computed: {
......@@ -113,6 +122,17 @@ export default {
this.getCardList();
},
methods: {
getTextWidth(text) {
const span = document.createElement('span');
span.innerHTML = text;
span.style.position = 'fixed';
span.style.zIndex = -1;
span.style.opacity = 0;
document.body.appendChild(span);
const width = span.offsetWidth;
document.body.removeChild(span);
return width;
},
handleSizeChange(val) {
this.listParams.pageSize = val;
this.getCardList();
......@@ -123,9 +143,14 @@ export default {
},
getCardList() {
this.loading = true;
getCardList(this.listParams).then(res => {
// useExtCard 能否使用微盟外部券: 0:否, 1:可以
getCardList(Object.assign({}, this.listParams, { useExtCard: this.showOutCouponIcon ? 1 : 0 })).then(res => {
if (res.errorCode === 0) {
this.tableList = res.result.result || [];
this.tableList = (res.result.result || []).map(el => {
// 如果是外部券,而且配置显示外部券标识,需要缩短cardName的显示长度
el.showTooltip = this.getTextWidth(el.cardName) > (this.showOutCouponIcon && (el.gicCouponType == 3 || el.gicCouponType == 4) ? 65 : 115);
return el;
});
this.total = res.result.totalCount;
}
this.loading = false;
......@@ -160,3 +185,25 @@ export default {
}
};
</script>
<style lang="scss" scoped>
.card-name {
display: inline-block;
vertical-align: middle;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
line-height: 22px;
}
.out-coupon-icon {
margin-left: 5px;
padding: 3px 4px;
background: #fff1f0;
border-radius: 2px;
border: 1px solid #ffa39e;
font-size: 12px;
font-weight: 400;
color: #f5222d;
font-style: normal;
}
</style>
<template>
<el-dialog title="会员卡升级" :visible.sync="show" width="340px" @closed="close">
等级:
<el-select style="width:220px" v-model="cardLevel" placeholder="等级选择">
<el-option v-for="(el, i) in cardLevelList" :key="i" :label="el.value" :value="el.key"></el-option>
</el-select>
<p class="minor-font-color mt10 line-height1_5 fz12">*若当前会员卡等级超过该等级,则不会进行会员升级。</p>
<span slot="footer" class="dialog-footer">
<el-button @click="close">关 闭</el-button>
<el-button type="primary" @click="addItem">确 定</el-button>
</span>
</el-dialog>
</template>
<script>
import { getCardLevelList } from '../assets/api.js';
export default {
name: 'lib-grade',
props: {
item: {
type: Object,
default() {
return {};
}
},
show: {
type: Boolean,
default: false
}
},
data() {
return {
cardLevelList: [],
cardLevel: ''
};
},
mounted() {
getCardLevelList({ requestProject: 'marketing', key: 'memberGrade' }).then(res => {
if (res.errorCode === 0) {
this.cardLevelList = res.result;
} else {
this.$message({ type: 'warning', message: '接口异常' });
}
});
},
watch: {
show(val) {
if (val) {
this.cardLevel = this.item.relationId || '';
} else {
this.cardLevel = '';
}
}
},
methods: {
close() {
this.$emit('update:show', false);
},
addItem() {
if (!this.cardLevel) {
return this.$message({ type: 'warning', message: '未选择会员卡等级' });
}
let title = this.cardLevelList.find(item => item.key === this.cardLevel).value;
this.$emit('sendItem', { title, relationId: this.cardLevel, comName: 'grade' });
this.close();
}
}
};
</script>
......@@ -32,7 +32,7 @@
</transition>
</div>
<!-- 弹窗组件 -->
<component :is="dialogCom" @sendItem="saveToList" :item="currentItem" :show.sync="dialogShow" :isSupportVar="isSupportVar" :cardLimitType="cardLimitType" :integralMultiple="integralMultiple" :singleFlag="singleFlag"></component>
<component :is="dialogCom" @sendItem="saveToList" :showOutCouponIcon="showOutCouponIcon" :item="currentItem" :show.sync="dialogShow" :isSupportVar="isSupportVar" :cardLimitType="cardLimitType" :integralMultiple="integralMultiple" :singleFlag="singleFlag"></component>
</section>
</template>
......@@ -51,6 +51,7 @@ import itemImage from './components/item-image.vue';
import itemMessage from './components/item-Message.vue';
import itemTeltask from './components/item-teltask.vue';
import itemIntegral from './components/item-integral.vue';
import itemGrade from './components/item-grade';
//弹窗组件
import libTeletext from './components/lib-teletext.vue';
import libMessage from './components/lib-Message.vue';
......@@ -60,6 +61,7 @@ import libWxa from './components/lib-wxa.vue';
import libImage from './components/lib-image.vue';
import libTeltask from './components/lib-teltask.vue';
import libIntegral from './components/lib-integral.vue';
import libGrade from './components/lib-grade';
// 全部的操作项
// eslint-disable-next-line
......@@ -86,7 +88,9 @@ export default {
'lib-wxa': libWxa,
'lib-image': libImage,
'lib-teltask': libTeltask,
'lib-integral': libIntegral
'lib-integral': libIntegral,
'item-grade': itemGrade,
'lib-grade': libGrade
},
props: {
// 页面编码——- 1001-智能引擎; 1002-微信营销; 1003-被关注回复; 1004-关键字回复
......@@ -125,6 +129,15 @@ export default {
// 只读
type: Boolean,
default: false
},
// 是否展示外部券标识,仅用于卡券选择器中控制外部券标识展示 true:展示 false不展示
showOutCouponIcon: {
type: Boolean,
default: false
},
useStored: {
type: Number,
default: 0
}
},
data() {
......@@ -140,6 +153,9 @@ export default {
};
},
created() {
if (this.useStored) {
allOptions.push({ name: '会员卡升级', value: 'grade', key: 9, img: require('./assets/img/grade.svg') }); //eslint-disable-line
}
this.init();
},
methods: {
......@@ -201,6 +217,9 @@ export default {
this.list.push({ comName: 'item-integral', item: { multipleNum: v.multipleNum, integralType: v.integralType, integralCount: v.integralCount, ecmMarketingTypeRelationId: v.ecmMarketingTypeRelationId, relationId: v.relationId, ecmPlanId: v.ecmPlanId } });
// this.list.push({ comName: 'item-teltask', item: { ...v.teltask, ecmMarketingTypeRelationId: v.ecmMarketingTypeRelationId, relationId: v.relationId, ecmPlanId: v.ecmPlanId } });
break;
case 'grade': // 8 积分
this.list.push({ comName: 'item-grade', item: { title: v.title } });
break;
}
});
this.hasReturnCard();
......@@ -285,6 +304,12 @@ export default {
params.title = `${val.multipleNum}倍积分`;
}
}
//9.会员卡升级
if (val.comName === 'grade') {
params.title = val.title;
params.relationId = val.relationId;
}
// 接口请求 保存
saveUpdateMarketingType({ marketingType: JSON.stringify(params) })
.then(res => {
......@@ -300,6 +325,10 @@ export default {
this.$message({ type: 'warning', message: `最多只能添加${this.maxEventCount}个营销事件` });
return;
}
if (this.list.some(item => item.comName === 'item-grade')) {
this.$message({ type: 'warning', message: `已添加会员卡升级营销事件` });
return;
}
// 判断是否欠费
if (v.value === 'message' && this.checkAccountState()) return;
this.dialogCom = 'lib-' + v.value;
......
......@@ -57,7 +57,7 @@
<h3 class="title mt46">营销事件</h3>
<div>
<!-- 只有实时才是单图文 -->
<marketing-event style="margin-top:0;" :readOnly="isInfo" ref="marketingEvent" @has-card="hasCard" v-if="ecmPlanId" :singleFlag="form.effectType === 0" :integralMultiple="form.effectAction === 'consume'" :ecmPlanId="ecmPlanId" :isSupportVar="form.effectType === 0" :code="code" :enabledMessageState="enabledMessageState" :cardLimitType="-1"></marketing-event>
<marketing-event style="margin-top:0;" show-out-coupon-icon :readOnly="isInfo" ref="marketingEvent" @has-card="hasCard" v-if="ecmPlanId" :singleFlag="form.effectType === 0" :integralMultiple="form.effectAction === 'consume'" :ecmPlanId="ecmPlanId" :isSupportVar="form.effectType === 0" :code="code" :enabledMessageState="enabledMessageState" :cardLimitType="-1"></marketing-event>
<!-- 只有存在卡券的情况下出现卡券通知方式 -->
<section v-if="currentCard.comName">
<h3 class="title mt46">卡券通知方式配置</h3>
......
<template>
<el-dialog title="拼图配置" :visible.sync="show" width="40%" :before-close="close">
<div v-loading="loading">
<div class="layout--tips" style="margin-top:0">
<i class="el-icon-info"></i>
免费赠送游戏前提:需要在前一天玩过游戏
</div>
<div style="margin-top:20px" v-loading="loading">
<h3 class="fz16 pb20">机制设置</h3>
<h4 class="fz14 gray pb20">用户免费体力数</h4>
<el-radio v-model="form.sysGiveValueType" :label="1">
......
......@@ -89,6 +89,22 @@
</div>
</div>
</el-col>
<!-- <el-col :span="5">
<div class="recharge-today-item border2 clearfix">
<div class="text-center fl">
<div class="icon-box color6">
<i class="iconfont icon-shipinliuliang fz26"></i>
</div>
<p>视频流量</p>
</div>
<div class="text-center fr">
<p class="text-right">
<span class="fz30">{{ videoTraffic.traffic || 0 }}</span> GB
</p>
<p class="regular-font-color">合计费用:¥{{ videoTraffic.trafficCost | amount }}</p>
</div>
</div>
</el-col> -->
</el-row>
</div>
<div class="dm-wrap" v-loading="loading">
......@@ -102,8 +118,11 @@
<el-table-column align="left" prop="name" label="计费项目"></el-table-column>
<el-table-column align="left" prop="count" label="时长/条数">
<template slot-scope="scope">
<span>{{ scope.row.count }}</span>
{{ scope.row.type === 'call' || scope.row.type === 'record' ? '分钟' : '条' }}
<template v-if="scope.row.type === 'video'">{{ scope.row.count || 0 }} G</template>
<template v-else>
<span>{{ scope.row.count }}</span>
{{ scope.row.type === 'call' || scope.row.type === 'record' ? '分钟' : '条' }}
</template>
</template>
</el-table-column>
<el-table-column align="left" prop="fee" label="费用">
......@@ -130,7 +149,7 @@
</template>
<script>
import { rechargeCenter, consumeRecord } from '@/service/api/rechargeApi.js';
import { rechargeCenter, consumeRecord, todayVideoTraffic } from '@/service/api/rechargeApi.js';
import { formatDateTimeByType } from '@/utils/index.js';
export default {
......@@ -145,6 +164,7 @@ export default {
beginTime: '',
endTime: ''
},
videoTraffic: {},
pickerOptions: {
disabledDate(val) {
return Date.now() >= val.getTime() + 6 * 30 * 24 * 60 * 60 * 1000;
......@@ -156,6 +176,7 @@ export default {
this.$store.commit('aside_handler', false);
this.rechargeCenter();
this.consumeRecord();
// this.getTodayVideoTraffic();
this.$store.commit('mutations_breadcrumb', [{ name: '企业管理', path: '' }, { name: '计费中心', path: '' }]); // eslint-disable-line
},
filters: {
......@@ -167,6 +188,15 @@ export default {
}
},
methods: {
// 视频流量资费
async getTodayVideoTraffic() {
try {
let res = await todayVideoTraffic();
this.videoTraffic = res.result || {};
} catch (err) {
console.log(err);
}
},
async rechargeCenter() {
try {
let res = await rechargeCenter();
......@@ -187,6 +217,7 @@ export default {
try {
let res = await consumeRecord(this.listParams);
const result = res.result;
// , { name: '视频流量', type: 'video', fee: result.allTraffic, count: result.allTrafficCost }
this.tableList = [{ name: '短信营销', type: 'marketing', fee: result.messageFee, count: result.messageCount }, { name: '短信验证码', type: 'sms', fee: result.smsFee, count: result.smsCount }, { name: '语音验证码', type: 'voice', fee: result.voiceFee, count: result.voiceCount }, { name: '双向呼叫', type: 'call', fee: result.callFee, count: result.callTime }, { name: '通话录音', type: 'record', fee: result.recordCallfee, count: result.recordCallTime }]; // eslint-disable-line
} catch (err) {
console.log(err);
......@@ -225,6 +256,9 @@ export default {
&.color5 {
background: #f39925;
}
&.color6 {
background: #52c41a;
}
i {
line-height: 60px;
color: #fff;
......
<template>
<section class="recharge">
<div class="dm-wrap">
日期:<el-date-picker :pickerOptions="pickerOptions" v-model="dateTime" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="loadAll(false)"></el-date-picker>
日期:<el-date-picker :clearable="false" :pickerOptions="pickerOptions" v-model="dateTime" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="loadAll(false)"></el-date-picker>
<span class="fz12 gray">* 此处仅支持筛选近半年的统计数据</span>
</div>
<div class="dm-form__wrap">
<h3 class="dm-title__label">趋势分析图</h3>
<div class="text-center fz16" v-if="$route.params.type === 'record'">{{ formatDateTimeByType(dateTime[0], 'yyyy-MM-dd') }}{{ formatDateTimeByType(dateTime[1], 'yyyy-MM-dd') }} 成功存储:{{ sumCount || 0 }} 分钟 总计消费:{{ (sumFee / 100).toFixed(2) }}</div>
<div class="text-center fz16" v-if="$route.params.type === 'video'">{{ formatDateTimeByType(dateTime[0], 'yyyy-MM-dd') }}{{ formatDateTimeByType(dateTime[1], 'yyyy-MM-dd') }} 共消耗流量{{ sumCount }}MB 累计支出{{ sumFee }}</div>
<div class="text-center fz16" v-else>{{ formatDateTimeByType(dateTime[0], 'yyyy-MM-dd') }}{{ formatDateTimeByType(dateTime[1], 'yyyy-MM-dd') }} 成功发送:{{ sumCount || 0 }} 条 总计消费:{{ (sumFee / 1000).toFixed(2) }}</div>
<div>
<div id="mountNode" ref="mountNode" v-show="list.length"></div>
......@@ -14,7 +15,14 @@
</div>
</div>
<div class="dm-form__wrap" v-loading="loading">
<div class="pb22" style="overflow:hidden;line-height:40px;">
<div class="pb22" style="overflow:hidden;line-height:40px;" v-if="$route.params.type === 'video'">
<!-- 视频资费 -->
<el-date-picker :clearable="false" v-model="dateTimeVideo" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="changeVideoTime"></el-date-picker>
<span class="fz12 gray">* 此处时间跨度不超过7天</span>
<el-button type="primary" class="fr" icon="iconfont icon-icon_yunxiazai fz14 mr5" @click="downloadTrafficCostListExcel">导出记录</el-button>
</div>
<div v-else class="pb22" style="overflow:hidden;line-height:40px;">
<!-- 非视频资费 -->
<!-- <el-select v-if="$route.params.type === 'call'" class="dm-select" v-model="taskType" placeholder="选择发送状态" @change="loadAll(true)">
<el-option v-for="item in taskTypeOptions" :key="item.taskType" :label="item.ecmName" :value="item.taskType"></el-option>
</el-select> -->
......@@ -187,12 +195,29 @@
<template slot-scope="scope"> {{ Number(scope.row.storageFee / 100).toFixed(2) }}</template>
</el-table-column>
</el-table>
<!-- 视频资费 -->
<el-table tooltipEffect="light" :data="tableList" style="width:100%" v-if="$route.params.type === 'video'">
<el-table-column align="left" prop="createTime" label="时间">
<template slot-scope="scope">
<p class="cell-time">
{{ formatDateTimeByType(scope.row.time, 'yyyy-MM-dd-HH-mm-ss') }}
</p>
</template>
</el-table-column>
<el-table-column align="left" prop="traffic" label="流量消耗统计">
<template slot-scope="scope"> {{ scope.row.traffic }}GB </template>
</el-table-column>
<el-table-column align="left" prop="trafficCost" label="流量费用支出">
<template slot-scope="scope"> ¥ {{ scope.row.trafficCost }} </template>
</el-table-column>
</el-table>
<dm-pagination v-show="tableList.length" background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
</div>
<vue-gic-export-excel :dialogVisible.sync="dialogVisible" :dataArr="tableList" :type="2" :excelUrl="excelUrl" :params="params" :projectName="projectName"></vue-gic-export-excel>
</section>
</template>
<script>
import { messageMarketingChart, messageMarketingPage, smsData, voiceData, callData, recordData } from '@/service/api/rechargeApi.js';
import { messageMarketingChart, messageMarketingPage, smsData, voiceData, callData, recordData, videoPage, videoChartData, downloadTrafficCostListExcel } from '@/service/api/rechargeApi.js';
import { formatDateTimeByType } from '@/utils/index.js';
import G2 from '@antv/g2';
export default {
......@@ -204,6 +229,8 @@ export default {
defaultAvatar: require('../../assets/img/head_default.png'),
formatDateTimeByType,
dateTime: [Date.now() - 30 * 24 * 60 * 60 * 1000, Date.now()],
dateTimeVideo: [Date.now() - 7 * 24 * 60 * 60 * 1000, Date.now()],
dateTimeVideoCopy: [Date.now() - 7 * 24 * 60 * 60 * 1000, Date.now()],
loading: false,
tableList: [],
listParams: {
......@@ -223,7 +250,18 @@ export default {
disabledDate(val) {
return Date.now() >= val.getTime() + 6 * 30 * 24 * 60 * 60 * 1000;
}
}
},
videoListParams: {
currentPage: 1,
pageSize: 20,
requestProject: 'marketing',
startTime: '',
endTime: ''
},
projectName: 'marketing', // 当前项目名
dialogVisible: false,
excelUrl: '', // 下载数据的地址
params: {} // 传递的参数
};
},
created() {
......@@ -282,6 +320,12 @@ export default {
}
this.recordData('list');
}
if (this.$route.params.type === 'video') {
if (!onlyList) {
this.videoPage('charts');
}
this.videoPage('list');
}
},
async marketingList() {
this.loading = true;
......@@ -406,6 +450,62 @@ export default {
} catch (err) {}
this.loading = false;
},
// 视频资费相关接口
async videoPage(type = 'list') {
this.loading = true;
try {
this.videoListParams.startTime = formatDateTimeByType(this.dateTimeVideo[0], 'yyyy-MM-dd');
this.videoListParams.endTime = formatDateTimeByType(this.dateTimeVideo[1], 'yyyy-MM-dd');
if (type === 'list') {
let res = await videoPage(this.videoListParams);
if (res.errorCode === 0 && res.result.result) {
this.tableList = res.result.result || [];
this.total = res.result.totalCount;
} else {
this.tableList = [];
}
} else if (type === 'charts') {
const params = { ...this.listParams, startTime: this.listParams.beginTime };
let res = await videoChartData(params);
this.sumCount = res.result.sumCount;
this.sumFee = res.result.sumFee;
let chartList = res.result.chartList || [];
let list = [];
chartList.map(v => {
list.push({ day: v.chartsDate, name: '支出费用', temperature: v.trafficCost || 0 });
});
list.sort((a, b) => {
return a.temperature - b.temperature;
});
this.list = list;
this.$nextTick(_ => {
this.initCharts(list, 'mountNode');
});
}
} catch (err) {}
this.loading = false;
},
// 修改视频时间 范围不能超过7天
changeVideoTime(date) {
// 单张卡券可以设置领取n久
if (new Date(this.dateTimeVideo[1]).getTime() - new Date(this.dateTimeVideo[0]).getTime() > 7 * 24 * 60 * 60 * 1000) {
this.$tips({ message: '领取时间段范围不能超过7天', type: 'warning' });
this.dateTimeVideo = [...this.dateTimeVideoCopy];
return;
}
this.dateTimeVideoCopy = [...this.dateTimeVideo];
this.videoPage('list');
},
// 导出
downloadTrafficCostListExcel() {
this.dialogVisible = true;
this.excelUrl = downloadTrafficCostListExcel;
this.params = {
startTime: formatDateTimeByType(this.dateTimeVideo[0], 'yyyy-MM-dd'),
endTime: formatDateTimeByType(this.dateTimeVideo[1], 'yyyy-MM-dd'),
requestProject: 'marketing'
};
},
async recordData(type = 'list') {
this.loading = true;
try {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
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