Commit ab355ca2 by crushh

update: dist

parents 2559724c cf7b62dc
<!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></title><link rel=stylesheet type=text/css href=static/css/common.css><link rel=stylesheet href=//at.alicdn.com/t/font_688955_2dxzdzrb3a7.css><script src=//at.alicdn.com/t/font_688955_2dxzdzrb3a7.js></script><link rel=stylesheet href=//at.alicdn.com/t/font_3229694_f4zx0uhc8y.css><script src=//at.alicdn.com/t/font_3229694_f4zx0uhc8y.js></script><link src=//at.alicdn.com/t/font_2859043_udehp133w1.css><script src=//at.alicdn.com/t/font_2859043_udehp133w1.js></script><link rel=stylesheet href=//at.alicdn.com/t/font_2996579_dv9vctk5vdt.css><script src=//at.alicdn.com/t/font_2996579_dv9vctk5vdt.js></script><link href=/marketing/static/css/main.89745d56780e82f93eed2ef5d3160ae5.css rel=stylesheet></head><body><div id=app><div class=el-loading-spinner style="width: 98%;"><svg viewBox="25 25 50 50" class=circular><circle cx=50 cy=50 r=20 fill=none class=path></circle></svg></div></div><script>(function() {
<!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></title><link rel=stylesheet type=text/css href=static/css/common.css><link rel=stylesheet href=//at.alicdn.com/t/font_688955_2dxzdzrb3a7.css><script src=//at.alicdn.com/t/font_688955_2dxzdzrb3a7.js></script><link rel=stylesheet href=//at.alicdn.com/t/font_3229694_f4zx0uhc8y.css><script src=//at.alicdn.com/t/font_3229694_f4zx0uhc8y.js></script><link src=//at.alicdn.com/t/font_2859043_udehp133w1.css><script src=//at.alicdn.com/t/font_2859043_udehp133w1.js></script><link rel=stylesheet href=//at.alicdn.com/t/font_2996579_dv9vctk5vdt.css><script src=//at.alicdn.com/t/font_2996579_dv9vctk5vdt.js></script><link href=/marketing/static/css/main.29070c0c862710ef45500b32086285f9.css rel=stylesheet></head><body><div id=app><div class=el-loading-spinner style="width: 98%;"><svg viewBox="25 25 50 50" class=circular><circle cx=50 cy=50 r=20 fill=none class=path></circle></svg></div></div><script>(function() {
var src = '/component/static/import-component.js?timestrap=' + new Date().getTime();
var host = window.location.host;
host = host.indexOf('localhost') > -1 || host.indexOf('192.168') > -1 ? 'gicdev.demogic.com' : host;
document.write('<script src="//' + host + src + '"><\/script>');
})();</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/upload-file.1.0.10.js></script><script type=text/javascript src=/marketing/static/js/manifest.8077a838795a958e2d05.js></script><script type=text/javascript src=/marketing/static/js/vendor.24a60bdab11def7b4f96.js></script><script type=text/javascript src=/marketing/static/js/main.94c84f8a07b64ff52367.js></script></body></html>
\ No newline at end of file
})();</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/upload-file.1.0.10.js></script><script type=text/javascript src=/marketing/static/js/manifest.9ce6f95fec53cf7c36b8.js></script><script type=text/javascript src=/marketing/static/js/vendor.24a60bdab11def7b4f96.js></script><script type=text/javascript src=/marketing/static/js/main.94c84f8a07b64ff52367.js></script></body></html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
!function(e){var a=window.webpackJsonp_marketing;window.webpackJsonp_marketing=function(n,c,o){for(var d,f,i,b=0,u=[];b<n.length;b++)f=n[b],r[f]&&u.push(r[f][0]),r[f]=0;for(d in c)Object.prototype.hasOwnProperty.call(c,d)&&(e[d]=c[d]);for(a&&a(n,c,o);u.length;)u.shift()();if(o)for(b=0;b<o.length;b++)i=t(t.s=o[b]);return i};var n={},r={25:0};function t(a){if(n[a])return n[a].exports;var r=n[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,t),r.l=!0,r.exports}t.e=function(e){var a=r[e];if(0===a)return new Promise(function(e){e()});if(a)return a[2];var n=new Promise(function(n,t){a=r[e]=[n,t]});a[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,t.nc&&o.setAttribute("nonce",t.nc),o.src=t.p+"static/js/"+({0:"card",1:"game",2:"wechat",3:"ecm",4:"message",5:"ewash",6:"scan",7:"recharge",8:"activity",9:"signIn",10:"evaluation",11:"cdKey",12:"popup",13:"msg",15:"calllog"}[e]||e)+"."+{0:"6ab3f229c73064b31ad1",1:"5634d7e855866bec6bd3",2:"2d97ab8f38d7e456013e",3:"d611e2e16327e466cc4f",4:"6bc353d1dfc87433c883",5:"396241348d17af8aa0b7",6:"df8dbd15b2d36bdf6aeb",7:"2f25a229ad7917a6f21c",8:"8d9c6b1eac82ed1a52b3",9:"648d4e9bf392d8980030",10:"da8008653f8c25addc3a",11:"f44b4a5a120f0f2cad59",12:"eff813e30bae3fe092c9",13:"195c6ec122547e551194",14:"be5aa3556f1c4057ad85",15:"410d734e15e42bc183a8",16:"91803d84dca88eb2778e",17:"6c7bfbfbe4bbd7a2633a",18:"3ba3b70d72322dd6fc56",19:"20596c2fde39ba8b7da1",20:"5dbfdb8d97c0910fdde0",21:"ad98c8e9d3749f2f1097",22:"e8d1bab23dec9f5b935b"}[e]+".js";var d=setTimeout(f,12e4);function f(){o.onerror=o.onload=null,clearTimeout(d);var a=r[e];0!==a&&(a&&a[1](new Error("Loading chunk "+e+" failed.")),r[e]=void 0)}return o.onerror=o.onload=f,c.appendChild(o),n},t.m=e,t.c=n,t.d=function(e,a,n){t.o(e,a)||Object.defineProperty(e,a,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)},t.p="/marketing/",t.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
!function(e){var a=window.webpackJsonp_marketing;window.webpackJsonp_marketing=function(n,c,d){for(var o,f,i,b=0,u=[];b<n.length;b++)f=n[b],r[f]&&u.push(r[f][0]),r[f]=0;for(o in c)Object.prototype.hasOwnProperty.call(c,o)&&(e[o]=c[o]);for(a&&a(n,c,d);u.length;)u.shift()();if(d)for(b=0;b<d.length;b++)i=t(t.s=d[b]);return i};var n={},r={25:0};function t(a){if(n[a])return n[a].exports;var r=n[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,t),r.l=!0,r.exports}t.e=function(e){var a=r[e];if(0===a)return new Promise(function(e){e()});if(a)return a[2];var n=new Promise(function(n,t){a=r[e]=[n,t]});a[2]=n;var c=document.getElementsByTagName("head")[0],d=document.createElement("script");d.type="text/javascript",d.charset="utf-8",d.async=!0,d.timeout=12e4,t.nc&&d.setAttribute("nonce",t.nc),d.src=t.p+"static/js/"+({0:"card",1:"game",2:"wechat",3:"ecm",4:"message",5:"ewash",6:"scan",7:"recharge",8:"activity",9:"signIn",10:"evaluation",11:"cdKey",12:"popup",13:"msg",15:"calllog"}[e]||e)+"."+{0:"6ab3f229c73064b31ad1",1:"ed2cc7445b282b000db6",2:"2d97ab8f38d7e456013e",3:"d6348547d91ea90b0df6",4:"6bc353d1dfc87433c883",5:"396241348d17af8aa0b7",6:"df8dbd15b2d36bdf6aeb",7:"2f25a229ad7917a6f21c",8:"8d9c6b1eac82ed1a52b3",9:"648d4e9bf392d8980030",10:"da8008653f8c25addc3a",11:"f44b4a5a120f0f2cad59",12:"eff813e30bae3fe092c9",13:"43324dd45b68dd402d28",14:"678030597365cad8149c",15:"410d734e15e42bc183a8",16:"eaee6e452b4f103513af",17:"957809ca70c228b3276b",18:"3ba3b70d72322dd6fc56",19:"8ba3e4166cbd0c8327e5",20:"5dbfdb8d97c0910fdde0",21:"ad98c8e9d3749f2f1097",22:"e8d1bab23dec9f5b935b"}[e]+".js";var o=setTimeout(f,12e4);function f(){d.onerror=d.onload=null,clearTimeout(o);var a=r[e];0!==a&&(a&&a[1](new Error("Loading chunk "+e+" failed.")),r[e]=void 0)}return d.onerror=d.onload=f,c.appendChild(d),n},t.m=e,t.c=n,t.d=function(e,a,n){t.o(e,a)||Object.defineProperty(e,a,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)},t.p="/marketing/",t.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
......@@ -679,7 +679,7 @@ img::after {
white-space: nowrap;
text-overflow: ellipsis;
}
.subTitle {
.mini-sub-title {
width: 100%;
height: 40px;
display: flex;
......
<template>
<div class="member-group-container">
<div class="echo-member-group" v-if="echoFlag">
<div class="subTitle">
<div class="mini-sub-title">
<div class="line"></div>
<div class="text">
<div class="space-between">
......
<template>
<div class="ruleFilter">
<div class="echo-member-group" v-if="echoFlag">
<div class="subTitle">
<div class="mini-sub-title">
<div class="line"></div>
<div class="text">
<div class="space-between">
......
......@@ -187,8 +187,26 @@ export const stopGame = params => requests(PREFIX + '/game-pro/stop-game', param
// 转换成页面链接
export const getPageLink = params => requests('api-admin/get-page-link', params, true, false, 'get');
// 游戏活动分页查询-统计
export const pageStatistics = params => requests(PREFIX + 'game-pro/page-statistics', params, true, false, 'post');
// 活动基础数据-拆盲盒
export const getGameOverview = params => requests(PREFIX + '/game-data/get-game-overview', params, true, false, 'get');
// 游戏活动分页查询-统计
export const pageStatistics = params => requests(PREFIX + 'game-pro/page-statistics', params, true, false, 'post');
// 游戏卡券核销数据-拆盲盒
export const getGameCardWriteOff = params => requests(PREFIX + '/game-data/get-game-card-write-off', params, true, false, 'get');
// 游戏奖品数据-拆盲盒
export const getGamePrize = params => requests(PREFIX + 'game-data/get-game-prize', params, true, false, 'get');
// 游戏活动基础数据明细-拆盲盒
export const getGameDataDetail = params => requests(PREFIX + '/game-data/get-game-detail', params, true, false, 'get');
//游戏活动基础明细导出-拆盲盒
export const exportGameDetail = config.api + PREFIX + '/game-data/export-game-detail';
// 奖品明细-拆盲盒
export const getPrizeDetail = params => requests(PREFIX + '/game-data/get-game-prize-detail', params, true, false, 'get');
//奖品明细导出-拆盲盒
export const exportGamePrizeDetail = config.api + PREFIX + '/game-data/export-game-prize-detail';
......@@ -61,7 +61,7 @@
<script>
import { aiTransformStoreGroupSplit, getActivityDetail, aiStoreTransfer, aiStoreTransferNoBelong, aiStoreTransferStatistics, exportAiStoreTransfer, aiStoreGroupTransfer, aiStoreGroupTransferStatistics, exportAiStoreGroupTransfer } from '@/service/api/aiApi.js';
import TargetGroup from '@/views/ai/ai-data-report/target-group.vue';
import TargetGroup from '@/components/target-group.vue';
import { numFormat } from '@/utils/index.js';
const tableHead = [
......
......@@ -61,7 +61,7 @@
<script>
import { aiOutboundStoreGroupSplit, getActivityDetail, aiStoreOutboundRank, aiStoreOutboundRankNoBelong, aiStoreOutboundStatistics, exportAiStoreOutbound, aiStoreGroupOutboundRank, aiStoreGroupOutboundStatistics, exportAiStoreGroupOutbound } from '@/service/api/aiApi.js';
import TargetGroup from '@/views/ai/ai-data-report/target-group.vue';
import TargetGroup from '@/components/target-group.vue';
import { numFormat } from '@/utils/index.js';
let tableHead = [
......
......@@ -71,7 +71,7 @@ import G2 from '@antv/g2';
import DataSet from '@antv/data-set';
import { numFormat } from '@/utils/index.js';
import { getOutBound, getIntentionLabel, getBillAnalysis, getCallDuration } from '@/service/api/aiApi.js';
import TargetGroup from './target-group.vue';
import TargetGroup from '@/components/target-group.vue';
export default {
name: 'AiData',
......
......@@ -71,7 +71,7 @@
<script>
import { getPlanStatistics, getMemberCrowd, getComparativeData } from '@/service/api/aiApi.js';
import { numFormat } from '@/utils/index.js';
import TargetGroup from './target-group.vue';
import TargetGroup from '@/components/target-group.vue';
export default {
name: 'Conversion',
......
......@@ -7,7 +7,7 @@
<template>
<card-profit-sum :list="list" />
<div class="title" style="margin-top:20px">
<h2 class="subtitle">卡券核销</h2>
<h2 class="mini-sub-title">卡券核销</h2>
<span>卡券核销情况统计通过当前智能营销计划投放的卡券,顾客使用该卡券消费的情况。即使消费时间已经过了收益有效期也会统计在内</span>
</div>
<el-table :data="tableData" v-if="tableData.length > 0" style="margin:20px 0 20px" max-height="710" header-cell-class-name="card-profit-header">
......
......@@ -25,7 +25,7 @@
</el-form-item>
<el-form-item label="抽奖样式">
<div class="lottery">
<div class="tips">图片建议尺寸{{ baseForm.prizeStyleJsonSize0 }}或等比图片,格式 jpg/png/gif,大小 {{ prizeStyleJsonSize1 }}M 以内。</div>
<div class="tips">图片建议尺寸{{ baseForm.prizeStyleJsonSize0 }}或等比图片,格式 jpg/png/gif,大小 {{ baseForm.prizeStyleJsonSize1 }}M 以内。</div>
<div v-for="item in baseForm.prizeStyleJson" :key="item.index">
<div class="imgContent">
<div class="imageOrigin">
......@@ -33,7 +33,7 @@
<div style="display: flex;">
<img :src="item.imageNoSelectUrl" alt="未选中效果" style="width: 120px;height: 120px;" />
<div class="imgBtn">
<el-upload class="avatar-uploader" action="123" :show-file-list="false" :before-upload="file => beforeAvatarUpload(file, 'imageNoSelectUrl', prizeStyleJsonSize1)">
<el-upload class="avatar-uploader" action="123" :show-file-list="false" :before-upload="file => beforeAvatarUpload(file, 'imageNoSelectUrl', baseForm.prizeStyleJsonSize1)">
<el-button type="text">替换</el-button>
</el-upload>
<el-button type="text" @click="replace('imageNoSelectUrl', item.index)">重置</el-button>
......@@ -45,7 +45,7 @@
<div style="display: flex;">
<img :src="item.imageSelectUrl" alt="选中效果" style="width: 120px;height: 120px;" />
<div class="imgBtn">
<el-upload class="avatar-uploader" action="123" :show-file-list="false" :before-upload="file => beforeAvatarUpload(file, 'imageSelectUrl', prizeStyleJsonSize1)">
<el-upload class="avatar-uploader" action="123" :show-file-list="false" :before-upload="file => beforeAvatarUpload(file, 'imageSelectUrl', baseForm.prizeStyleJsonSize1)">
<el-button type="text">替换</el-button>
</el-upload>
<el-button type="text" @click="replace('imageSelectUrl', item.index)">重置</el-button>
......@@ -253,7 +253,7 @@ export default {
},
beforeAvatarUpload(file, key, size1 = 1) {
const arr = ['image/gif', 'image/jpeg', 'image/png'];
const limit = file.size / 1024 / 1024 < 2;
const limit = file.size / 1024 / 1024 < size1;
if (!arr.includes(file.type)) {
this.$message.warning('只能上传jpg/png/gif格式文件!');
return false;
......@@ -332,7 +332,7 @@ export default {
},
handleListen() {
this.isPlay = !this.isPlay;
this.backMusicOptions.forEach(item => {
this.backMusicOptionsComputed.forEach(item => {
if (item.materialValue == this.baseForm.backMusicUrlObj.materialValue) {
music.src = this.baseForm.backMusicUrlObj.materialValue;
this.isPlay ? music.play() : music.pause();
......
......@@ -112,7 +112,7 @@
<div class="shareBox" v-if="form.gameRuleInfo.playConditionFlag == 1">
<div v-for="item in form.gameRuleConditionList" :key="item.conditionType">
<div v-if="item.conditionType == 2" class="shareSection">
<div class="subTitle">
<div class="mini-sub-title">
<div class="line"></div>
<div class="text">
<div class="space-between">
......@@ -123,7 +123,7 @@
<p>{{ item.conditionJson.type == 21 ? '总赠送' : '每日赠送' }}: {{ item.conditionJson.value }}次游戏次数</p>
</div>
<div v-if="item.conditionType == 0" class="shareSection">
<div class="subTitle">
<div class="mini-sub-title">
<div class="line"></div>
<div class="text">
<div class="space-between">
......@@ -135,7 +135,7 @@
<p>提示客户获取积分路径: {{ item.conditionJson.mpUrlView.name }}</p>
</div>
<div v-if="item.conditionType == 1">
<div class="subTitle">
<div class="mini-sub-title">
<div class="line"></div>
<div class="text">
<div class="space-between">
......
......@@ -159,11 +159,11 @@ export default {
const prizeNoticeStockVal = (rule, value, callback) => {
if (this.prizeForm.prizeNoticeFlag == 1) {
if (!new RegExp('([1-9]{1}\\d{0,9})|(0{1})').test(value)) {
callback(new Error('请输入不超过1000000的数字'));
callback(new Error('最大值1000000'));
return;
}
if (value < 0 || value > 1000000) {
callback(new Error('请输入不超过1000000的数字'));
if (value <= 0 || value > 1000000) {
callback(new Error('最大值1000000'));
return;
}
}
......@@ -171,9 +171,9 @@ export default {
};
return {
rules: {
winChance: { type: 'number', required: true, message: '请输入不超过100的数字', max: 100, min: 0 },
prizeNumber: { type: 'number', required: true, message: '请输入不超过1000000的数字', max: 1000000, min: 1 },
prizeStock: { type: 'number', required: true, message: '请输入不超过1000000的数字', max: 1000000, min: 0 },
winChance: { type: 'number', required: true, message: '最大值100', max: 100, min: 0 },
prizeNumber: { type: 'number', required: true, message: '最大值1000000', max: 1000000, min: 1 },
prizeStock: { type: 'number', required: true, message: '最大值1000000', max: 1000000, min: 0 },
prizeNoticeStock: { validator: prizeNoticeStockVal },
prizeName: { type: 'string', required: true, message: '请输入奖品名称' },
prizeType: { required: true, message: '请选择奖品类型' }
......@@ -296,11 +296,11 @@ export default {
return (rule, value, callback) => {
if (row.prizeType == 1) {
if (!new RegExp('([1-9]{1}\\d{0,9})|(0{1})').test(value)) {
callback(new Error('请输入不超过1000000的数字'));
callback(new Error('最大值1000000'));
return;
}
if (value < 0 || value > 1000000) {
callback(new Error('请输入不超过1000000的数字'));
callback(new Error('最大值1000000'));
return;
}
}
......@@ -401,12 +401,11 @@ export default {
item.prizeRate = prizeRate.toFixed(2);
}
});
const rateTotal = this.prizeForm.gamePrizeList.map(item => (item.prizeType != 0 ? item.prizeRate : 0)).reduce((pre, current) => Number(pre) + Number(current));
console.log(rateTotal);
let prizeArr = this.prizeForm.gamePrizeList.filter(item => item.prizeType == 0);
prizeArr.forEach(item => {
console.log(item);
const prizeRate = (100 - rateTotal) / prizeArr.length || 0;
const prizeRate = (100 - this.prizeForm.winChance) / prizeArr.length || 0;
item.prizeRate = prizeRate.toFixed(2);
});
this.prizeForm.gamePrizeList = this.prizeForm.gamePrizeList.splice(0);
......
......@@ -74,7 +74,7 @@
<el-form-item label="关注回复" :prop="'gameRuleConditionList.' + index + '.conditionJson.' + 'subscribeMsg'" label-width="80px" :rules="rules.subscribeMsg"> <el-input maxlength="20" :disabled="isDisabled" show-word-limit v-model="item.conditionJson.subscribeMsg" /> </el-form-item>
</div>
<div>
<div class="subTitle">
<div class="mini-sub-title">
<div class="line"></div>
<div class="text">
<div class="space-between">
......@@ -215,7 +215,7 @@ export default {
rules: {
memberType: { required: true, message: '请选择' },
memberDesc: { type: 'string', required: true, message: '未配置游戏说明', trigger: 'blur' },
memberDesc: { type: 'string', required: true, message: '请输入适用人群说明', trigger: 'blur' },
playTimes: { type: 'number', required: true, message: '请输入不超过1000的数字', max: 1000, min: 1 },
playConditionFlag: { required: true },
mpUrlView: { validator: mpUrlViewVal },
......@@ -350,7 +350,7 @@ export default {
},
beforeAvatarUpload(file, key, size1 = 1) {
const arr = ['image/gif', 'image/jpeg', 'image/png'];
const limit = file.size / 1024 / 1024 < 2;
const limit = file.size / 1024 / 1024 < size1;
if (!arr.includes(file.type)) {
this.$message.warning('只能上传jpg/png/gif格式文件!');
return false;
......
<template>
<section class="dm-wrap" v-loading="loading">
<div class="pt20 pb20 clearfix">
<el-date-picker class="w256" v-model="form.dateTime" value-format="yyyy-MM-dd" @change="refresh" type="daterange" range-separator="~" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
<el-input v-model="form.search" class="w260" placeholder="请输入会员号/手机号/昵称" clearable @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-button icon="iconfont fz14 icon-cp-xiazai" type="primary" class="fr" @click="handleExport" size="small" :disabled="!total"> 查询结果导出</el-button>
</div>
<el-table tooltipEffect="light" :data="tableList" style="width:100%">
<el-table-column label="基本信息" min-width="214" show-overflow-tooltip fixed="left">
<div slot-scope="{ row }" class="member-info">
<img class="member-logo" v-if="row.memberImage" :src="row.memberImage" alt="" />
<svg aria-hidden="true" v-else class="member-logo">
<use xlink:href="#icon-user-default"></use>
</svg>
<div>
<p class="member-name">
<template v-if="row.memberNick">
{{ row.memberNick || '--' }}
</template>
<span class="member-subname" v-if="row.memberName">
{{ row.memberNick ? `(${row.memberName})` : row.memberName }}
</span>
</p>
<p class="member-name" v-if="row.phoneNum">{{ row.phoneNum }}</p>
</div>
</div>
</el-table-column>
<el-table-column label="会员卡号" min-width="130px" prop="cardNum" show-overflow-tooltip :formatter="(row, col, val) => val || '--'"></el-table-column>
<el-table-column label="服务门店" min-width="210" prop="mainStoreName">
<template slot-scope="{ row }">
{{ row.mainStoreName }}
<br />
{{ row.mainStoreCode }}
</template>
</el-table-column>
<el-table-column label="中奖次数" min-width="96" prop="winCnt"></el-table-column>
<el-table-column label="分享次数" min-width="96" prop="shareCnt"></el-table-column>
<el-table-column label="裂变新用户" min-width="112" prop="invitationMemberCnt"></el-table-column>
<el-table-column label="消耗积分" min-width="96" prop="useIntegralCnt"></el-table-column>
<el-table-column min-width="88" prop="isNewMember">
<template slot="header">
新会员
<el-tooltip placement="top" content="用户自身是否通过本次游戏注册成为会员">
<i class="iconfont icon-QuestionCircleOutlined"></i>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="首次参与时间" min-width="114" prop="firstPlayTime" fixed="right">
<template slot-scope="{ row }">
{{ formatDateTimeByType(row.firstPlayTime, 'yyyy-MM-dd') }}
<br />
{{ formatDateTimeByType(row.firstPlayTime, 'HH-mm-ss') }}
</template>
</el-table-column>
</el-table>
<dm-pagination v-show="tableList.length" background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="form.pageNum" :page-sizes="[20, 40, 60, 80]" :page-size="form.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
<vue-gic-export-excel :dialogVisible.sync="dialogVisible" :dataArr="tableList" :type="2" :excelUrl="exportGameDetail" :params="params" projectName="marketing"></vue-gic-export-excel>
</section>
</template>
<script>
import { formatDateTimeByType } from '@/utils/index.js';
import { getGameDataDetail, exportGameDetail } from '@/service/api/gameApi.js';
export default {
data() {
return {
tableList: [],
form: {
pageNum: 1,
pageSize: 20,
gameId: this.$route.params.id,
dateTime: [],
search: ''
},
formatDateTimeByType,
total: 0,
dialogVisible: false,
exportGameDetail,
params: {},
loading: false
};
},
mounted() {
this.getTableList();
},
methods: {
handleExport() {
this.dialogVisible = true;
this.params = {
gameId: this.$route.params.id,
search: this.form.search
};
if (this.form.dateTime && this.form.dateTime.length) {
this.params.startTime = this.form.dateTime[0];
this.params.endTime = this.form.dateTime[1];
}
},
refresh() {
this.form.pageNum = 1;
this.getTableList();
},
handleSizeChange(val) {
this.form.pageSize = val;
this.getTableList();
},
handleCurrentChange(val) {
this.form.pageNum = val;
this.getTableList();
},
getTableList() {
const params = { ...this.form };
this.loading = true;
if (params.dateTime && params.dateTime.length) {
params.startTime = params.dateTime[0];
params.endTime = params.dateTime[1];
}
delete params.dateTime;
getGameDataDetail(params)
.then(res => {
const { result } = res;
this.tableList = result.result;
this.total = result.totalCount;
})
.finally(() => {
this.loading = false;
});
}
}
};
</script>
<style lang="scss" scoped>
.member-info {
display: flex;
justify-content: flex-start;
align-items: center;
.member-logo {
flex-shrink: 0;
margin-right: 10px;
width: 40px;
height: 40px;
border-radius: 40px;
overflow: hidden;
}
.member-name {
font-size: 14px;
font-weight: 400;
color: #303133;
line-height: 20px;
.member-subname {
color: #909399;
}
}
}
</style>
<template>
<section class="dm-wrap" v-loading="loading">
<div class="pt20 pb20 clearfix">
<el-input v-model="form.prizeName" class="w260" placeholder="请输入奖品名称" clearable @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-input v-model="form.search" class="w260" placeholder="请输入姓名/昵称/手机号/会员卡号" clearable @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-date-picker class="w256" v-model="form.dateTime" value-format="yyyy-MM-dd" @change="refresh" type="daterange" range-separator="~" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
<el-select class="w160" v-model="form.prizeType" placeholder="所有游戏状态" @change="refresh" clearable>
<el-option v-for="(v, i) in prizeTypeOptions" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-button icon="iconfont fz14 icon-cp-xiazai" type="primary" class="fr" @click="handleExport" size="small" :disabled="!total"> 查询结果导出</el-button>
</div>
<el-table tooltipEffect="light" :data="tableList" style="width:100%">
<el-table-column label="奖品名称" min-width="204" prop="prizeName" fixed="left" show-overflow-tooltip :formatter="(row, col, val) => val || '--'"></el-table-column>
<el-table-column label="奖品类型" min-width="183" prop="prizeType" :formatter="(row, col, val) => prizeTypeObj[val]"></el-table-column>
<el-table-column label="中奖会员" min-width="214">
<div slot-scope="{ row }" class="member-info">
<img class="member-logo" v-if="row.memberImage" :src="row.memberImage" alt="" />
<svg aria-hidden="true" v-else class="member-logo">
<use xlink:href="#icon-user-default"></use>
</svg>
<div>
<p class="member-name">
<template v-if="row.memberNick">
{{ row.memberNick || '--' }}
</template>
<span class="member-subname" v-if="row.memberName">
{{ row.memberNick ? `(${row.memberName})` : row.memberName }}
</span>
</p>
<p class="member-name" v-if="row.memberMobile">{{ row.memberMobile }}</p>
</div>
</div>
</el-table-column>
<el-table-column label="会员卡号" min-width="184" prop="memberCard" :formatter="(row, col, val) => val || '--'"></el-table-column>
<el-table-column label="兑奖方式" min-width="184" prop="exchangeTypeName" :formatter="(row, col, val) => val || '--'"></el-table-column>
<el-table-column label="中奖时间" min-width="183" prop="prizeTime" fixed="right">
<template slot-scope="{ row }">
{{ formatDateTimeByType(row.prizeTime, 'yyyy-MM-dd') }}
<br />
{{ formatDateTimeByType(row.prizeTime, 'HH-mm-ss') }}
</template>
</el-table-column>
</el-table>
<dm-pagination v-show="tableList.length" background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="form.pageNum" :page-sizes="[20, 40, 60, 80]" :page-size="form.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
<vue-gic-export-excel :dialogVisible.sync="dialogVisible" :dataArr="tableList" :type="2" :excelUrl="exportGamePrizeDetail" :params="params" projectName="marketing"></vue-gic-export-excel>
</section>
</template>
<script>
import { formatDateTimeByType } from '@/utils/index.js';
import { getPrizeDetail, exportGamePrizeDetail } from '@/service/api/gameApi.js';
export default {
data() {
return {
tableList: [],
form: {
prizeName: '',
pageNum: 1,
pageSize: 20,
gameId: this.$route.params.id,
dateTime: [],
search: '',
prizeType: ''
},
prizeTypeOptions: [
{
label: '积分',
value: 1
},
{
label: '卡券',
value: 2
}
],
prizeTypeObj: {
1: '积分',
2: '卡券'
},
formatDateTimeByType,
total: 0,
dialogVisible: false,
exportGamePrizeDetail,
params: {},
loading: false
};
},
mounted() {
this.getTableList();
},
methods: {
handleExport() {
this.dialogVisible = true;
const { search, prizeType, prizeName } = this.form;
this.params = {
gameId: this.$route.params.id,
search,
prizeType,
prizeName
};
if (this.form.dateTime && this.form.dateTime.length) {
this.params.startTime = this.form.dateTime[0];
this.params.endTime = this.form.dateTime[1];
}
},
refresh() {
this.form.pageNum = 1;
this.getTableList();
},
handleSizeChange(val) {
this.form.pageSize = val;
this.getTableList();
},
handleCurrentChange(val) {
this.form.pageNum = val;
this.getTableList();
},
getTableList() {
const params = { ...this.form };
this.loading = true;
if (params.dateTime && params.dateTime.length) {
params.startTime = params.dateTime[0];
params.endTime = params.dateTime[1];
}
delete params.dateTime;
getPrizeDetail(params)
.then(res => {
const { result } = res;
this.tableList = result.result;
this.total = result.totalCount;
})
.finally(() => {
this.loading = false;
});
}
}
};
</script>
<style lang="scss" scoped>
.member-info {
display: flex;
justify-content: flex-start;
align-items: center;
.member-logo {
flex-shrink: 0;
margin-right: 10px;
width: 40px;
height: 40px;
border-radius: 40px;
overflow: hidden;
}
.member-name {
font-size: 14px;
font-weight: 400;
color: #303133;
line-height: 20px;
.member-subname {
color: #909399;
}
}
}
</style>
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