Commit 862a99c7 by chenxin

feat:e袋洗 列表 新增

parent b42c5fe9
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=/marketing/static/css/iconfont.css><link rel=stylesheet type=text/css href=/marketing/static/css/common.css><script type=text/javascript>!function(e,t,n,g,i){e[i]=e[i]||function(){(e[i].q=e[i].q||[]).push(arguments)},n=t.createElement("script"),tag=t.getElementsByTagName("script")[0],n.async=1,n.src=('https:'==document.location.protocol?'https://':'http://')+g,tag.parentNode.insertBefore(n,tag)}(window,document,"script","assets.giocdn.com/2.1/gio.js","gio");
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=/static/css/iconfont.css><link rel=stylesheet type=text/css href=/static/css/common.css><script type=text/javascript>!function(e,t,n,g,i){e[i]=e[i]||function(){(e[i].q=e[i].q||[]).push(arguments)},n=t.createElement("script"),tag=t.getElementsByTagName("script")[0],n.async=1,n.src=('https:'==document.location.protocol?'https://':'http://')+g,tag.parentNode.insertBefore(n,tag)}(window,document,"script","assets.giocdn.com/2.1/gio.js","gio");
gio('init','8be12240a3749eab', {});
//custom page code begin here
//custom page code end here
gio('send');</script><link href=/marketing/static/css/main.4a2b329fdbc3591473324246ee19e171.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/lib/elementUI/index.2.5.4.js></script><script src=//web-1251519181.file.myqcloud.com/components/header.2.0.30.js></script><script src=//web-1251519181.file.myqcloud.com/components/footer.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/card.2.0.02.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.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-card.2.0.04.js></script><script src=//web-1251519181.file.myqcloud.com/components/confirm-people.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/people.2.0.31.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.04.js></script><script src=//web-1251519181.file.myqcloud.com/components/input.2.0.00.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.1.91.js></script><script type=text/javascript src=/marketing/static/js/manifest.f801c0dca89f6ddaf548.js></script><script type=text/javascript src=/marketing/static/js/vendor.210a1a642e9c8aa3ce9e.js></script><script type=text/javascript src=/marketing/static/js/main.4e896db7c4b0bc1a80f2.js></script></body></html>
\ No newline at end of file
gio('send');</script><link href=/marketing/static/css/main.19fe41ab2b725aea4a35c72d545daf5e.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/lib/elementUI/index.2.5.4.js></script><script src=//web-1251519181.file.myqcloud.com/components/header.2.0.30.js></script><script src=//web-1251519181.file.myqcloud.com/components/footer.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/card.2.0.02.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.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-card.2.0.04.js></script><script src=//web-1251519181.file.myqcloud.com/components/confirm-people.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/people.2.0.31.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.04.js></script><script src=//web-1251519181.file.myqcloud.com/components/input.2.0.00.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.1.91.js></script><script type=text/javascript src=/marketing/static/js/manifest.69b4bc8b222959cd3d3a.js></script><script type=text/javascript src=/marketing/static/js/vendor.4cb744d5df3ad4bdbad7.js></script><script type=text/javascript src=/marketing/static/js/main.0d07b5df99782e7c5191.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.
!function(e){var r=window.webpackJsonp;window.webpackJsonp=function(n,c,a){for(var i,u,d,f=0,s=[];f<n.length;f++)u=n[f],t[u]&&s.push(t[u][0]),t[u]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(r&&r(n,c,a);s.length;)s.shift()();if(a)for(f=0;f<a.length;f++)d=o(o.s=a[f]);return d};var n={},t={12:0};function o(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,o),t.l=!0,t.exports}o.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,o){r=t[e]=[n,o]});r[2]=n;var c=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,o.nc&&a.setAttribute("nonce",o.nc),a.src=o.p+"static/js/"+({0:"game",1:"card",2:"wechat",3:"evaluation",4:"message",5:"ewash",6:"ecm",7:"recharge",8:"msg",9:"calllog"}[e]||e)+"."+{0:"939ef154a34f1a744ce0",1:"026dac0bcd8969a615d4",2:"74cec9b4e7b2d7c30c85",3:"050296879188ef53023e",4:"9a09a2ca69a10dd4b1cb",5:"e0d5144c92441f4ba48b",6:"1eea4e6e08cc95d8322d",7:"6235075e2c47716c5050",8:"5d9bccc98221e443f872",9:"101d05cb830d169de2d6"}[e]+".js";var i=setTimeout(u,12e4);function u(){a.onerror=a.onload=null,clearTimeout(i);var r=t[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=u,c.appendChild(a),n},o.m=e,o.c=n,o.d=function(e,r,n){o.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},o.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(r,"a",r),r},o.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},o.p="/marketing/",o.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,c){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,c);s.length;)s.shift()();if(c)for(d=0;d<c.length;d++)u=o(o.s=c[d]);return u};var n={},t={11:0};function o(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,o),t.l=!0,t.exports}o.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,o){r=t[e]=[n,o]});r[2]=n;var a=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,o.nc&&c.setAttribute("nonce",o.nc),c.src=o.p+"static/js/"+({0:"game",1:"card",2:"wechat",3:"evaluation",4:"message",5:"ecm",6:"recharge",7:"msg",8:"calllog"}[e]||e)+"."+{0:"939ef154a34f1a744ce0",1:"64b3ba7c880f8a486e64",2:"31d2e32bdef1c4feba02",3:"050296879188ef53023e",4:"9a09a2ca69a10dd4b1cb",5:"733ca22ff5da5d948852",6:"3a1253a9f8300faf72c0",7:"f7da77cd12f974cc2d9a",8:"5eed9786deb616aedcf4"}[e]+".js";var f=setTimeout(i,12e4);function i(){c.onerror=c.onload=null,clearTimeout(f);var r=t[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return c.onerror=c.onload=i,a.appendChild(c),n},o.m=e,o.c=n,o.d=function(e,r,n){o.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},o.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(r,"a",r),r},o.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},o.p="/marketing/",o.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
webpackJsonp([7],{"+66z":function(e,t){var n=Object.prototype.toString;e.exports=function(e){return n.call(e)}},"1oyr":function(e,t){e.exports=function(e){return function(){return e}}},"3T7U":function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}},"5Zxu":function(e,t,n){var i=n("sBat");e.exports=function(e){var t=i(e),n=t%1;return t==t?n?t-n:t:0}},"6MiT":function(e,t,n){var i=n("aCM0"),r=n("UnEC"),s="[object Symbol]";e.exports=function(e){return"symbol"==typeof e||r(e)&&i(e)==s}},"7UU1":function(e,t){e.exports=function(e){if(Array.isArray(e))return e}},Biqn:function(e,t,n){var i=n("fKPv");e.exports=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){i(e,t,n[t])})}return e}},BpiJ:function(e,t){},GXH0:function(e,t,n){
webpackJsonp([8],{"+66z":function(e,t){var n=Object.prototype.toString;e.exports=function(e){return n.call(e)}},"1oyr":function(e,t){e.exports=function(e){return function(){return e}}},"3T7U":function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}},"5Zxu":function(e,t,n){var i=n("sBat");e.exports=function(e){var t=i(e),n=t%1;return t==t?n?t-n:t:0}},"6MiT":function(e,t,n){var i=n("aCM0"),r=n("UnEC"),s="[object Symbol]";e.exports=function(e){return"symbol"==typeof e||r(e)&&i(e)==s}},"7UU1":function(e,t){e.exports=function(e){if(Array.isArray(e))return e}},Biqn:function(e,t,n){var i=n("fKPv");e.exports=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){i(e,t,n[t])})}return e}},BpiJ:function(e,t){},GXH0:function(e,t,n){
/*!
* vue-treeselect v0.0.36 | (c) 2017-2018 Riophae Lee
* Released under the MIT License.
......
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.
......@@ -5,8 +5,8 @@
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="shortcut icon" href="/img/favicon.ico">
<title>GIC后台</title>
<link rel="stylesheet" type="text/css" href="/marketing/static/css/iconfont.css">
<link rel="stylesheet" type="text/css" href="/marketing/static/css/common.css">
<link rel="stylesheet" type="text/css" href="/static/css/iconfont.css">
<link rel="stylesheet" type="text/css" href="/static/css/common.css">
<!-- element 皮肤 -->
<!-- <link rel="stylesheet" type="text/css" href="http://web-1251519181.file.myqcloud.com/lib/elementUI/theme.1.0.1/index.css"> -->
<!-- GrowingIO Analytics code version 2.1 -->
......
//卡券营销
// import card from '../../views/card';
// import cardList from '../../views/card/list';
// import cardRecord from '../../views/card/record';
// import cardRecordSend from '../../views/card/record-send';
// import cardRecordSendInfo from '../../views/card/record-send-info';
// import cardRecordGet from '../../views/card/record-get';
// import cardRecordCache from '../../views/card/record-cache';
// import cardGroupSend from '../../views/card/group-send';
// import cardAnalysis from '../../views/card/analysis';
// import cardForm from '../../views/card/form.vue';
// import cardShelf from '../../views/card/shelf';
// import cardManager from '../../views/card/manager';
// import cardCheck from '../../views/card/check';
export default {
path: 'card',
name: '卡券营销',
......
export default {
path: 'ewash',
name: 'e袋洗',
component: () => import(/* webpackChunkName: "ewash" */ '../../views/ewash/index.vue'),
meta: {},
redirect: 'ewash/list',
children: [
{
path: 'list',
name: 'e袋洗服务',
component: () => import(/* webpackChunkName: "ewash" */ '../../views/ewash/list.vue'),
meta: {}
},
{
path: 'add',
name: '新增卡券',
component: () => import(/* webpackChunkName: "ewash" */ '../../views/ewash/form.vue'),
meta: {
type: 'add',
path: '/ewash/list'
}
},
{
path: 'edit/:id',
name: '卡券编辑',
component: () => import(/* webpackChunkName: "ewash" */ '../../views/ewash/form.vue'),
meta: {
type: 'edit',
path: '/ewash/list'
}
},
{
path: 'analysis/:id',
name: 'e袋洗卡券报表',
component: () => import(/* webpackChunkName: "ewash" */ '../../views/ewash/analysis.vue'),
meta: {
path: '/ewash/list'
}
},
{
path: 'statements',
name: 'e袋洗对账单',
component: () => import(/* webpackChunkName: "ewash" */ '../../views/ewash/statements.vue'),
meta: {}
}
]
};
......@@ -24,6 +24,8 @@ import calllog from './modules/calllog';
import evaluation from './modules/evaluation';
//计费中心
import recharge from './modules/recharge';
//e袋洗
import ewash from './modules/ewash';
export default [
{
......@@ -31,7 +33,7 @@ export default [
name: 'layout',
component: Layout,
redirect: '/wechat/record',
children: [card, ecm, game, message, wechat, msg, calllog, recharge, evaluation]
children: [card, ecm, game, message, wechat, msg, calllog, recharge, evaluation, ewash]
},
{
path: '/401',
......
<template>
<section>
<!-- 渠道分析 -->
<div class="dm-form__wrap" v-if="$route.meta.type !== 'shelf'">
<h3 class="dm-title__label">
<span class="card-chart__title">渠道分析</span>
<el-date-picker class="fr ml5 mr20" v-model="dateTime2" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="cardChannelAnalysis"></el-date-picker>
</h3>
<el-table tooltipEffect="light" :data="tableList" style="width:100%" v-loading="loading">
<el-table-column v-for="(v, i) in tableHeader" :key="i" :align="v.align" :width="v.width" :min-width="v.minWidth" :prop="v.prop" :label="v.label" :formatter="v.formatter"></el-table-column>
</el-table>
</div>
<!-- 卡券报表趋势分析 -->
<div class="dm-form__wrap">
<h3 class="dm-title__label clearfix">
<span class="card-chart__title">卡券报表趋势分析</span>
<el-date-picker class="fr ml5 mr20" v-model="dateTime" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="cardTrendEchart"></el-date-picker>
<el-select class="fr w200" v-model="chartParams.kpiName" placeholder="选择状态" @change="cardTrendEchart">
<el-option v-for="(v, i) in kpiNameOptions" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
</h3>
<div id="mountNode" ref="mountNode" v-show="list.length"></div>
<div class="chart--nodata" v-show="!list.length"></div>
</div>
</section>
</template>
<script>
import { cardChannelAnalysis, cardTrendEchart } from '@/service/api/cardApi.js';
import { formatDateTimeByType } from '@/utils/index.js';
import VeLine from 'v-charts/lib/line.common';
import G2 from '@antv/g2';
export default {
name: 'card-analysis',
data() {
this.chartSettings = {
xAxisType: 'time'
};
return {
formatDateTimeByType,
dateTime: [Date.now() - 30 * 24 * 60 * 60 * 1000, Date.now()],
dateTime2: [Date.now() - 30 * 24 * 60 * 60 * 1000, Date.now()],
loading: false,
tableList: [],
chartData: {
columns: [],
rows: []
},
listParams: {
type: ''
},
kpiNameOptions: [{ label: '领取次数', value: 'card-puton1' }, { label: '使用次数', value: 'card-puton2' }, { label: '销售额', value: 'card-puton3' }],
tableHeader: [
{ label: '渠道名称', prop: 'receiveName', align: 'left', minWidth: '200' },
{
label: '投放人次',
prop: 'issuingQuantity',
align: 'left',
width: '100',
formatter(row) {
return row.receiveCode === 'RECEIVE_005' ? '-' : row.issuingQuantity;
}
},
{
label: '领取率',
prop: 'receiveName',
align: 'left',
width: '100',
formatter(row) {
return row.receiveCode === 'RECEIVE_005' ? '-' : ((row.getedQuantity * 100) / (row.issuingQuantity === 0 ? 1 : row.issuingQuantity)).toFixed(2) + '%';
}
},
{ label: '领取数量', prop: 'getedQuantity', align: 'left', width: '100' },
{ label: '使用数量', prop: 'usageQuantity', align: 'left', width: '100' },
{
label: '核销率',
prop: 'receiveName',
align: 'left',
width: '100',
formatter(row) {
return ((row.usageQuantity * 100) / (row.getedQuantity === 0 ? 1 : row.getedQuantity)).toFixed(2) + '%';
}
},
{ label: '销售额', prop: 'saleAmount', align: 'left', width: '100' }
],
chartParams: {
kpiName: 'card-puton1',
cardId: this.$route.params.id,
beginTime: '',
endTime: '',
day: 1
},
list: []
};
},
components: {
[VeLine.name]: VeLine
},
created() {
if (this.$route.meta.type === 'shelf') {
this.chartParams = {
kpiName: 'shelf-cards1',
shelfId: this.$route.params.id,
beginTime: '',
endTime: ''
};
this.kpiNameOptions = [{ label: '领取次数', value: 'shelf-cards1' }, { label: '使用次数', value: 'shelf-cards2' }, { label: '销售额', value: 'shelf-cards3' }];
this.cardTrendEchart();
this.$store.commit('mutations_breadcrumb', [{ name: '营销管理', path: '' }, { name: '卡券营销', path: '' }, { name: '卡券展架', path: '/card/shelf' }, { name: '卡券展架报表', path: '' }]);
} else {
this.chartParams = {
kpiName: 'card-puton1',
cardId: this.$route.params.id,
beginTime: '',
endTime: '',
day: 1
};
(this.kpiNameOptions = [{ label: '领取次数', value: 'card-puton1' }, { label: '使用次数', value: 'card-puton2' }, { label: '销售额', value: 'card-puton3' }]), this.cardChannelAnalysis();
this.cardTrendEchart();
this.$store.commit('mutations_breadcrumb', [{ name: '营销管理', path: '' }, { name: 'e袋洗服务', path: '' }, { name: '卡券报表', path: '' }]);
}
},
methods: {
//加载列表
async cardChannelAnalysis() {
let params = {
coupCardId: this.$route.params.id,
beginTime: '',
endTime: ''
};
if (this.dateTime2) {
params.beginTime = formatDateTimeByType(this.dateTime2[0], 'yyyy-MM-dd');
params.endTime = formatDateTimeByType(this.dateTime2[1], 'yyyy-MM-dd');
} else {
params.beginTime = '';
params.endTime = '';
}
this.loading = true;
try {
let resList = await cardChannelAnalysis(params);
if (resList.errorCode === 0 && resList.result) {
this.tableList = resList.result;
} else {
this.tableList = [];
}
} catch (err) {}
this.loading = false;
},
//加载图表
async cardTrendEchart() {
if (this.dateTime) {
this.chartParams.beginTime = formatDateTimeByType(this.dateTime[0], 'yyyy-MM-dd');
this.chartParams.endTime = formatDateTimeByType(this.dateTime[1], 'yyyy-MM-dd');
} else {
this.chartParams.beginTime = '';
this.chartParams.endTime = '';
}
try {
let res = await cardTrendEchart(this.chartParams);
if (res.errorCode === 0 && res.result) {
let result = JSON.parse(res.result);
let series = result.series;
let xAxisType = result.xaxisData;
let list = [];
series.map((v, i) => {
v.data.map((w, j) => {
list.push({
day: xAxisType[j],
name: v.name,
temperature: parseInt(w.value)
});
});
});
const mountNode = this.$refs.mountNode;
const childs = Array.from(mountNode.childNodes);
childs.map(v => {
mountNode.removeChild(v);
});
this.list = list;
this.$nextTick(_ => {
this.initCharts(list);
});
}
} catch (err) {
console.log(err);
}
},
// 画图方法
initCharts(data) {
var chart = new G2.Chart({
container: 'mountNode',
forceFit: true,
height: 400
});
chart.source(data, {
day: {
range: [0, 1]
}
});
chart.tooltip({
crosshairs: {
type: 'line'
}
});
chart.axis('temperature', {
label: {
formatter: function formatter(val) {
val = Number(val);
if (val % 1 === 0) {
return val + '人次';
} else {
return '';
}
}
}
});
chart
.line()
.position('day*temperature')
.color('name');
chart
.point()
.position('day*temperature')
.color('name')
.size(4)
.shape('circle')
.style({
stroke: '#fff',
lineWidth: 1
});
chart.render();
}
}
};
</script>
<style lang="scss" scoped>
.card-chart__title {
display: inline-block;
vertical-align: middle;
padding-top: 13px;
font-weight: 700;
}
</style>
<template>
<div>
<router-view />
</div>
</template>
<script>
export default {
name: 'ewash',
created() {
this.$store.commit('aside_handler', false);
this.$nextTick(_ => {
this.$store.commit('aside_handler', true);
});
}
};
</script>
<template>
<section class="dm-wrap">
<div class="game-ptyx-header pb10 clearfix">
<span class="pr10">卡券共{{ total }}</span>
<el-button-group class="vertical-middle pr4">
<el-button @click="sortList('col1')">创建时间<i class="el-icon--right" :class="listParams.sortBy === 'col1' ? 'el-icon-caret-top' : listParams.sortBy === 'col1 desc' ? 'el-icon-caret-bottom' : 'el-icon-d-caret'"></i></el-button>
<el-button @click="sortList('col2')">领取量<i class="el-icon--right" :class="listParams.sortBy === 'col2' ? 'el-icon-caret-top' : listParams.sortBy === 'col2 desc' ? 'el-icon-caret-bottom' : 'el-icon-d-caret'"></i></el-button>
<el-button @click="sortList('col3')">使用量<i class="el-icon--right" :class="listParams.sortBy === 'col3' ? 'el-icon-caret-top' : listParams.sortBy === 'col3 desc' ? 'el-icon-caret-bottom' : 'el-icon-d-caret'"></i></el-button>
<el-button @click="sortList('col4')">核销率<i class="el-icon--right" :class="listParams.sortBy === 'col4' ? 'el-icon-caret-top' : listParams.sortBy === 'col4 desc' ? 'el-icon-caret-bottom' : 'el-icon-d-caret'"></i></el-button>
<el-button @click="sortList('col5')">核销额<i class="el-icon--right" :class="listParams.sortBy === 'col5' ? 'el-icon-caret-top' : listParams.sortBy === 'col5 desc' ? 'el-icon-caret-bottom' : 'el-icon-d-caret'"></i></el-button>
</el-button-group>
<el-select class="dm-select" v-model="listParams.cardType" placeholder="选择卡券类型" @change="refresh">
<el-option v-for="(item, index) in cardTypeOptions" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
<el-input v-model="listParams.searchParam" class="w200 vertical-middle" placeholder="输入卡券名称/备注" clearable @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<div class="fr">
<el-button type="primary" @click="$router.push('/ewash/statements')">查看账单</el-button>
<el-button type="primary">创建子账户</el-button>
<el-button type="primary" @click="$router.push('/ewash/add')">新增卡券</el-button>
</div>
</div>
<ul class="clearfix" v-loading="loading" element-loading-text="拼命加载中">
<card-item @adjust-stock="preAdjustStock" :item="v" v-for="(v, i) in tableList" :key="i" @delete-card="delData"></card-item>
</ul>
<div class="text-center" v-if="tableList.length === 0">
<img class="block block-center pt100" width="60" height="60" src="../../assets/img/no-data_icon.png" alt="" />
<el-button class="block block-center mt10 pb20" type="text" @click="$router.push('/ewash/add')">新增卡券</el-button>
</div>
<adjust-stock :show.sync="adjustStock" :totalCount="currentCard.couponStock" :coupCardId="currentCard.coupCardId" @refresh="delayRefresh"></adjust-stock>
<el-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"></el-pagination>
</section>
</template>
<script>
import { cardPageList, deleteCard } from '@/service/api/cardApi.js';
import adjustStock from '@/views/card/partials/adjust-Stock';
import cardItem from './partials/card-item';
import tableMethods from '@/mixins/tableMethods.js';
export default {
name: 'card-list',
mixins: [tableMethods],
data() {
return {
listParams: {
shelfId: '',
sortBy: '',
searchParam: '',
currentPage: 1,
pageSize: 20,
cardType: '',
gicCouponType: 1,
giftCouponDiscountType: ''
},
total: 0,
loading: false,
tableList: [],
cardTypeOptions: [{ value: '', label: '全部卡券类型' }, { value: 1, label: '抵金券' }, { value: 2, label: '免单券' }],
sortFlag: false,
adjustStock: false,
currentCard: {}
};
},
components: {
'adjust-stock': adjustStock,
'card-item': cardItem
},
created() {
window.scrollTo(0, 0);
this.getTableList();
this.$store.commit('mutations_breadcrumb', [{ name: 'e袋洗服务', path: '' }, { name: '卡券列表', path: '' }]);
},
methods: {
//编辑库存 前置
preAdjustStock(val) {
this.currentCard = val;
this.adjustStock = true;
},
//修改库存后台异步 所以这边延迟刷新列表
delayRefresh(val) {
this.currentCard.couponStock = val;
},
sortList(val) {
this.sortFlag = !this.sortFlag;
this.listParams.sortBy = this.sortFlag ? val + ' desc' : val;
this.refresh();
},
async getTableList() {
this.loading = true;
try {
let res = await cardPageList(this.listParams);
this.tableList = res.result.result;
this.total = res.result.totalCount;
} catch (err) {
this.$tips({ type: 'error', message: '加载列表失败' });
}
this.loading = false;
},
delData(val) {
this.$confirm('是否删除该卡券?', '提示', {
confirmButtonText: '确定',
cancelBUttonText: '取消',
type: 'warning'
})
.then(() => {
this.deleteCard(val);
})
.catch(() => {
this.$tips({ type: 'info', message: '已取消删除' });
});
},
async deleteCard(coupCardId) {
await deleteCard({ coupCardId });
this.$tips({ type: 'success', message: '删除成功!' });
if (this.tableList.length === 1 && this.listParams.currentPage !== 1) {
this.listParams.currentPage--;
}
this.getTableList();
}
}
};
</script>
<template>
<li class="card-item inline-block" :style="'border:1px solid ' + item.cardColor">
<div class="card-item_head" :style="'background:' + item.cardColor">
<h4>{{ item.cardName }}</h4>
<p>{{ item.subName }}</p>
</div>
<div class="card-item_body">
<div class="card-item__count clearfix">
<div>
<h5>{{ item.getedQuantity }}</h5>
<p>领取数量</p>
</div>
<div>
<h5>{{ item.usageQuantity }}</h5>
<p>使用数量</p>
</div>
<div>
<h5>{{ ((item.usageQuantity * 100) / (item.getedQuantity === 0 ? 1 : item.getedQuantity)).toFixed(2) }}%</h5>
<p>核销率</p>
</div>
<div>
<h5>{{ item.saleAmount }}</h5>
<p>销售额</p>
</div>
</div>
<div class="card-item__detail">
<p class="ellipsis-100">
有效期:<span v-if="item.cardEffectiveMode !== 0">领取后第{{ item.startDay + 1 }}-{{ item.limitDay + item.startDay }}</span>
<span v-if="item.cardEffectiveMode === 0">{{ formatDateTimeByType(item.beginDate, 'yyyy-MM-dd') }}{{ formatDateTimeByType(item.endDate, 'yyyy-MM-dd') }}</span>
</p>
<p class="ellipsis-100">
使用条件:<el-popover placement="top-start" width="200" trigger="hover" :content="item.useCondition | filterUseCondition">
<span slot="reference" class="ellipsis-100">{{ item.useCondition | filterUseCondition }}</span>
</el-popover>
</p>
<p class="ellipsis-100">
适用门店:<span>{{ item.storeMode === 0 ? '所有门店' : item.storeMode === 1 ? '部分分组' : '部分门店' }}</span>
</p>
<p class="ellipsis-100">
领取限制:<span>每人限制{{ item.cardLimit }}</span>
</p>
<p class="ellipsis-100">
卡券编号:<span>{{ item.coupCardId }}</span>
</p>
<p v-if="item.erpDemoCode" class="ellipsis-100">
demo券号:<span>{{ item.erpDemoCode || '--' }}</span>
</p>
</div>
<div class="card-item_foot clearfix">
<div class="fl">
<span v-if="item.auditingStatus !== -1"
>剩余库存:{{ item.couponStock }} <a title="编辑库存" v-if="!shelfFlag && item.useCustomCode === 0" @click="preAdjustStock(item)"><i class="el-icon-edit"></i></a
></span>
</div>
<render-temp v-if="!shelfFlag" :item="item" @handler="handler"></render-temp>
<a title="删除" class="fr" v-if="shelfFlag" @click="delShelf(item)"><i class="el-icon-delete"></i></a>
</div>
</div>
</li>
</template>
<script>
import renderTemp from './status-render.js';
import { formatDateTimeByType } from '@/utils/index.js';
export default {
props: {
item: {
type: Object,
default() {
return {
cardEffectiveMode: 0
};
}
},
//是否为展架里的卡券 默认为false
shelfFlag: {
type: Boolean,
default: false
}
},
data() {
return {
formatDateTimeByType
};
},
components: {
'render-temp': renderTemp
},
methods: {
/**
* @param val
* 1 投放 2 报表 3 编辑 4 删除 5 详情
*/
handler(val) {
switch (val) {
case 2:
this.$router.push('/ewash/analysis/' + this.item.coupCardId);
break;
case 3:
this.$router.push('/ewash/edit/' + this.item.coupCardId);
break;
case 4:
this.$emit('delete-card', this.item.coupCardId);
break;
}
},
//编辑库存 前置
preAdjustStock() {
this.$emit('adjust-stock', this.item);
},
delShelf(obj) {
this.$emit('del-shelf', obj);
}
},
filters: {
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 ? '' : '不可与其他优惠共享');
}
}
};
</script>
<style lang="scss" scoped>
.card-item {
width: 340px;
margin: 10px;
border: 1px solid #63b359;
border-radius: 4px;
overflow-y: none;
vertical-align: middle;
min-height: 376px;
&_head {
width: 100%;
text-align: center;
color: #fff;
background: #63b359;
padding: 10px 0;
h4 {
font-size: 16px;
font-weight: 500;
line-height: 1.8em;
}
p {
color: #fff;
line-height: 1.8em;
font-size: 13px;
}
}
&_body {
.card-item__count {
border-bottom: 1px solid #ddd;
& > div {
width: 50%;
float: left;
text-align: center;
margin: 10px 0;
h5 {
font-size: 20px;
line-height: 28px;
}
p {
font-size: 12px;
color: #999;
line-height: 20px;
}
}
}
.card-item__detail {
padding: 10px;
height: 150px;
p {
line-height: 1.8em;
span {
font-size: 13px;
color: #999;
}
}
}
}
&_foot {
background: #f8f9fb;
height: 44px;
line-height: 44px;
padding: 0 10px;
/deep/ a {
color: #909399;
&:hover {
color: #1890ff;
}
}
/deep/ i {
font-size: 16px;
padding-left: 2px;
cursor: pointer;
}
/deep/ .el-icon-delete {
&:hover {
color: #f56c6c;
}
}
/deep/ .fr span {
font-size: 13px;
}
}
}
</style>
import Vue from 'vue';
export default Vue.component('render-temp', {
props: {
item: Object
},
methods: {
handler(val) {
this.$emit('handler', val);
}
},
render(h) {
// const bind1 = (
// <a title="投放" onClick={this.handler.bind(null, 1)}>
// <i class="iconfont icon-daohang-" />
// </a>
// );
const bind2 = (
<a title="报表" onClick={this.handler.bind(null, 2)}>
<i class="el-icon-tickets" />
</a>
);
const bind3 = (
<a title="编辑" onClick={this.handler.bind(null, 3)}>
<i class="el-icon-edit" />
</a>
);
const bind4 = (
<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 = (
// <a title="复制" onClick={this.handler.bind(null, 6)}>
// <i class="iconfont icon-wxcard-copy" />
// </a>
// );
const statushtml = (
<span>
{/* {bind6} */}
{/* {bind1} */}
{bind2}
{bind3}
{bind4}
</span>
);
const overDateHtml = (
<span>
<span class="danger">已过期</span>
{/* {bind6} */}
{bind2}
{/* {bind5} */}
{bind4}
</span>
);
const noputonStatushtml = (
<span>
{/* {bind6} */}
{bind2}
{bind3}
{bind4}
</span>
);
const statusNostockhtml = noputonStatushtml;
const statusFaildhtml = (
<span>
{/* {bind6} */}
{bind3}
{bind4}
</span>
);
const _html = this.item.cardEffectiveMode == 0 && this.item.endDate < Date.now() ? overDateHtml : statushtml;
let failMsg = '';
if (this.item.autingFaildMsg) {
failMsg = ':' + this.item.autingFaildMsg;
if (this.item.autingFaildMsg.length > 8) {
failMsg = (
<el-popover placement="top-start" title="" width="200" trigger="hover" content={this.item.autingFaildMsg}>
<span class="danger-color" slot="reference">
{this.item.autingFaildMsg.substring(0, 8) + '...'}
</span>
</el-popover>
);
}
}
if (this.item.cardEffectiveMode == 0 && this.item.endDate < Date.now()) {
return <div class="fr">{overDateHtml}</div>;
}
if (this.item.auditingStatus === 0) {
return (
<div class="fr">
<span class="green">审核中</span>
</div>
);
} else if (this.item.auditingStatus === -1) {
return (
<div class="fr">
<span class="danger-color">
审核失败{failMsg}
{statusFaildhtml}
</span>
</div>
);
} else if (this.item.auditingStatus === -2) {
return (
<div class="fr">
<span class="danger-color">
更新失败{failMsg}
{_html}
</span>
</div>
);
} else if (this.item.useCustomCode == 1 && this.item.customCodeSync == 1) {
return (
<div class="fr">
<span class="danger-color">正在上传卡券Code</span>
</div>
);
} else if (this.item.stock === 0) {
return <div class="fr">{statusNostockhtml}</div>;
} else if (this.item.cardLimit && this.item.cardLimit == 1) {
return <div class="fr">{_html}</div>;
} else {
return <div class="fr">{noputonStatushtml}</div>;
}
}
});
<template>
<div>对账账单</div>
</template>
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