Commit a7a2e907 by crushh

Merge branch 'bugfix/ai营销新建' into feature/游戏营销

parents 519ea4e8 ee31b38b
<!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/fonts/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link rel=stylesheet href=//at.alicdn.com/t/font_3229694_vfjtu9hqyrc.css><script src=//at.alicdn.com/t/font_3229694_vfjtu9hqyrc.js></script><link rel=stylesheet href=//at.alicdn.com/t/font_2996579_875h3lycepk.css><script src=//at.alicdn.com/t/font_2996579_875h3lycepk.js></script><link src=//at.alicdn.com/t/font_2859043_udehp133w1.css><script src=//at.alicdn.com/t/font_2859043_udehp133w1.js></script><link href=/marketing/static/css/main.3da5750ee94996dc98076b88301bab9c.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/fonts/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link rel=stylesheet href=//at.alicdn.com/t/font_3229694_vfjtu9hqyrc.css><script src=//at.alicdn.com/t/font_3229694_vfjtu9hqyrc.js></script><link rel=stylesheet href=//at.alicdn.com/t/font_2996579_875h3lycepk.css><script src=//at.alicdn.com/t/font_2996579_875h3lycepk.js></script><link src=//at.alicdn.com/t/font_2859043_udehp133w1.css><script src=//at.alicdn.com/t/font_2859043_udehp133w1.js></script><link href=/marketing/static/css/main.e1cd9bb332b95bd4cddf835b1b870069.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 src=//web-1251519181.file.myqcloud.com/components/steps.1.0.1.js></script><script type=text/javascript src=/marketing/static/js/manifest.efb0c2039003c97a1315.js></script><script type=text/javascript src=/marketing/static/js/vendor.01ae7be260c6c1f9c444.js></script><script type=text/javascript src=/marketing/static/js/main.4dccabaf92d8c06900e8.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 src=//web-1251519181.file.myqcloud.com/components/steps.1.0.1.js></script><script type=text/javascript src=/marketing/static/js/manifest.ab795f4fe44e62f9ddf4.js></script><script type=text/javascript src=/marketing/static/js/vendor.01ae7be260c6c1f9c444.js></script><script type=text/javascript src=/marketing/static/js/main.79ffc5c68fa674ba3326.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.
This source diff could not be displayed because it is too large. You can view the blob instead.
!function(e){var a=window.webpackJsonp;window.webpackJsonp=function(c,t,o){for(var f,i,u,d=0,s=[];d<c.length;d++)i=c[d],n[i]&&s.push(n[i][0]),n[i]=0;for(f in t)Object.prototype.hasOwnProperty.call(t,f)&&(e[f]=t[f]);for(a&&a(c,t,o);s.length;)s.shift()();if(o)for(d=0;d<o.length;d++)u=r(r.s=o[d]);return u};var c={},n={24:0};function r(a){if(c[a])return c[a].exports;var n=c[a]={i:a,l:!1,exports:{}};return e[a].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.e=function(e){var a=n[e];if(0===a)return new Promise(function(e){e()});if(a)return a[2];var c=new Promise(function(c,r){a=n[e]=[c,r]});a[2]=c;var t=document.getElementsByTagName("head")[0],o=document.createElement("script");o.type="text/javascript",o.charset="utf-8",o.async=!0,o.timeout=12e4,r.nc&&o.setAttribute("nonce",r.nc),o.src=r.p+"static/js/"+({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:"a467af8521c16ff3511f",1:"2909f5d6a9500f300515",2:"d8053211a1062cf0e580",3:"27fab029666e7e8a83f8",4:"6b37c233dee7f9d4cd99",5:"2c5c855f135584b92995",6:"118cffd4fc4aec6165ca",7:"1870a11c1c7a62882285",8:"2e260bf5fbda1c669e63",9:"fe11d8b6fea8a8e19249",10:"aad29bee8fefe6738f4a",11:"304a7d1a27e59df2a676",12:"c0f00296722b2252e8de",13:"fcdcee9f6a8e702a7712",14:"153347c8edbf88c4018a",15:"1b70e4a5b86af7a9c7c2",16:"c068aec69725dab8687c",17:"c6caec60e9035b136c02",18:"cba6d1e72fada0526c41",19:"33a19eb0bb9415568c66",20:"66d6821411e0e42afe9e",21:"3b70c426e7cb5384d238"}[e]+".js";var f=setTimeout(i,12e4);function i(){o.onerror=o.onload=null,clearTimeout(f);var a=n[e];0!==a&&(a&&a[1](new Error("Loading chunk "+e+" failed.")),n[e]=void 0)}return o.onerror=o.onload=i,t.appendChild(o),c},r.m=e,r.c=c,r.d=function(e,a,c){r.o(e,a)||Object.defineProperty(e,a,{configurable:!1,enumerable:!0,get:c})},r.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(a,"a",a),a},r.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)},r.p="/marketing/",r.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
!function(e){var a=window.webpackJsonp;window.webpackJsonp=function(c,t,o){for(var f,d,i,u=0,b=[];u<c.length;u++)d=c[u],n[d]&&b.push(n[d][0]),n[d]=0;for(f in t)Object.prototype.hasOwnProperty.call(t,f)&&(e[f]=t[f]);for(a&&a(c,t,o);b.length;)b.shift()();if(o)for(u=0;u<o.length;u++)i=r(r.s=o[u]);return i};var c={},n={24:0};function r(a){if(c[a])return c[a].exports;var n=c[a]={i:a,l:!1,exports:{}};return e[a].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.e=function(e){var a=n[e];if(0===a)return new Promise(function(e){e()});if(a)return a[2];var c=new Promise(function(c,r){a=n[e]=[c,r]});a[2]=c;var t=document.getElementsByTagName("head")[0],o=document.createElement("script");o.type="text/javascript",o.charset="utf-8",o.async=!0,o.timeout=12e4,r.nc&&o.setAttribute("nonce",r.nc),o.src=r.p+"static/js/"+({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:"7b46799dd258d64c7e30",1:"4a6dbb54114aee1fb8ca",2:"ee6278d7e763a2ab09fb",3:"803ecdf7a24f724e9ac4",4:"35bc0efec884d91a3228",5:"dd66a6012402ab8d374f",6:"07dc9e5c250197df1227",7:"1870a11c1c7a62882285",8:"388da8ce361aad466b33",9:"fe11d8b6fea8a8e19249",10:"6750cbc0a759ff4c6458",11:"204e0fccedfb8f4e13ed",12:"c07b935c5715b7ff6f33",13:"fcdcee9f6a8e702a7712",14:"5debf748131b39a7f537",15:"cf0b09aa556f363809e3",16:"bb4c33d6f94538518abd",17:"999edb3a6cc81e2c3796",18:"cba6d1e72fada0526c41",19:"33a19eb0bb9415568c66",20:"66d6821411e0e42afe9e",21:"3b70c426e7cb5384d238"}[e]+".js";var f=setTimeout(d,12e4);function d(){o.onerror=o.onload=null,clearTimeout(f);var a=n[e];0!==a&&(a&&a[1](new Error("Loading chunk "+e+" failed.")),n[e]=void 0)}return o.onerror=o.onload=d,t.appendChild(o),c},r.m=e,r.c=c,r.d=function(e,a,c){r.o(e,a)||Object.defineProperty(e,a,{configurable:!1,enumerable:!0,get:c})},r.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(a,"a",a),a},r.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)},r.p="/marketing/",r.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.
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.
......@@ -22,17 +22,18 @@
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="覆盖人群" prop="memberCount" />
<el-table-column label="最近更新时间" v-if="activeName != 2" min-width="120px" prop="latestUpdateTime">
<template slot-scope="scope">
<p class="h-18">{{ scope.row.latestUpdateTime | formatTimeYMD }}</p>
<p class="h-18">{{ scope.row.latestUpdateTime | formatTimeHMS }}</p>
</template>
</el-table-column>
<el-table-column label="到期时间" v-if="activeName != 2" min-width="120px" prop="recentUpdateDate">
<template slot-scope="scope">
<p class="h-18">{{ scope.row.recentUpdateDate | formatTimeYMD }}</p>
<p class="h-18">{{ scope.row.recentUpdateDate | formatTimeHMS }}</p>
<el-table-column label="到期时间" v-if="activeName != 2" min-width="120px">
<template slot-scope="{ row }">
<p class="h-18" v-if="!row.isRealTime">{{ row.effectiveDate | formatTimeYMD }}</p>
<p class="h-18" v-else>--</p>
<p class="h-18" v-if="!row.isRealTime">{{ row.effectiveDate | formatTimeHMS }}</p>
<p class="h-18" v-else>--</p>
</template>
</el-table-column>
</el-table>
......@@ -164,7 +165,7 @@ export default {
this.loading = true;
this.tableData = [];
this.totalCount = 0;
let url = `${this.baseUrl}/gic-member-tag-web/member-tag-group/findList.json?requestProject=${this.projectName}&fixedType=${this.fixedType}&creatorId=${this.creatorId}&pageSize=${this.pageSize}&pageNum=${this.currentPage}&groupName=${this.dataSearch}&effectiveStatus=1`;
let url = `${this.baseUrl}/gic-member-tag-web/member-tag-group/findList.json?requestProject=${this.projectName}&fixedType=${this.fixedType}&creatorId=${this.creatorId}&pageSize=${this.pageSize}&pageNum=${this.currentPage}&groupName=${this.dataSearch}&effectiveStatus=1&permissionType=1`;
if (this.activeName == '2') {
url = `${this.baseUrl}/gic-member-tag-web/memberTagGrade/gradeGroupListV2?requestProject=${this.projectName}&pageSize=${this.pageSize}&pageNum=${this.currentPage}&groupName=${this.dataSearch}`;
}
......
......@@ -4,6 +4,7 @@
<p class="dm-imgtext__tip-item">此处是同步【微信公众平台-草稿箱】中的图文类型草稿,点击“检查同步”可获取最新的草稿和草稿状态;</p>
<p class="dm-imgtext__tip-item">若在微信公众后台对草稿有进行相关操作,请在此处“检查同步”以获取最新结果;</p>
<p class="dm-imgtext__tip-item">在此处对草稿进行“修改”/“发布”/“删除”操作,结果都会同步至微信公众平台对应的草稿上。</p>
<p class="dm-imgtext__tip-item">通过GIC后台发布图文信息,最终IP地址会展示GIC的IP地址。</p>
</div>
<div class="dm-imgtext_head" :class="pbSize">
<div>
......
<template>
<div>
<el-input style="width:180px;" v-model="query.searchParam" prefix-icon="el-icon-search" placeholder="请输入游戏名称" @change="onSearch" clearable></el-input>
<el-table style="margin-top:20px" :data="list" @row-click="onRowClick">
<el-table-column width="50px">
<template slot-scope="scope">
<el-radio :value="seletedId" :label="scope.row.gameId">&nbsp;</el-radio>
</template>
</el-table-column>
<el-table-column show-overflow-tooltip label="游戏名称" prop="gameName"></el-table-column>
<el-table-column show-overflow-tooltip label="游戏ID" prop="gameId"></el-table-column>
<el-table-column label="游戏状态">
<template slot-scope="scope">
<template v-if="'gameStatusName' in scope.row">
<div v-if="scope.row.gameStatusName === '进行中'"><span class="dm-status--primary--flash"></span>{{scope.row.gameStatusName}}</div>
<div v-else :class="scope.row.gameStatusName === '未开始' ? 'dm-status--warning' : 'dm-status--info'">{{scope.row.gameStatusName}}</div>
</template>
<template v-else-if="'activityStatus' in scope.row">
<div v-if="scope.row.activityStatus === 1"><span class="dm-status--primary--flash"></span>进行中</div>
<div v-else :class="scope.row.activityStatus === 0 ? 'dm-status--warning' : 'dm-status--info'">
{{scope.row.activityStatus === 0 ? '未开始' : '已结束'}}
</div>
</template>
</template>
</el-table-column>
<el-table-column label="开始时间">
<div slot-scope="scope" style="line-height: normal">
<p>{{ formatDateTimeByType(scope.row.gameStartTime, 'yyyy-MM-dd-HH-mm-ss', true).y }}</p>
<p>{{ formatDateTimeByType(scope.row.gameStartTime, 'yyyy-MM-dd-HH-mm-ss', true).h }}</p>
</div>
</el-table-column>
<el-table-column label="结束时间">
<div slot-scope="scope" style="line-height: normal">
<p>{{ formatDateTimeByType(scope.row.gameEndTime, 'yyyy-MM-dd-HH-mm-ss', true).y }}</p>
<p>{{ formatDateTimeByType(scope.row.gameEndTime, 'yyyy-MM-dd-HH-mm-ss', true).h }}</p>
</div>
</el-table-column>
</el-table>
<el-pagination
style="margin-top:10px;text-align:right"
small
layout="prev, pager, next"
:current-page="query.currentPage"
:page-size="query.pageSize"
:total="total"
@current-change="onPageChange">
</el-pagination>
</div>
</template>
<script>
import qs from 'qs';
import { formatDateTimeByType } from '@/utils/index.js';
export default {
name: 'GamelinkList',
props: {
gameType: {
required: true,
type: String
},
gameId: {
type: String
}
},
data() {
return {
list: [],
query: {
requestProject: 'gic-web',
searchParam: '',
currentPage: 1,
pageSize: 6,
gameStatus: 4
},
seletedItem: null,
seletedId: '',
total: 0
}
},
created() {
this.seletedId = this.gameId || '';
},
methods: {
formatDateTimeByType,
onPageChange(val) {
this.query.currentPage = val;
this.getList(this.gameType);
this.seletedItem = null;
this.seletedId = '';
},
onRowClick(row) {
this.seletedItem = row;
this.seletedId = row.gameId;
},
onSearch() {
this.query.currentPage = 1;
this.seletedItem = null;
this.seletedId = '';
this.getList(this.gameType);
},
getList(gameType) {
const setResponse = (res, type) => {
//type 0 大转盘/刮刮卡 ----- 1 其他游戏
const { errorCode, message, result } = res.data || {}
if (errorCode != 0) {
return this.$message.error(message)
} else {
if (type === 0) {
this.list = result.page.result || [];
this.total = result.page.totalCount || 0;
} else {
this.list = (result.result || []).map(item => ({...item, gameId: item.gameActivityId}));
this.total = result.totalCount || 0;
}
}
}
switch(gameType) {
case 'GAME_LINK_DZP':
this.axios.post(`/api-marketing/page-lottery-game`, qs.stringify({ ...this.query, gameType: 1})).then(res => {
setResponse(res, 0);
})
break;
case 'GAME_LINK_GGK':
this.axios.post(`/api-marketing/page-lottery-game`, qs.stringify({ ...this.query, gameType: 2})).then(res => {
setResponse(res, 0);
})
break;
case 'GAME_LINK_PTYX':
this.axios.post(`/api-marketing/page-puzzle-game`, qs.stringify({ ...this.query })).then(res => {
setResponse(res, 1);
})
break;
case 'GAME_LINK_ZNM':
this.axios.post(`/api-marketing/page-znm-game`, qs.stringify({ ...this.query })).then(res => {
setResponse(res, 1);
})
break;
case 'GAME_LINK_KLFL':
this.axios.post(`/api-marketing/page-klfl-game`, qs.stringify({ ...this.query })).then(res => {
setResponse(res, 1);
})
break;
}
}
},
watch: {
gameType: {
handler() {
this.query.currentPage = 1;;
this.query.searchParam = '';
this.getList(this.gameType);
},
immediate: true
},
gameId() {
this.seletedId = this.gameId || '';
}
}
}
</script>
......@@ -58,7 +58,7 @@ components: {linkId
<!-- 滚动加载更多 -->
<!-- 二级下拉 -->
<el-select v-model="twoLevelValue" v-loadmore="getMore" class="w200" placeholder="请选择" v-if="twoLevelVisible" @change="twoLevelValueChange">
<el-select v-model="twoLevelValue" class="w200" placeholder="请选择" v-if="twoLevelVisible" @change="twoLevelValueChange">
<el-option
v-for="item in twoLevelOptions"
:key="item.value"
......@@ -407,6 +407,8 @@ components: {linkId
<gift-list :pname="pname" :gift-id="cardUrl" @pass-gift="handlePaddGift"></gift-list>
</div>
</div>
<div style="height:1px;background:#e7e7eb;left:0;right:0;margin:20px -20px"></div>
<game-list ref="gameList" v-if="gameLinkVisible" :game-id="gameProps.gameId" :game-type="gameProps.gameType"></game-list>
<!-- 回跳页面 -->
<div class="links-types" style="margin:20px 0" v-if="linksType != 50 && twoLevelValue == 13">
......@@ -433,6 +435,7 @@ components: {linkId
// 使用树形插件
// import the component
import Treeselect from '@riophae/vue-treeselect';
import GameList from './game-list.vue';
import CardList from './card-list';
import GiftList from './gift-list';
import GoodsTree from './goods-tree';
......@@ -454,6 +457,10 @@ export default {
rewriteData: {},
treeData: [],
goodsTreeVisible: false,
gameProps: {
gameId: '',
gameType: ''
},
cardUrl: '',
// 项目名
cardLimit: 1,
......@@ -949,6 +956,10 @@ export default {
this.threeLeveloneVisible = true;
this.goodsTreeVisible = false;
}
if(e !== 'GAME_LINK') {
this.gameProps.gameType = '';
this.gameProps.gameId = '';
}
var that = this
this.goodsLinksVisible = false;
......@@ -1285,6 +1296,14 @@ export default {
// threeSingleValueChange
threeSingleValueChange(e) {
if(e.startsWith('GAME_LINK')) {
this.$nextTick(() => {
this.gameProps.gameType = e;
})
this.gameProps.gameId = ''
this.selectLinkObj.id = e;
return
}
// 是那个类型的
if (this.linkId == 16) {
this.pageId = e;
......@@ -1332,7 +1351,8 @@ export default {
const para = {
pageType: 1,
status: 1,
pageSize: 50,
pageSize: 9999,
sortType: 2,
currentPage: this.definePageCurrent,
requestProject: this.repProjectName
}
......@@ -1850,6 +1870,30 @@ export default {
this.transData();
return;
}
if (this.twoLevelValue == 'GAME_LINK') {
if (this.$refs.gameList && this.$refs.gameList.seletedItem) {
const selectedGame = this.$refs.gameList.seletedItem
this.selectLinkObj.gameId = selectedGame.gameId;
this.selectLinkObj.name = selectedGame.gameName;
let url = selectedGame.gameUrl
// const reg = /(?<=(redirect_uri=)).+(?=(&response_type=))/
const index1 = url.indexOf('redirect_uri=')
const index2 = url.indexOf('&response_type=')
this.selectLinkObj.url = decodeURIComponent(url.slice(index1 + ('redirect_uri=').length, index2))
this.transData()
} else if(this.gameProps.gameId) {
this.selectLinkObj.gameId = this.linkData.gameId;
this.selectLinkObj.name = this.linkData.name;
this.selectLinkObj.url = this.linkData.url
this.transData()
} else {
this.$message.warning({
duration: 1000,
message: "请选择游戏"
});
}
return
}
}
if (this.linkId == 16) {
......@@ -1969,6 +2013,10 @@ export default {
that.twoLevelValue = ''; // 清空所有选择的
that.twoLevelSelectValue = '';
that.threeLevelValue = ''; // 清空所有选择的
that.gameProps = {
gameType: '',
gameId: ''
}
// h5新增部分
that.dynamicRow = {
......@@ -2107,7 +2155,7 @@ export default {
// return false;
// }
// 如果是单选下拉
if (twoType == 0) {
if (twoType == 0 || twoType == 5) {
result.forEach(function(ele,index){
ele.id = ele.linkId;
ele.label = ele.name;
......@@ -2123,6 +2171,9 @@ export default {
this.rewriteData.threeLevelValue = '';
this.threeSingleValueChange(this.threeLevelValue);
}
if(this.linkData.gameId) {
this.gameProps.gameId = this.linkData.gameId;
}
}
return;
......@@ -2352,6 +2403,12 @@ export default {
}
},
computed: {
gameLinkVisible() {
return this.threeLevelValue.startsWith('GAME_LINK')
}
},
mounted(){
this.repProjectName = this.projectName || 'gic-web';
// 获取 showType
......@@ -2362,6 +2419,7 @@ export default {
components: {
Treeselect,
GameList,
CardList,
GiftList,
GoodsTree,
......
......@@ -10,6 +10,7 @@ export default {
this.getTableList();
},
handleSizeChange(val) {
this.listParams.currentPage = 1;
this.listParams.pageSize = val;
this.getTableList();
},
......
......@@ -59,8 +59,20 @@ export default {
{
path: 'refund',
name: '退券记录',
component: () => import(/* webpackChunkName: "card" */ '../../views/card/refund.vue'),
meta: {}
},
{
path: 'refund-list',
name: '退券记录',
component: () => import(/* webpackChunkName: "card" */ '../../views/card/refund-list.vue'),
meta: {}
},
{
path: 'recycle-record-detail',
name: '卡券积分回收明细',
component: () => import(/* webpackChunkName: "card" */ '../../views/card/recycle-record-detail.vue'),
meta: {}
}
]
},
......
......@@ -167,3 +167,15 @@ export const downloadDestroyCodeTemplate = config.api + PREFIX + 'download-destr
//是否显示卡券当月有效期
export const getCardEffectiveMode = params => requests(PREFIX + '/get-card-effective-mode', params);
//退单卡券积分列表
export const listConsumeRefundPage = params => requests(PREFIX + '/list-consume-refund-page', params);
//退单卡券积分列表导出
export const ecmConsumeCouponExcel = config.api + PREFIX + 'ecm-consume-coupon-excel';
//退单卡券积分列表详情
export const listConsumeCouponDetail = params => requests(PREFIX + '/list-consume-coupon-detail', params);
//是否是奥莱
export const isAolai = params => requests(PREFIX + '/is-aolai', params);
......@@ -710,14 +710,34 @@ export default {
}).then(() => {
this.submit(data);
});
} else {
this.$confirm(`本次外呼费用预计需要消费 ${totalCount}元,当前账户余额不足,请充值`, '提示', {
return;
}
if (totalCount > this.money && this.money > 0) {
this.$confirm(`本次外呼费用预计需要消费 ${totalCount} 元,当前账户余额为${this.money}元可能会存在部分客户拨打失败,是否继续创建活动?`, '提示', {
confirmButtonText: '去充值',
cancelButtonText: '继续保存',
type: 'warning',
distinguishCancelAndClose: true
})
.then(() => {
window.open(`${window.location.origin}/marketing/#/recharge/do`, '_blank');
})
.catch(action => {
if (action === 'cancel') {
this.submit(data);
}
});
return;
}
if (this.money <= 0) {
this.$confirm(`本次外呼费用预计需要消费 ${totalCount}元,当前账户余额为${this.money}元,请先充值后再创建活动?`, '提示', {
confirmButtonText: '去充值',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
window.open(`${window.location.origin}/marketing/#/recharge/do`, '_blank');
});
return;
}
} else {
this.scrollToError(this);
......@@ -781,9 +801,12 @@ export default {
beginDate: formatDateTimeByType(startDate, 'yyyy-MM-dd'),
filterJson
};
const { result } = await getMemberCount(data);
this.form.planMemberCount = result == -1 ? 0 : result;
try {
const { result } = await getMemberCount(data);
this.form.planMemberCount = result == -1 ? 0 : result;
} catch (err) {
this.$message.error('查询预计覆盖人数接口超时');
}
},
async getAiCalcSingle() {
const { result } = await getAiCalcSingle();
......
<template>
<section v-loading="loading">
<div class="pb22 clearfix">
<el-input v-model="listParams.searchParams" class="w300" placeholder="请输入姓名/昵称/手机号/会员卡号" clearable @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-input v-model="listParams.refundOrderSerial" class="w300" placeholder="请输入退款单号" clearable @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-date-picker class="w250" v-model="dateTime" value-format="yyyy-MM-dd" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="handleDateChange"></el-date-picker>
<el-button class="fr" type="primary" @click="exportExcel" icon="iconfont icon-xiazai fz14"> 按搜索结果导出</el-button>
</div>
<el-table tooltipEffect="light" :data="tableList" :style="{ width: '100%' }">
<el-table-column show-overflow-tooltip width="180" prop="sendBackTime" label="基本信息" fixed="left">
<template slot-scope="{ row }">
<img class="vertical-middle table__avatar--40" :src="row.memberImage || defaultAvatar" width="60" height="60" />
<div class="inline-block vertical-middle">
<p class="table-name--ellipsis">{{ row.memberName || '--' }}</p>
<p class="fz13 gray">{{ row.memberPhone || '--' }}</p>
</div>
</template>
</el-table-column>
<el-table-column show-overflow-tooltip min-width="120" prop="memberCardNo" label="会员卡号" />
<el-table-column prop="refundOrderSerial" label="退款单号">
<template slot-scope="{ row }">
<el-tooltip :content="row.refundOrderSerial">
<div class="ellipsis">{{ row.refundOrderSerial }}</div>
</el-tooltip>
</template>
</el-table-column>
<el-table-column show-overflow-tooltip min-width="120" label="回收总金额">
<template slot-scope="{ row }">
{{ row.couponAmountManual + row.couponAmountAuto }}
</template>
</el-table-column>
<el-table-column show-overflow-tooltip min-width="120" prop="couponAutoDestroy" label="系统回收券数" />
<el-table-column show-overflow-tooltip min-width="120" prop="couponAmountAuto" label="系统回收金额"> </el-table-column>
<el-table-column show-overflow-tooltip min-width="120" prop="couponManualDestroy" label="手动回收券数"></el-table-column>
<el-table-column show-overflow-tooltip min-width="120" prop="couponAmountManual" label="手动回收金额"></el-table-column>
<el-table-column show-overflow-tooltip min-width="150" prop="integralOrder" label="当笔订单退回积分"></el-table-column>
<el-table-column show-overflow-tooltip width="100" prop="integralRemain" label="剩余积分"></el-table-column>
<el-table-column show-overflow-tooltip min-width="120" prop="integralFee" label="积分折现金额"></el-table-column>
<el-table-column show-overflow-tooltip min-width="120" prop="refundOrderTime" label="退单时间">
<template slot-scope="{ row }">
<p class="cell-time">
{{ formatDateTimeByType(row.refundOrderTime, 'yyyy-MM-dd-HH-mm', true).y }}<br />
<span>{{ formatDateTimeByType(row.refundOrderTime, 'yyyy-MM-dd-HH-mm', true).h }}</span>
</p>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right">
<template slot-scope="{ row }">
<el-button type="text" @click="detail(row)">详情</el-button>
</template>
</el-table-column>
</el-table>
<dm-pagination v-show="tableList.length" background class="dm-pagination" :current-page="listParams.currentPage" @size-change="handleSizeChange" @current-change="handleCurrentChange" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
<vue-gic-export-excel :dialogVisible.sync="dialogVisible" :dataArr="tableList" :type="2" :excelUrl="excelUrl" :params="params" projectName="marketing"></vue-gic-export-excel>
<el-dialog title="详情" :visible.sync="show" width="700px" :before-close="handleClose">
<div v-loading="detailLoading">
<el-table tooltipEffect="light" :data="detailList" :style="{ width: '100%' }" :height="400">
<el-table-column show-overflow-tooltip prop="destoryType" label="卡券回收">
<template slot-scope="{ row }">
{{ destoryType[row.destoryType] }}
</template>
</el-table-column>
<el-table-column show-overflow-tooltip width="120" prop="couponType" label="卡券类型">
<template slot-scope="{ row }">
{{ couponType[row.couponType] }}
</template>
</el-table-column>
<el-table-column show-overflow-tooltip min-width="120" prop="couponName" label="卡券名称">
<template slot-scope="{ row }">
<a :href="'/marketing/#/card/info/' + row.couponId" target="_blank"> {{ row.couponName }}</a>
</template>
</el-table-column>
<el-table-column show-overflow-tooltip width="120" prop="couponDenomination" label="卡券金额">
<template slot-scope="{ row }">{{ row.couponDenomination }}{{ couponTypeUnit[row.couponType] }} </template>
</el-table-column>
<el-table-column show-overflow-tooltip min-width="120" prop="couponCode" label="卡券代码" />
</el-table>
</div>
</el-dialog>
</section>
</template>
<script>
import { formatDateTimeByType } from '@/utils/index.js';
import { listConsumeRefundPage, ecmConsumeCouponExcel, listConsumeCouponDetail } from '@/service/api/cardApi.js';
import talbeMethods from '@/mixins/tableMethods.js';
const destoryType = {
0: '自动',
1: '手动'
};
const couponType = {
0: '抵金券',
1: '折扣券',
2: '礼品券'
};
const couponTypeUnit = {
0: '元',
1: '折'
};
export default {
data() {
return {
listParams: {
beginTime: '',
endTime: '',
searchParams: '',
refundOrderSerial: '',
currentPage: 1,
pageSize: 20
},
dateTime: '',
formatDateTimeByType,
total: 0,
tableList: [{}],
loading: true,
dialogVisible: false,
show: false,
detailLoading: false,
detailList: [],
destoryType,
couponType,
couponTypeUnit
};
},
mounted() {
this.getTableList();
},
mixins: [talbeMethods],
methods: {
async getTableList() {
this.loading = true;
try {
let res = await listConsumeRefundPage(this.listParams);
this.tableList = res.result.result || [];
this.total = res.result.totalCount || 0;
} catch (err) {
this.$tips({ type: 'error', message: '加载列表失败' });
}
this.loading = false;
},
async detail(row) {
this.show = true;
this.detailLoading = true;
try {
let res = await listConsumeCouponDetail({ id: row.occupyId }); //2c90a8838020f6a2018020f6ed1f0000
this.detailList = res.result || [];
} catch (err) {
this.$tips({ type: 'error', message: '加载列表失败' });
this.show = false;
} finally {
this.detailLoading = false;
}
},
// 导出列表
exportExcel() {
this.dialogVisible = true;
this.excelUrl = ecmConsumeCouponExcel;
const { searchParams, beginTime, endTime, refundOrderSerial } = this.listParams;
this.params = {
searchParams,
beginTime,
endTime,
refundOrderSerial,
requestProject: 'marketing'
};
},
handleDateChange(val) {
if (val) {
this.listParams.beginTime = val[0];
this.listParams.endTime = val[1];
} else {
this.listParams.beginTime = '';
this.listParams.endTime = '';
}
this.refresh();
}
}
};
</script>
<style>
.wrapText {
display: flex;
justify-content: flex-start;
align-items: center;
width: 90%;
text-align: left;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
</style>
<template>
<el-tabs v-model="activeName">
<el-tab-pane label="退券记录" name="refund-list">
<refundList />
</el-tab-pane>
<el-tab-pane label="卡券积分回收明细" name="recycle-record-detail" v-if="isAolaiVal">
<recycleRecordDetail />
</el-tab-pane>
</el-tabs>
</template>
<script>
import refundList from './refund-list.vue';
import { isAolai } from '@/service/api/cardApi.js';
import recycleRecordDetail from './recycle-record-detail.vue';
export default {
data() {
return {
activeName: 'refund-list',
isAolaiVal: false
};
},
components: {
refundList,
recycleRecordDetail
},
mounted() {
this.isAolai();
},
methods: {
async isAolai() {
const res = await isAolai();
this.isAolaiVal = res.result;
}
}
};
</script>
<style></style>
......@@ -170,11 +170,11 @@ export default {
x.open('GET', url, true);
x.responseType = 'blob';
x.onload = function(e) {
const blob = new Blob([x.response], { type: 'image/png' });
const blob = new Blob([x.response]);
let url = window.URL.createObjectURL(blob);
let a = document.createElement('a');
a.href = url;
a.download = fileName;
a.download = fileName + '.png';
a.click();
};
x.send();
......
......@@ -11,7 +11,7 @@
<dm-upload-avatar style="white-space: nowrap" :limit="{ maxSize: 1 }" name="H5分享图" :model.sync="form.shareImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:200*200,格式为jpg/png/gif。图片大小不超过1MB,点击图片可重新上传。" :disabled="isInfo"></dm-upload-avatar>
</el-form-item> -->
<el-form-item v-if="form.shareFlag === 1" prop="shareAppImg.imgUrl" class="width50">
<dm-upload-avatar style="white-space: nowrap" :limit="{ maxSize: 1 }" name="小程序分享图" :model.sync="form.shareAppImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:320*240,格式为jpg/png。图片大小不超过1MB,点击图片可重新上传。" :disabled="isInfo"></dm-upload-avatar>
<dm-upload-avatar style="white-space: nowrap" :limit="{ maxSize: 1 }" name="小程序分享图" :model.sync="form.shareAppImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:420*336,格式为jpg/png。图片大小不超过1MB,点击图片可重新上传。" :disabled="isInfo"></dm-upload-avatar>
</el-form-item>
<el-form-item v-if="form.shareFlag === 1" label="分享标题" prop="shareTitle" class="width50" :rules="{ required: true, message: '标题不能为空', trigger: 'blur' }">
<dm-input v-model="form.shareTitle" class="w400" placeholder="请输入分享标题" :disabled="isInfo" :maxlength="20"></dm-input>
......
......@@ -131,7 +131,7 @@
<el-select class="select-page" v-model="putonForm.id" placeholder="请选择投放页面" @change="putonPageChange">
<el-option v-for="page in putonPageList" :label="page.name" :value="page.id" :key="page.id"></el-option>
</el-select>
<el-select class="select-page" v-if="putonForm && putonForm.type == 6" v-model="putonForm.customPageId" placeholder="请选择投放页面">
<el-select class="select-page" v-if="putonForm && putonForm.type == 6" v-model="putonForm.customPageId" placeholder="请选择投放页面(可根据页面名称搜索)" filterable remote :remote-method="getPageList">
<el-option v-for="page in customPageList" :label="page.title" :value="page.pageId" :key="page.pageId"></el-option>
</el-select>
<div slot="footer" class="dialog-footer">
......@@ -354,6 +354,25 @@ export default {
this.getPopupLinkList();
},
methods: {
getPageList(query) {
const params = {
pageType: 1,
status: 1,
sortType: 2,
pageSize: 9999,
currentPage: 1,
title: query,
requestProject: 'gic-web'
};
this.customPageList = [];
customPageList(params).then(res => {
const { errorCode, result } = res || { result: {} };
if (errorCode != 0) return;
if (Array.isArray(result.result)) {
this.customPageList = result.result;
}
});
},
async getDetail() {
const res = await getPopupPlan({ popupPlanId: this.$route.query.id });
if (res.errorCode === 0 && res.result) {
......@@ -553,18 +572,7 @@ export default {
this.putonPageList = res.data.result;
}
});
const params = {
pageType: 1,
status: 1,
pageSize: 500,
currentPage: 1,
requestProject: 'gic-web'
};
customPageList(params).then(res => {
if (res.errorCode == 0) {
this.customPageList = res.result.result || [];
}
});
this.getPageList();
},
putonPageChange(pageId) {
const page = this.putonPageList.filter(item => item.id == pageId);
......
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