Commit 70148580 by crushh

Merge branch 'feature/游戏营销' into dev

parents 1936ae7b 78af4138
......@@ -7,7 +7,7 @@
</div>
<div class="rightBtn">
<el-button @click="returnNext" v-if="!isInfo">退出</el-button>
<el-button @click="$router.go(-1)" v-else>返回</el-button>
<el-button @click="goBack" v-else>返回</el-button>
<el-button type="primary" @click="submitForm" v-if="isCopy || isEdit">发布并预览</el-button>
</div>
</div>
......@@ -39,7 +39,7 @@
<ruleConfig ref="ruleConfig" :gameStatus="gameStatus" :templateId="templateId" :gameTime="gameTime" :shareImgData="shareImgData" :echoData="ruleForm" v-show="active == 2" @nextStep="nextStep" @prevStep="step => active--" @submit="submitForm" :btnLoading="btnLoading" @change="handleRuleConfigChange" />
</div>
</div>
<info :data="echoData" :invalidCard="invalidCard" v-if="isInfo" />
<info :data="echoData" :invalidCard="invalidCard" v-if="isInfo" ref="info" />
</div>
<links :show.sync="linkShow" :obj="linksObj" gameTypeName="幸运盲盒" :isNew="true" :showFooter="true" :showClose="false">
<el-button @click="editRenew">重新编辑</el-button>
......@@ -239,6 +239,12 @@ export default {
})
.catch(() => {});
},
goBack() {
this.$router.go(-1);
if (this.isInfo) {
this.$refs.info.stopMusic();
}
},
handleMenuSelect(index) {
this.menuActive = index;
},
......@@ -473,6 +479,7 @@ export default {
border-radius: 8px 8px 0px 0px;
margin: 0 20px 0 13px;
position: relative;
overflow-y: auto;
img {
width: 375px;
}
......
......@@ -91,7 +91,11 @@
<div class="section">
<el-descriptions column="3">
<el-descriptions-item label="参与人群">{{ form.gameRuleInfo.memberType == 0 && !form.gameRuleInfo.filterJson ? '全部人群' : '' }} </el-descriptions-item>
<el-descriptions-item label="适用人群说明">{{ form.gameRuleInfo && form.gameRuleInfo.memberDesc }}</el-descriptions-item>
<el-descriptions-item label="适用人群说明" :labelStyle="labelStyle">
<div class="ellips">
{{ form.gameRuleInfo && form.gameRuleInfo.memberDesc }}
</div>
</el-descriptions-item>
</el-descriptions>
<div v-if="form.gameRuleInfo.memberType == 0 && form.gameRuleInfo.filterJson">
<vue-gic-people projectName="marketing" :isAdd="false" :hasSearchData="form.gameRuleInfo.filterJson" :useId="form.memberWeightView.searchId" sceneValue="member" ref="peopleFilter" @editShow="toggleTag = true" @editHide="toggleTag = false" @hideBtn="toggleTag = false" />
......@@ -120,7 +124,7 @@
</div>
</div>
</div>
<p>{{ item.conditionJson.type == 21 ? '总赠送' : '每日赠送' }}: {{ item.conditionJson.value }}次游戏次数</p>
<p>{{ item.conditionJson.type == 21 ? '每日赠送' : '总赠送' }}: {{ item.conditionJson.value }}次游戏次数</p>
</div>
<div v-if="item.conditionType == 0" class="shareSection">
<div class="mini-sub-title">
......@@ -196,11 +200,18 @@ export default {
2: '卡券'
},
isAdd: this.$route.meta.type === 'add',
heightPx: 0
heightPx: 0,
labelStyle: {
minWidth: '88px'
}
};
},
mounted() {
this.heightPx = document.body.clientHeight - 52;
music.addEventListener('ended', () => {
music.currentTime = 0;
this.isPlay = false;
});
},
components: {
gicNewMemberGroup
......@@ -260,7 +271,12 @@ export default {
cancelFilter() {
this.$refs.peopleFilter.cancelSet();
},
stopMusic() {
if (this.isPlay) {
this.isPlay = false;
music.pause();
}
},
calculateRate() {
const prizeNumTotal = this.form.gamePrizeList.map(item => (item.prizeType != 0 ? item.prizeStock : 0)).reduce((pre, current) => pre + current);
this.form.gamePrizeList.forEach(item => {
......@@ -298,6 +314,14 @@ export default {
.invalid {
color: #909399;
}
.ellips {
// overflow: hidden;
// text-overflow: ellipsis;
// display: -webkit-box;
// -webkit-line-clamp: 2;
// /*! autoprefixer: ignore next */
// -webkit-box-orient: vertical;
}
.section {
padding: 20px 0 18px 0;
}
......
......@@ -38,8 +38,8 @@
<div class="flex mb10"><el-checkbox v-model="item.conditionType" :true-label="2" :false-label="-1" :disabled="isDisabled" /> <span class="ml10">赠与免费游戏次数</span></div>
<el-form-item :prop="'gameRuleConditionList.' + index + '.' + 'value'" v-show="item.conditionType == 2">
<el-select class="w140" v-model="item.conditionJson.type" :disabled="isDisabled">
<el-option :value="21" label="总赠送"></el-option>
<el-option :value="22" label="每日赠送"></el-option>
<el-option :value="22" label="总赠送"></el-option>
<el-option :value="21" label="每日赠送"></el-option>
</el-select>
<el-input-number class="w140" :disabled="isDisabled" placeholder="请输入次数" v-model="item.conditionJson.value" :min="1" :max="1000000" controls-position="right" />
<span class="ml10">次游戏次数</span>
......
<template>
<section class="dm-wrap" v-loading="loading">
<div class="pt20 pb20 clearfix">
<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-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">
<el-table-column label="基本信息" min-width="214" 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">
......@@ -28,16 +28,16 @@
<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 }}
{{ row.mainStoreName || '--' }}
<br />
{{ row.mainStoreCode }}
{{ 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">
<el-table-column label="中奖次数" min-width="96" prop="winCnt" :formatter="(row, col, val) => val || '--'"></el-table-column>
<el-table-column label="分享次数" min-width="96" prop="shareCnt" :formatter="(row, col, val) => val || '--'"></el-table-column>
<el-table-column label="裂变新用户" min-width="112" prop="invitationMemberCnt" :formatter="(row, col, val) => val || '--'"></el-table-column>
<el-table-column label="消耗积分" min-width="96" prop="useIntegralCnt" :formatter="(row, col, val) => val || '--'"></el-table-column>
<el-table-column min-width="88" prop="isNewMember" :formatter="(row, col, val) => val || '--'">
<template slot="header">
新会员
<el-tooltip placement="top" content="用户自身是否通过本次游戏注册成为会员">
......@@ -47,9 +47,9 @@
</el-table-column>
<el-table-column label="首次参与时间" min-width="114" prop="firstPlayTime" fixed="right">
<template slot-scope="{ row }">
{{ formatDateTimeByType(row.firstPlayTime, 'yyyy-MM-dd') }}
{{ formatDateTimeByType(row.firstPlayTime, 'yyyy-MM-dd') || '--' }}
<br />
{{ formatDateTimeByType(row.firstPlayTime, 'HH-mm-ss') }}
{{ formatDateTimeByType(row.firstPlayTime, 'HH-mm-ss') || '--' }}
</template>
</el-table-column>
</el-table>
......
......@@ -4,7 +4,7 @@
<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-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>
......@@ -35,9 +35,9 @@
<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') }}
{{ formatDateTimeByType(row.prizeTime, 'yyyy-MM-dd') || '--' }}
<br />
{{ formatDateTimeByType(row.prizeTime, 'HH-mm-ss') }}
{{ formatDateTimeByType(row.prizeTime, 'HH-mm-ss') || '--' }}
</template>
</el-table-column>
</el-table>
......
......@@ -24,28 +24,36 @@
</el-col>
</el-row>
</div>
<div class="report-module">
<div class="report-module" v-if="isCard">
<dm-sub-title>
卡券核销
</dm-sub-title>
<el-row :gutter="20">
<el-row :gutter="20" class="flex">
<el-col :span="6" v-for="(el, index) in cardData" :key="index">
<target-group :data-list="el"></target-group>
</el-col>
</el-row>
</div>
<div class="report-module">
<dm-sub-title title-align="space-between">
<dm-sub-title title-align="space-between" class="mb20">
<div>
奖品数据
<el-button class="check-detail" @click="toDetailPage(2)">查看详情</el-button>
</div>
</dm-sub-title>
<el-radio-group class="customize mt20 mb20" v-model="dimension" @change="radioChange">
<el-radio-group class="customize" v-model="dimension" @change="radioChange" v-if="isCard">
<el-radio-button label="1" value="1">卡券</el-radio-button>
<el-radio-button label="2" value="2">积分</el-radio-button>
</el-radio-group>
<el-table :data="prizeList" style="width:100%" :key="dimension">
<el-table :data="prizeList" style="width:100%" :span-method="objectSpanMethod" v-if="dimension == '1'" class="mt20">
<el-table-column v-for="v in tableHeader" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="v.prop" :prop="v.prop" :label="v.label" :formatter="v.formatter" :sortable="v.sortable" :fixed="v.fixed">
<template slot-scope="scope">
<span v-if="v.formatter" v-html="v.formatter(scope.row)"></span>
<span v-else>{{ scope.row[v.prop] }}</span>
</template>
</el-table-column>
</el-table>
<el-table :data="prizeList" style="width:100%" v-else class="mt20">
<el-table-column v-for="v in tableHeader" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="v.prop" :prop="v.prop" :label="v.label" :formatter="v.formatter" :sortable="v.sortable" :fixed="v.fixed">
<template slot-scope="scope">
<span v-if="v.formatter" v-html="v.formatter(scope.row)"></span>
......@@ -75,7 +83,7 @@ const tableHead = [
prop: 'prizeTotalStock',
minWidth: '88',
formatter: function(row) {
return `<span>${row.prizeTotalStock ? row.prizeTotalStock.toLocaleString() : '- -'}</span>`;
return `<span>${numFormat(row.prizeTotalStock)}</span>`;
}
},
{
......@@ -83,7 +91,7 @@ const tableHead = [
prop: 'prizeWinningMNum',
minWidth: '116',
formatter: function(row) {
return `<span>${row.prizeWinningMNum ? row.prizeWinningMNum.toLocaleString() : '- -'}</span>`;
return `<span>${numFormat(row.prizeWinningMNum)}</span>`;
}
},
{
......@@ -99,7 +107,7 @@ const tableHead = [
prop: 'receivedMNum',
minWidth: '100',
formatter: function(row) {
return `<span>${row.receivedMNum ? row.receivedMNum.toLocaleString() : '- -'}</span>`;
return `<span>${numFormat(row.receivedMNum)}</span>`;
}
},
{
......@@ -107,7 +115,7 @@ const tableHead = [
prop: 'writeOffNum',
minWidth: '120',
formatter: function(row) {
return `<span>${row.writeOffNum ? row.writeOffNum.toLocaleString() : '- -'}</span>`;
return `<span>${numFormat(row.writeOffNum)}</span>`;
}
},
{
......@@ -115,7 +123,7 @@ const tableHead = [
prop: 'writeOffMNum',
minWidth: '120',
formatter: function(row) {
return `<span>${row.writeOffMNum ? row.writeOffMNum.toLocaleString() : '- -'}</span>`;
return `<span>${numFormat(row.writeOffMNum)}</span>`;
}
},
{
......@@ -123,7 +131,7 @@ const tableHead = [
prop: 'writeOffRate',
minWidth: '100',
formatter: function(row) {
return `<span>${!isNaN(row.writeOffRate) ? row.writeOffRate + '%' : '- -'}</span>`;
return `<span>${typeof row.writeOffRate == 'number' ? row.writeOffRate + '%' : '- -'}</span>`;
}
},
{
......@@ -131,7 +139,7 @@ const tableHead = [
prop: 'perCustomerTransaction',
minWidth: '100',
formatter: function(row) {
return `<span>${row.perCustomerTransaction ? row.perCustomerTransaction.toLocaleString() : '- -'}</span>`;
return `<span>${numFormat(row.perCustomerTransaction)}</span>`;
}
},
{
......@@ -140,8 +148,7 @@ const tableHead = [
minWidth: '100',
formatter: function(row) {
return `<span>${row.jointRate ? row.jointRate : '- -'}</span>`;
},
fixed: 'right'
}
}
];
const pointHead = [
......@@ -322,18 +329,33 @@ export default {
cardData: [],
prizeList: [],
tableHeader: [],
gameId: this.$route.params.id
gameId: this.$route.params.id,
isShare: false, // 有门槛且配置了分享
isPoint: false, // 有门槛且配置了消耗积分
isCard: false //奖品配置了卡券
};
},
mounted() {
const gameId = this.$route.params.id;
this.getGameOverview(gameId);
this.getGameCardWriteOff(gameId);
this.getGameDetail(gameId);
this.getGamePrize(1);
},
computed: {},
methods: {
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if ([5, 6, 7, 8, 9].includes(columnIndex)) {
if (row.row) {
return {
rowspan: row.row,
colspan: 1
};
} else {
return {
rowspan: 0,
colspan: 0
};
}
}
},
toDetailPage(type) {
console.log(type);
if (type == 1) {
......@@ -343,7 +365,6 @@ export default {
}
},
radioChange(data) {
console.log(data);
this.getGamePrize(data);
},
getGameOverview(gameId) {
......@@ -361,24 +382,59 @@ export default {
getGameDetail(gameId) {
getGameDetail({ gameId }).then(res => {
const {
result: { startDate, endDate, gameName, status }
result: {
startDate,
endDate,
gameName,
status,
gameRuleConditionList,
gamePrizeList,
gameRuleInfo: { playConditionFlag }
}
} = res;
if (playConditionFlag == 1) {
gameRuleConditionList.map(item => item.conditionType).includes(1) ? (this.isShare = true) : '';
gameRuleConditionList.map(item => item.conditionType).includes(0) ? (this.isPoint = true) : '';
}
let startDateStr = formatDateTimeByType(startDate, 'yyyy-MM-dd');
let endDateStr = formatDateTimeByType(endDate, 'yyyy-MM-dd');
let gameTimeStr = startDateStr + ' 至 ' + endDateStr;
this.baseData = { gameTimeStr, gameName, status };
this.getGameOverview(gameId); // 活动基础数据
if (gamePrizeList.map(item => item.prizeType).includes(2)) {
this.isCard = true;
this.getGameCardWriteOff(gameId); // 卡券核销数据
this.getGamePrize(1);
} else {
this.getGamePrize(2);
}
});
},
getGamePrize(prizeType) {
getGamePrize({ gameId: this.$route.params.id, prizeType }).then(res => {
const { result } = res;
this.prizeList = result;
prizeType == 1 ? this.handleList() : '';
});
if (prizeType == 1) {
this.tableHeader = tableHead;
} else {
this.tableHeader = pointHead;
}
getGamePrize({ gameId: this.$route.params.id, prizeType }).then(res => {
const { result } = res;
this.prizeList = result;
},
handleList() {
let obj = {};
this.prizeList.forEach(item => {
if (obj[item.cardId]) {
obj[item.cardId].push(item);
} else {
obj[item.cardId] = [item];
}
});
Object.values(obj).forEach(arr => {
arr[0].row = obj[arr[0].cardId].length;
});
this.prizeList = Object.values(obj).flat();
},
handleData(data, obj) {
return data
......@@ -409,10 +465,13 @@ export default {
item.value = !isNaN(value) ? value + '%' : '- -';
break;
}
if (['shareCnt', 'openCardCnt'].includes(item.key)) {
return this.isShare;
}
if (['integralUseCnt'].includes(item.key)) {
return this.isPoint;
}
return true;
// 活动不发送挂机短信时,数据指标不展示短信发送总数和发送成功数的字段
// 活动未开启活动分析时,数据指标展示活动费用
// return !((this.aiDataShow.smsFlag == 0 && item.key == 'sentMessagesNumber') || (this.aiDataShow.smsFlag == 0 && item.key == 'sentSuccessfullyNumber') || (this.aiDataShow.analyseFlag != 0 && item.key == 'activityCost'));
});
})
.filter(el => el.length > 0);
......@@ -448,4 +507,8 @@ export default {
}
}
}
.flex {
display: flex;
flex-wrap: wrap;
}
</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