Commit 9a8c738f by chenxin

Merge branch 'dev'

# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
parents e2ab1dc2 ffab53c9
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=./static/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=static/fonts/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link rel=stylesheet href=//web-1251519181.file.myqcloud.com/components/element.2.12.0.css><link href=/marketing/static/css/main.21e9ced7987ccb73222fb4ffa9b43b3c.css rel=stylesheet></head><body><div id=app></div><script src=//web-1251519181.file.myqcloud.com/lib/vue/2.5.2/vue.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vue-router/3.0.2/vue-router.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vuex/3.1.0/vuex.min.js></script><script src=//web-1251519181.file.myqcloud.com/components/element.2.12.0.js></script><script src=//web-1251519181.file.myqcloud.com/components/header.2.0.33.js></script><script src=//web-1251519181.file.myqcloud.com/components/footer.2.0.04.js></script><script src=//web-1251519181.file.myqcloud.com/components/card.2.0.09.js></script><script src=//web-1251519181.file.myqcloud.com/components/store.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/img-preview.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/member-group.2.2.12.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-card.2.0.18.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.42.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.13.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.2.02.js></script><script type=text/javascript src=/marketing/static/js/manifest.40c57465bea39271f437.js></script><script type=text/javascript src=/marketing/static/js/vendor.cbb380c2053ab598e892.js></script><script type=text/javascript src=/marketing/static/js/main.5277fc77b55e1381725c.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=./static/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=static/fonts/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link rel=stylesheet href=//web-1251519181.file.myqcloud.com/components/element.2.12.0.css><link href=/marketing/static/css/main.675b3b8cbe39453a837c45c73bbe330b.css rel=stylesheet></head><body><div id=app></div><script src=//web-1251519181.file.myqcloud.com/lib/vue/2.5.2/vue.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vue-router/3.0.2/vue-router.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vuex/3.1.0/vuex.min.js></script><script src=//web-1251519181.file.myqcloud.com/components/element.2.12.0.js></script><script src=//web-1251519181.file.myqcloud.com/components/header.2.0.35.js></script><script src=//web-1251519181.file.myqcloud.com/components/footer.2.0.04.js></script><script src=//web-1251519181.file.myqcloud.com/components/card.2.0.10.js></script><script src=//web-1251519181.file.myqcloud.com/components/store.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/img-preview.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/member-group.2.2.16.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-card.2.0.18.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.42.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.13.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.2.10.js></script><script type=text/javascript src=/marketing/static/js/manifest.03eb9f866c5fe52af047.js></script><script type=text/javascript src=/marketing/static/js/vendor.cbb380c2053ab598e892.js></script><script type=text/javascript src=/marketing/static/js/main.42e04df53cebc5365ccf.js></script></body></html>
\ No newline at end of file
export default{
export default {
//输入框的输入限制
getInputVal: function(val, max) {
getInputVal: function(val, max) {
var returnValue = '';
var byteValLen = 0;
for (var i = 0; i < val.length; i++) {
if (val[i].match(/[^\x00-\xff]/ig) != null)
byteValLen += 1;
else
byteValLen += 0.5;
if (byteValLen > max)
break;
returnValue += val[i];
if (val[i].match(/[^\x00-\xff]/gi) != null) byteValLen += 1;
else byteValLen += 0.5;
if (byteValLen > max) break;
returnValue += val[i];
}
return returnValue;
},
/*
* 一个汉字算一个字,一个英文字母或数字算半个字
*/
getZhLen: function (val) {
var len = 0;
for (var i = 0; i < val.length; i++) {
var a = val.charAt(i);
if (a.match(/[^\x00-\xff]/ig) != null) {
len += 1;
}
else {
len += 0.5;
}
/*
* 一个汉字算一个字,一个英文字母或数字算半个字
*/
getZhLen: function(val) {
var len = 0;
for (var i = 0; i < val.length; i++) {
var a = val.charAt(i);
if (a.match(/[^\x00-\xff]/gi) != null) {
len += 1;
} else {
len += 0.5;
}
return Math.ceil(len);
},
}
\ No newline at end of file
}
return Math.ceil(len);
}
};
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 r=window.webpackJsonp;window.webpackJsonp=function(t,o,c){for(var i,f,u,d=0,s=[];d<t.length;d++)f=t[d],n[f]&&s.push(n[f][0]),n[f]=0;for(i in o)Object.prototype.hasOwnProperty.call(o,i)&&(e[i]=o[i]);for(r&&r(t,o,c);s.length;)s.shift()();if(c)for(d=0;d<c.length;d++)u=a(a.s=c[d]);return u};var t={},n={13:0};function a(r){if(t[r])return t[r].exports;var n=t[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,a),n.l=!0,n.exports}a.e=function(e){var r=n[e];if(0===r)return new Promise(function(e){e()});if(r)return r[2];var t=new Promise(function(t,a){r=n[e]=[t,a]});r[2]=t;var o=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,a.nc&&c.setAttribute("nonce",a.nc),c.src=a.p+"static/js/"+({0:"card",1:"game",2:"wechat",3:"message",4:"ewash",5:"evaluation",6:"ecm",7:"activity",8:"recharge",9:"msg",10:"calllog"}[e]||e)+"."+{0:"837b19d0264f80ba9201",1:"4f3517907682db82b2d8",2:"37aa60c943e2f50ee3db",3:"97c4b01fcf11834b0732",4:"07d21b142bf7caa76a84",5:"d360c7ad0a84cf9d5e8d",6:"b4afe1e5841299e2d72c",7:"83e116e45f60b2efddae",8:"2a4498aed683b99be604",9:"cba535a4addd9bc5aa89",10:"2aed52df5325b7bc5983"}[e]+".js";var i=setTimeout(f,12e4);function f(){c.onerror=c.onload=null,clearTimeout(i);var r=n[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),n[e]=void 0)}return c.onerror=c.onload=f,o.appendChild(c),t},a.m=e,a.c=t,a.d=function(e,r,t){a.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},a.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(r,"a",r),r},a.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},a.p="/marketing/",a.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
!function(e){var r=window.webpackJsonp;window.webpackJsonp=function(t,c,a){for(var i,f,u,d=0,s=[];d<t.length;d++)f=t[d],n[f]&&s.push(n[f][0]),n[f]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(r&&r(t,c,a);s.length;)s.shift()();if(a)for(d=0;d<a.length;d++)u=o(o.s=a[d]);return u};var t={},n={13:0};function o(r){if(t[r])return t[r].exports;var n=t[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,o),n.l=!0,n.exports}o.e=function(e){var r=n[e];if(0===r)return new Promise(function(e){e()});if(r)return r[2];var t=new Promise(function(t,o){r=n[e]=[t,o]});r[2]=t;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:"card",1:"game",2:"wechat",3:"message",4:"ewash",5:"evaluation",6:"ecm",7:"activity",8:"recharge",9:"msg",10:"calllog"}[e]||e)+"."+{0:"ebe09b718548163933c0",1:"bc057ee3361119be1eeb",2:"1ce9ad904e6760242c86",3:"0340174a66a9796f71b8",4:"baf446b5dc013f993764",5:"d360c7ad0a84cf9d5e8d",6:"f6d03ef64384f856c78c",7:"2ce5b49d380fa458462f",8:"42dd4593d3b944c92ccf",9:"7a1b1261d25f576c81f8",10:"2aed52df5325b7bc5983"}[e]+".js";var i=setTimeout(f,12e4);function f(){a.onerror=a.onload=null,clearTimeout(i);var r=n[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),n[e]=void 0)}return a.onerror=a.onload=f,c.appendChild(a),t},o.m=e,o.c=t,o.d=function(e,r,t){o.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},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
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.
......@@ -21,18 +21,18 @@
<script src="//web-1251519181.file.myqcloud.com/components/element.2.12.0.js"></script>
<!-- <script src="//web-1251519181.file.myqcloud.com/lib/elementUI/index.2.5.4.js"></script> -->
<!-- 组件引用cdn -->
<script src="//web-1251519181.file.myqcloud.com/components/header.2.0.33.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/header.2.0.35.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/footer.2.0.04.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/card.2.0.09.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/card.2.0.10.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/store.2.0.01.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/img-preview.2.0.00.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/member-group.2.2.12.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/member-group.2.2.16.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/store-card.2.0.18.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.42.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/export-excel.2.0.13.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.2.02.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/selector.1.2.10.js"></script>
</body>
</html>
......@@ -162,6 +162,9 @@ a:hover {
.mr5{
margin-right: 5px!important;
}
.mr8{
margin-right: 8px!important;
}
.mr10{
margin-right: 10px!important;
}
......@@ -493,8 +496,6 @@ img::after {
font-weight: bold;
}
.flex{
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.border-radius__default{
......
......@@ -235,4 +235,15 @@
.dm-notification {
z-index: 3000 !important;
}
// 级联选择器
.el-scrollbar__wrap {
overflow-y: auto;
height: 100%;
overflow-x: auto;
margin: 0 !important;
}
.el-scrollbar__bar.is-vertical {
display: none;
}
\ No newline at end of file
......@@ -2,14 +2,14 @@
<div v-loading="readOnly && loading" :class="{ 'inline-block': onlySelect }">
<template v-if="!onlySelect">
<div v-if="!readOnly">
<span class="dm-input_label">营销活动</span>
<span class="dm-input_label">营销活动<span v-if="colon"></span></span>
<el-select remote filterable clearable v-loadmore="getMore" :remote-method="remoteMethod" @change="updateActId" class="w250 act-select" size="small" v-model="marketingActivityId" :disabled="readOnly" placeholder="选择营销活动">
<el-option v-for="item in tableList" :key="item.marketingActivityId" :label="item.name" :value="item.marketingActivityId"></el-option>
</el-select>
<el-button type="text" class="ml10" @click="toAdd">去新建</el-button>
</div>
<div v-else>
<span class="dm-input_label">营销活动</span>
<span class="dm-input_label">营销活动<span v-if="colon"></span></span>
<p class="inline-block">{{ info.name || '--' }} <span v-if="info.status === 0" class="fz12 gray ml10">当前计划使用的营销活动已删除</span></p>
</div>
</template>
......@@ -32,11 +32,17 @@ export default {
default: false,
type: Boolean
},
// onlySelect: 只有下拉 用于列表处
onlySelect: {
default: false,
type: Boolean
},
// 是否需要冒号
colon: {
default: false,
type: Boolean
}
}, // onlySelect: 只有下拉 用于列表处
},
data() {
return {
loading: false,
......
......@@ -72,7 +72,7 @@ export default {
handleSelect(key, keyPath) {
var that = this;
// console.log(key, keyPath);
console.log(key);
that.selectMenu = key;
},
......@@ -202,10 +202,12 @@ export default {
var that = this;
// console.log("新数据:",newData,oldData)
that.repProjectName = newData || 'gic-web';
},
$route(val) {
if (val.query.new) {
this.handleSelect(val.path);
}
}
// $route(val) {
// console.log(val);
// }
},
/* 接收数据 */
......
<template>
<el-dialog title="修改数量" :visible.sync="show" width="30%" :before-close="close" append-to-body>
奖品数量 <el-radio v-model="calculate" :label="true">增加</el-radio>
<el-radio v-model="calculate" :label="false">减少</el-radio>
<div class="text-center pt10">
<el-input-number controls-position="right" :min="0" v-model="count" class="w200 block-center" @blur="checkCalc"></el-input-number>
<span class="fz14 pl20">结果:</span>
<span>{{ calculate ? parseInt(totalCount) + parseInt(count) : parseInt(totalCount) - parseInt(count) }}</span>
<el-dialog title="修改数量" :visible.sync="show" width="435px" :before-close="close" append-to-body>
<div v-loading="loading">
奖品数量 <el-radio class="ml10" v-model="calculate" :label="true">增加</el-radio>
<el-radio v-model="calculate" :label="false">减少</el-radio>
<div class="vl">
<el-input-number controls-position="right" :min="0" :max="max" v-model="count" class="w200 block-center" @blur="checkCalc"></el-input-number>
</div>
<div class="fz14 vl" v-if="needCheck && calculate">可用库存:{{ maxStock }}</div>
<div class="fz14 vl" v-if="!calculate">当前库存:{{ totalCount }}</div>
<div class="fz14 vl mb10">结果:{{ resNum }}</div>
</div>
<div class="text-center pt10"></div>
<span slot="footer" class="dialog-footer">
<el-button @click="close">取 消</el-button>
<el-button type="primary" @click="submit">确 定</el-button>
......@@ -51,10 +53,32 @@ export default {
data() {
return {
count: 0,
calculate: true
calculate: true,
loading: false,
maxStock: 0, // 库存最大值
needCheck: false // 是否需要进行库存最大值校验
};
},
watch: {
calculate() {
this.count = 0;
}
},
computed: {
resNum() {
const num = this.calculate ? parseInt(this.totalCount) + parseInt(this.count) : parseInt(this.totalCount) - parseInt(this.count);
return isNaN(num) ? 0 : num;
},
max() {
return this.needCheck && this.calculate ? this.maxStock - this.totalCount : 1000000;
}
},
methods: {
// 父组件传入更改是否需要校验库存最大值
needCheckFn(maxStock) {
this.needCheck = true;
this.maxStock = maxStock;
},
checkCalc() {
if (!this.calculate) {
if (this.count > this.totalCount) {
......@@ -65,7 +89,10 @@ export default {
},
close() {
this.$emit('update:show', false);
// this.count = 0;
this.count = 0;
this.loading = false;
this.needCheck = false;
this.maxStock = 0;
},
submit() {
if (!this.calculate) {
......@@ -87,10 +114,16 @@ export default {
};
updatePrizeStock(params).then(res => {
this.$emit('countRefresh', { calc: this.calculate, num: this.count });
this.close();
});
this.close();
}
}
};
</script>
<style lang="scss" scoped>
.vl {
margin-left: 70px;
margin-top: 15px;
}
</style>
<template>
<div class="dm-avatar">
<label class="dm-avatar__upload " :class="{ 'is-disabled': disabled }" :style="`width:${width}px;height:${height}px;`" v-loading="loading">
<input type="file" style="display:none;" :disabled="disabled" accept="image/gif, image/jpeg,image/png" ref="uploader" v-upload="this" />
<label class="dm-avatar__upload " :class="{ 'is-disabled': disabled || unused }" :style="`width:${width}px;height:${height}px;`" v-loading="loading">
<input type="file" style="display:none;" :disabled="disabled || unused" accept="image/gif, image/jpeg,image/png" ref="uploader" v-upload="this" />
<img v-show="model.imgUrl && showImg" :src="model.imgUrl || ''" :class="className" class="dm-avatar__img" />
<i class="el-icon-plus dm-avatar__icon" v-show="!model.imgUrl" :style="'line-height:' + height + 'px;'"></i>
</label>
......@@ -24,6 +24,11 @@ export default {
};
}
},
unused: {
// 是否禁用
type: Boolean,
default: false
},
width: {
type: String,
default: 'auto'
......
......@@ -4,8 +4,8 @@
<div v-html="textarea" @keyup="textInput(textarea, $event)" ref="myTextarea" contenteditable="true" @blur="getTextValue"></div>
</div>
<div class="wx-text__opt clearfix">
<a @click="addLink" class="iconfont icon-lianjie" title="添加链接"></a>
<a @click="removeLink" class="iconfont icon-duankailianjie" title="取消链接"></a>
<!-- <a @click="addLink" class="iconfont icon-lianjie" title="添加链接"></a>
<a @click="removeLink" class="iconfont icon-duankailianjie" title="取消链接"></a> -->
<el-popover placement="top" trigger="hover" width="680" v-if="isSupportVar">
<p>1.支持插入会员信息变量,如下表所示,{数字}为可插入变量,注意变量值长度,以免超过300字文本上限。</p>
<p>2.支持插入H5链接;支持插入小程序链接。</p>
......
......@@ -83,8 +83,8 @@ export default {
if (res.data.errorCode === 0) {
if (binding.value.url === '/api-plug/upload-img') {
(binding.value.model.code = res.data.result[0].imageFiledCode), (binding.value.model.imgUrl = res.data.result[0].qcloudImageUrl);
} else if (binding.value.acceptType && binding.value.acceptType.includes('csv')) {
// 额外为csv
} else if (binding.value.acceptType && (binding.value.acceptType.includes('csv') || binding.value.acceptType.includes('xls') || binding.value.acceptType.includes('xlsx'))) {
// 额外为excel
binding.value.model.code = new Date().getTime();
} else {
(binding.value.model.code = res.data.result.imageFiledCode), (binding.value.model.imgUrl = res.data.result.qcloudImageUrl);
......
......@@ -42,9 +42,9 @@ export default {
this.xxSysp.isResign = true;
});
}
if (this.xxSysp.filterAbbrInfo.length !== 0) {
this.$refs.selector.changeComplexInfo(); // 强制展开
}
// if (this.xxSysp.filterAbbrInfo.length !== 0) {
// this.$refs.selector.changeComplexInfo(); // 强制展开
// }
},
// 商品选择器反显label
xxSyspLabel(filterAbbrInfo) {
......
......@@ -144,3 +144,12 @@ export const downloadPtyxSkinPsd = config.api + PREFIX + 'download-tempskin-psd?
// 游戏营销--大转盘/刮刮卡下载psd
export const downloadWheelSkinPsd = config.api + PREFIX + 'download_wheel_skin_psd?requestProject=marketing';
// 游戏营销-- 库存 - 编辑奖品
export const updateGamePrize = params => requests(PREFIX + 'update-game-prize', params);
// 游戏营销-- 奖品 - ggk dzp 删除游戏奖品
export const deleteGamePrize = params => requests(PREFIX + 'delete-game-prize', params);
// 游戏营销-- 库存 - 获取奖品库存
export const getCouponStock = params => requests(PREFIX + 'get-coupon-stock', params);
......@@ -3,6 +3,7 @@
<template v-if="!loading">
<p class="title">
{{ info.name || '--' }}<span>活动时间:{{ info.beginDate || '--' }}{{ info.endDate || '--' }}</span>
<span style="color:#909399;" class="ml10">* 次日0点后更新当天营销数据统计</span>
</p>
<template v-if="!isHistory">
<div class="bk f1" :class="fade">
......@@ -13,14 +14,14 @@
<el-col :span="8"><view-item text="累计" :num="dataView.activityStat.activityMbrCntTd" numBlue run></view-item></el-col>
</el-row>
</div>
<div class="bk f2 big" :class="fade">
<div class="bk f2" :class="fade">
<div class="bl-item-02"><span>活动覆盖人数</span></div>
<el-row>
<el-col :span="8"><view-item text="昨日" :num="dataView.activityStat.activityMbrNumD"></view-item></el-col>
<el-col :span="8"><view-item text="本月" :num="dataView.activityStat.activityMbrNumM"></view-item></el-col>
<el-col :span="8"><view-item text="累计" :num="dataView.activityStat.activityMbrNumTd" numBlue run></view-item></el-col>
</el-row>
<p class="tips">注:不包含微信营销覆盖人群</p>
<!-- <p class="tips">注:不包含微信营销覆盖人群</p> -->
</div>
<div class="bk f3 big" :class="fade">
<div class="bl-item-03"><span>相关订单</span></div>
......@@ -191,6 +192,7 @@ p.title {
color: rgba(48, 49, 51, 1);
line-height: 22px;
margin-bottom: 37px;
overflow: hidden;
span {
margin-left: 13px;
height: 20px;
......
<template>
<div class="dm-wrap" v-loading="loading">
<el-form ref="form" :model="ruleForm" label-width="140px" :rules="rules" style="padding-bottom:400px;">
<el-form ref="form" :model="ruleForm" label-width="140px" :rules="rules">
<el-form-item prop="name" label="活动名称">
<dm-input v-model="ruleForm.name" class="w300" placeholder="请输入活动名称" :byteType="1" :maxlength="10"></dm-input>
</el-form-item>
......@@ -13,6 +13,10 @@
<el-button type="primary" @click="submit">确认{{ isAdd ? '新建' : '保存' }}</el-button>
</el-form-item>
</el-form>
<ul style="padding-bottom:400px;margin-left:140px;color:#909399;font-size:14px;line-height:22px;">
<li>* 应用中新建计划时可以使用营销活动:微信营销、短信营销、卡券营销、智能营销、游戏营销</li>
<li>* 营销数据统计分析维度为:营销人次、活动覆盖人数、活动相关订单、活动销售额</li>
</ul>
</div>
</template>
......
......@@ -11,10 +11,10 @@
<span v-else>{{ scope.row[v.prop] || '--' }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="left" width="240px" fixed="right">
<el-table-column label="操作" align="left" width="190px" fixed="right">
<template slot-scope="scope">
<el-button type="text" @click="$router.push(`/activity/data-view/${scope.row.marketingActivityId}`)">历史数据概览</el-button>
<el-button type="text" @click="$router.push(`/activity/edit/${scope.row.marketingActivityId}`)">编辑</el-button>
<!-- <el-button type="text" @click="$router.push(`/activity/edit/${scope.row.marketingActivityId}`)">编辑</el-button> -->
<dm-delete @confirm="delData(scope.row)" tips="是否删除该营销活动?">
<el-button type="text">删除</el-button>
</dm-delete>
......
......@@ -123,7 +123,9 @@ export default {
wmShopIds: [], // 保存过的店铺id不能重复选择
countFlag: 0, // 微盟店铺 0不能使用 1只能添加1条 2能添加多条
weimobShopList: [], // 微盟店铺list
weimobDemoCodeList: [{ pid: '', card: '', loading: false, cardList: [], save: false, cardName: '' }] // 保存的微盟店铺以及对应的微盟券号 {pid:xxxx,card:xxxx,loading:false, cardList: [], save: false, name: ''}
weimobDemoCodeList: [{ pid: '', card: '', loading: false, cardList: [], save: false, cardName: '' }], // 保存的微盟店铺以及对应的微盟券号 {pid:xxxx,card:xxxx,loading:false, cardList: [], save: false, name: ''}
// cardValidity: false, // 卡券有效期是否禁用
nowWmShopData: {} // 存储wm店铺数据
};
},
watch: {
......@@ -176,6 +178,24 @@ export default {
this.goodsDiscountCheckLower = val <= 0;
},
immediate: true
},
cardValidity(val) {
const now = this.nowWmShopData;
if (val && JSON.stringify(now) !== '{}') {
if (now.expireDateType == 1) {
this.form.cardEffectiveMode = 0;
this.form.dateTime = [now.startDate, now.expireDate];
}
if (now.expireDateType == 2) {
// if (now.expDayCount > 99) {
// this.$message({ message: '有效期超出限制', type: 'warning' });
// return;
// }
this.form.cardEffectiveMode = 1;
this.form.startDay = now.startDayCount;
this.form.limitDay = now.expDayCount;
}
}
}
},
components: {
......@@ -189,6 +209,13 @@ export default {
},
storeParams() {
return !this.isAdd ? { creatorId: this.creatorId } : {};
},
cardValidity() {
if (this.form.cardApplyChannel.includes('WMmicroMall') && JSON.stringify(this.nowWmShopData) !== '{}') {
return true;
} else {
return false;
}
}
},
methods: {
......@@ -301,7 +328,6 @@ export default {
// 微盟券号 -- 复制不赋值
if (card.cardApplyChannel.indexOf('WMmicroMall') !== -1 && card.weimobDemoCode && (this.isAdd || this.isInfo || this.isEdit)) {
console.log(card.weimobDemoCode);
this.weimobDemoCodeList = JSON.parse(card.weimobDemoCode).map(v => {
return { pid: v.pid, card: v.card, loading: false, cardList: [{ cardTemplateId: v.card, name: v.name }], save: true, name: v.name };
});
......@@ -399,7 +425,7 @@ export default {
this.form.coverDescript = card.coverDescript || '';
this.uuid = card.storeWidgetKey || '';
this.$nextTick(_ => {
console.log(this.$refs.storeCard);
// console.log(this.$refs.storeCard);
this.$refs.storeCard.init();
});
this.form.image = {
......@@ -698,8 +724,8 @@ export default {
// 这里判断部分门店是否为空
if (card.storeMode) {
let data = await this.$refs.storeCard.getRightList();
console.log(this.$refs.storeCard.newUuid);
console.log(this.uuid);
// console.log(this.$refs.storeCard.newUuid);
// console.log(this.uuid);
if (!data.length) {
this.$tips({ type: 'warning', message: '部分门店不能为空' });
return;
......@@ -769,6 +795,47 @@ export default {
this.$message({ message: '该条券号保存不完整', type: 'warning' });
return;
}
const now = this.weimobDemoCodeList[idx].cardList.find(v => v.cardTemplateId == this.weimobDemoCodeList[idx].card);
if (idx > 0) {
// 与上一个进行比较
const before = this.weimobDemoCodeList[idx - 1].cardList.find(v => v.cardTemplateId == this.weimobDemoCodeList[idx - 1].card);
// (1:固定类型;2:动态类型;3:永久有效)
try {
if (before.expireDateType != now.expireDateType) {
throw new Error();
} else {
if (before.expireDateType == 1 && before.startDate != now.startDate || before.expireDate != now.expireDate) {
throw new Error();
}
if (before.expireDateType == 2 && before.startDayCount != now.startDayCount || before.expDayCount != now.expDayCount) {
throw new Error();
}
}
} catch (error) {
// 清空该行数据
this.weimobDemoCodeList[idx].card = '';
this.$message({ message: '微盟卡券有效期不一致', type: 'warning' });
return;
}
} else {
// 第一个把默认值放入
if (now.expireDateType == 1) {
this.form.cardEffectiveMode = 0;
this.form.dateTime = [now.startDate, now.expireDate];
}
if (now.expireDateType == 2) {
if (now.expDayCount > 99) {
this.$message({ message: '有效期超出限制', type: 'warning' });
return;
}
this.form.cardEffectiveMode = 1;
this.form.startDay = now.startDayCount;
this.form.limitDay = now.expDayCount;
}
this.nowWmShopData = { ...now };
console.log(this.nowWmShopData);
// this.cardValidity = true; // 禁用有效期
}
this.weimobDemoCodeList[idx].save = true;
this.weimobDemoCodeList[idx].name = saveItem.cardList.find(v => {
return v.cardTemplateId == saveItem.card;
......@@ -784,6 +851,10 @@ export default {
this.weimobDemoCodeList.splice(idx, 1);
if (this.weimobDemoCodeList.length === 0) {
this.addWmShop();
this.nowWmShopData = {};
this.form.dateTime = [,];
this.form.startDay = '';
this.form.limitDay = '';
}
},
addWmShop() {
......@@ -799,23 +870,20 @@ export default {
},
// 第一层店铺change 根据微盟店铺id查询所有店铺卡券 wmPid=xxx
handleShopChange(wmPid, idx) {
if (wmPid) {
this.weimobDemoCodeList[idx].loading = true;
listEntepriseWeimobCoupon({ wmPid })
.then(res => {
this.weimobDemoCodeList[idx].cardList = res.result || [];
this.weimobDemoCodeList[idx].loading = false;
if (this.weimobDemoCodeList[idx].cardList.length === 0) {
this.$message({ message: '该店铺没有对应微盟券号', type: 'warning' });
}
})
.catch(() => {
this.weimobDemoCodeList[idx].loading = false;
});
} else {
this.weimobDemoCodeList[idx].cardList = [];
this.weimobDemoCodeList[idx].card = '';
}
this.weimobDemoCodeList[idx].cardList = [];
this.weimobDemoCodeList[idx].card = '';
this.weimobDemoCodeList[idx].loading = true;
listEntepriseWeimobCoupon({ wmPid })
.then(res => {
this.weimobDemoCodeList[idx].cardList = res.result || [];
this.weimobDemoCodeList[idx].loading = false;
if (this.weimobDemoCodeList[idx].cardList.length === 0) {
this.$message({ message: '该店铺没有对应微盟券号', type: 'warning' });
}
})
.catch(() => {
this.weimobDemoCodeList[idx].loading = false;
});
},
// ---------微盟店铺结束--------
// ------微盟适用商品开始-------
......
......@@ -42,7 +42,7 @@
</el-select>
<template v-if="isAdd || isCopy">
<el-button type="text" v-if="!saveItem.save" class="ml10" @click="saveWmShop(saveItem, idx)">保存</el-button>
<el-button type="text" v-if="saveItem.save" class="ml10" @click="delWmShop(saveItem, idx)">删除</el-button>
<el-button type="text" class="ml10" @click="delWmShop(saveItem, idx)">删除</el-button>
</template>
</div>
<template v-if="isAdd || isCopy">
......@@ -156,8 +156,10 @@
<div class="pl25 pt10" v-show="products_exchange_number_show">兑换商品件数 <el-input-number controls-position="right" :disabled="isEdit || isInfo" v-model="form.products_exchange_number" class="200" :precision="0" :step="1" :min="0"></el-input-number></div>
</el-radio>
</div>
<div v-if="form.onlyFlag">
<!-- v-if="form.onlyFlag" -->
<div>
<el-checkbox v-model="only" :disabled="isEdit || isInfo">不与其它优惠共享</el-checkbox>
<span class="fz12 gray ml5">* 仅用于微信原生卡券详情展示,无实际业务逻辑</span>
</div>
</el-form-item>
<el-form-item prop="cardLimit" label="领券限制">
......@@ -196,15 +198,15 @@
<el-form-item class="is-required" prop="useCustomCode" label="有效期">
<div>
<el-radio v-model="form.cardEffectiveMode" :disabled="isEdit || isInfo" :label="0">固定日期</el-radio>
<el-date-picker v-model="form.dateTime" @focus="form.cardEffectiveMode = 0" :disabled="isEdit || isInfo" :picker-options="pickerOptions" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
<el-radio v-model="form.cardEffectiveMode" :disabled="isEdit || isInfo || cardValidity" :label="0">固定日期</el-radio>
<el-date-picker v-model="form.dateTime" @focus="form.cardEffectiveMode = 0" :disabled="isEdit || isInfo || cardValidity" :picker-options="pickerOptions" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</div>
<div class="pt20">
<el-radio v-model="form.cardEffectiveMode" :label="1" :disabled="isEdit || isInfo">领取后,</el-radio>
<el-select v-model="form.startDay" @focus="form.cardEffectiveMode = 1" class="w200" placeholder="请选择" :disabled="isEdit || isInfo">
<el-radio v-model="form.cardEffectiveMode" :label="1" :disabled="isEdit || isInfo || cardValidity">领取后,</el-radio>
<el-select v-model="form.startDay" @focus="form.cardEffectiveMode = 1" class="w200" placeholder="请选择" :disabled="isEdit || isInfo || cardValidity">
<el-option v-for="item in startDayOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
生效,有效天数 <el-input-number controls-position="right" class="w200" @focus="form.cardEffectiveMode = 1" :disabled="isEdit || isInfo" v-model="form.limitDay" :precision="0" :min="0"></el-input-number>
生效,有效天数 <el-input-number controls-position="right" class="w200" @focus="form.cardEffectiveMode = 1" :disabled="isEdit || isInfo || cardValidity" v-model="form.limitDay" :precision="0" :min="1" :max="isEdit || isInfo ? 100000000 : 99"></el-input-number>
</div>
</el-form-item>
......
......@@ -185,7 +185,7 @@ export default {
sceneSettingName: '',
cardId: this.$route.params.id,
cardName: this.$route.query.name,
noticeType: 1,
noticeType: 0,
templateNoticeFlag: 0,
// 判断模板消息能否使用
templateUseEnable: 1,
......@@ -606,13 +606,13 @@ export default {
type: 'warning'
})
.then(() => {
this.$router.push('/card/list');
this.$router.push('/card/record/send?new=1');
})
.catch(err => {
this.getCardPutonDetail();
});
} else {
this.$router.push('/card/list');
this.$router.push('/card/record/send?new=1');
}
} else {
this.$tips({ type: 'error', message: '操作失败' });
......@@ -670,7 +670,13 @@ export default {
}
},
handleDataLeft(selectedData, selectionToRemove) {
console.log(selectedData, selectionToRemove);
// 不可编辑
if (this.form.memberType === 2 && this.isAdd) {
this.form.memberGroupIds = selectedData
.map(v => v.memberTagGroupId)
.filter(v => v)
.join(',');
}
}
},
filters: {
......
......@@ -42,7 +42,7 @@
</el-table-column>
<el-table-column min-width="120" align="left" label="适用门店">
<template slot-scope="scope">
<span>{{ scope.row.storeMode === 0 ? '所有门店' : scope.row.storeMode === 1 ? '部分分组' : '部分门店' }}</span>
<span>{{ scope.row.storeMode === 0 ? '所有门店' : scope.row.storeMode === 1 ? '部分门店' : '--' }}</span>
</template>
</el-table-column>
<el-table-column min-width="120" align="left" label="库存">
......
......@@ -52,10 +52,12 @@
<el-table-column min-width="100" align="left" prop="receiveTime" label="卡券名称">
<template slot-scope="scope">
<template v-if="scope.row.gicCouponType === 1">
<p class="blue" @click="$router.push('/ewash/info/' + scope.row.coupCardId)">{{ scope.row.cardName }}</p>
<router-link :to="`/ewash/info/${scope.row.coupCardId}`" target="_blank">{{ scope.row.cardName }}</router-link>
<!-- <p class="blue" @click="$router.push('/ewash/info/' + scope.row.coupCardId)">{{ scope.row.cardName }}</p> -->
</template>
<template v-else>
<p class="blue" @click="$router.push('/card/info/' + scope.row.coupCardId)">{{ scope.row.cardName }}</p>
<router-link :to="`/card/info/${scope.row.coupCardId}`" target="_blank">{{ scope.row.cardName }}</router-link>
<!-- <p class="blue" @click="$router.push('/card/info/' + scope.row.coupCardId)">{{ scope.row.cardName }}</p> -->
</template>
</template>
</el-table-column>
......@@ -127,7 +129,8 @@ export default {
writeOffBeginTime: '',
writeOffEndTime: '',
sortBy: '',
showSelfFlag: ''
showSelfFlag: '',
coupCardId: this.$route.query.coupCardId
},
total: 0,
cardOrderShow: false,
......
......@@ -51,7 +51,7 @@ export default {
memberGroupIds: '',
beginDate: '',
endDate: '',
cardNoticeType: 2,
cardNoticeType: 0,
templateNoticeFlag: 0,
// 判断模板消息能否使用
templateUseEnable: 1,
......@@ -832,8 +832,13 @@ export default {
}
},
handleDataLeft(selectedData, selectionToRemove) {
// 不可编辑 不做处理
// console.log(selectedData, selectionToRemove);
// 不可编辑
if (this.form.memberType === 1 && this.isAdd) {
this.form.memberGroupIds = selectedData
.map(v => v.memberTagGroupId)
.filter(v => v)
.join(',');
}
}
},
filters: {
......
......@@ -186,6 +186,11 @@ export default {
}
},
methods: {
// 下载明细
downloadMX() {
const prev = process.env['NODE_ENV'] === 'development' ? '' : '/marketing'; // eslint-disable-line
window.open(`${prev}/static/file/e袋洗运费标准.xlsx`, '_blank');
},
/** e袋洗 */
saveAbleCategory() {
const edxGoodsList = this.$refs.category.getCategory();
......
......@@ -162,7 +162,7 @@
<el-form-item label="优惠内容" prop="giftCouponValue">
<el-input-number controls-position="right" class="w150" :disabled="isEdit || isInfo" v-model="form.giftCouponValue" :precision="0" :min="0"></el-input-number> {{ form.giftCouponDiscountType === 1 ? '元' : '件' }}
<span class="fz13 gray">* 温馨提醒:单笔订单满80元免邮,未满80元由品牌方自行承担运费(约10元)</span>
<span class="fz13 gray">* 单笔订单满足一定金额可免邮,未满金额产生的运费将由品牌方自行承担,查看<a href="#" @click="downloadMX">运费明细</a></span>
</el-form-item>
<!-- <el-form-item prop="cardLimit" label="领券限制">
......@@ -183,7 +183,7 @@
<el-select v-model="form.startDay" @focus="form.cardEffectiveMode = 1" class="w200" placeholder="请选择" :disabled="isEdit || isInfo">
<el-option v-for="item in startDayOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
生效,有效天数 <el-input-number controls-position="right" class="w200" @focus="form.cardEffectiveMode = 1" :disabled="isEdit || isInfo" v-model="form.limitDay" :precision="0" :min="0"></el-input-number>
生效,有效天数 <el-input-number controls-position="right" class="w200" @focus="form.cardEffectiveMode = 1" :disabled="isEdit || isInfo" v-model="form.limitDay" :precision="0" :min="0" :max="isEdit || isInfo ? 100000000 : 99"></el-input-number>
</div>
</el-form-item>
......
......@@ -183,7 +183,7 @@ export default {
sceneSettingName: '',
cardId: this.$route.params.id,
cardName: this.$route.query.name,
noticeType: 1,
noticeType: 0,
templateNoticeFlag: 0,
// 判断模板消息能否使用
templateUseEnable: 1,
......
<template>
<el-dialog title="修改库存" :visible.sync="show" width="500px" :before-close="close" :closed="closed" append-to-body>
<div v-loading="loading">
<span class="mr20">库存数量</span><el-radio v-model="calculate" :label="true">增加</el-radio>
<el-radio v-model="calculate" :label="false">减少</el-radio>
<div class="pt20 ml76">
<el-input-number controls-position="right" :min="0" v-model="count" class="w200 block-center" size="small" :max="max"></el-input-number>
</div>
<div class="pt20 ml76" v-if="calculate">
<span class="fz14">可用库存:{{ maxStock }}</span>
</div>
<div class="pt20 ml76" v-else>
<span class="fz14">当前库存:{{ totalCount }}</span>
</div>
<div class="pt20 ml76 pb10">
<span class="fz14">结果:{{ after }}</span>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="close">取 消</el-button>
<el-button type="primary" @click="submit">确 定</el-button>
</span>
</el-dialog>
</template>
<script>
import { getCouponStock } from '@/service/api/gameApi.js';
export default {
props: {
totalCount: {
type: Number,
default: 0
},
show: {
type: Boolean,
default: false
},
coupCardId: {
type: String,
default: ''
}
},
data() {
return {
count: 0,
calculate: true,
loading: false,
maxStock: 0 // 可操作库存
};
},
watch: {
calculate(val) {
this.count = 0;
},
show(val) {
if (val) {
this.getCouponStock();
}
}
},
computed: {
max() {
const totalCount = this.totalCount > 0 ? this.totalCount : 0;
return this.calculate ? this.maxStock - totalCount : this.totalCount;
},
after() {
return (this.calculate ? parseInt(this.totalCount) + parseInt(this.count) : parseInt(this.totalCount) - parseInt(this.count)) || 0;
}
},
methods: {
getCouponStock() {
this.loading = true;
getCouponStock({ cardId: this.coupCardId })
.then(res => {
this.maxStock = res.result || 0;
this.loading = false;
})
.catch(() => {
this.loading = false;
});
},
close() {
this.calculate = true;
this.count = 0;
this.$emit('update:show', false);
},
submit() {
if (!this.calculate) {
if (this.count > this.totalCount) {
this.$tips({ type: 'warning', message: '操作后目标库存值不能小于0' });
return;
}
} else {
if (this.count > this.maxStock) {
this.$tips({ type: 'warning', message: '增加值不能超过可用库存' });
return;
}
}
this.$emit('backStock', this.after);
this.close();
}
}
};
</script>
<style lang="scss" scoped>
.ml76 {
margin-left: 76px;
}
</style>
export default {
filters: {
prizeNameByType(val) {
// // 1积分 2卡券 3谢谢参与
const prizeReferTypeOptions = [
{ value: 1, label: '积分' },
{ value: 2, label: '卡券' },
{ value: 3, label: '谢谢参与' }
];
const current = prizeReferTypeOptions.find(v => v.value == val) || {};
return current.label;
}
}
};
......@@ -178,7 +178,7 @@
<el-button @click="$router.go(-1)">返 回</el-button>
</div>
<vue-gic-card :showCardDialog="showCardDialog" @selectCard="selectCard" :cardLimit="3" :cardType="null"></vue-gic-card>
<calculate :show.sync="calculateShow" :gameId="form.gameActivityId" :totalCount="currentObj.prizeCount" :prizeId="currentObj.prizeId" :prizeReferType="currentObj.prizeReferType" :prizeReferId="currentObj.prizeReferId" :useStrategy="0" @countRefresh="countRefresh"></calculate>
<calculate ref="calculate" :show.sync="calculateShow" :gameId="form.gameActivityId" :totalCount="currentObj.prizeCount" :prizeId="currentObj.prizeId" :prizeReferType="currentObj.prizeReferType" :prizeReferId="currentObj.prizeReferId" :useStrategy="0" @countRefresh="countRefresh"></calculate>
<strategy :show.sync="strategyShow" :gameId="form.gameActivityId" :strategyType="strategyType" :dataId="gamePrizeStrategyId" :gameActivityId="form.gameActivityId" :cardObj="strategyDialog" @set-data="setStrategyCard" @refesh="klflStrategyList"></strategy>
<code-dialog :show.sync="codeDialogShow" :id="form.gameActivityId" @selectedCode="selectedCode"></code-dialog>
</el-form>
......@@ -186,7 +186,7 @@
<script>
import activitySelect from '@/components/activity-select';
import { klflDetail, klflSave, klflStrategyList, klflPrizeList, klflStrategySort, klflStrategyDel, klflDownTemp } from '@/service/api/gameApi.js';
import { klflDetail, klflSave, klflStrategyList, klflPrizeList, klflStrategySort, klflStrategyDel, klflDownTemp, getCouponStock } from '@/service/api/gameApi.js';
import { formatDateTimeByType } from '@/utils/index.js';
import dmUploadImg from '@/components/upload/img';
import dmUploadAvatar from '@/components/upload/avatar';
......@@ -331,6 +331,18 @@ export default {
}
},
methods: {
// 获取卡券库存
getCouponStock(cardId) {
this.$refs.calculate.loading = true;
getCouponStock({ cardId })
.then(res => {
this.$refs.calculate.needCheckFn(res.result || 0);
this.$refs.calculate.loading = false;
})
.catch(() => {
this.$refs.calculate.loading = false;
});
},
//code选择
codeSelect(i) {
if (this.form.codeType == 1) {
......@@ -349,9 +361,12 @@ export default {
setPrizeCount(obj) {
this.currentObj = obj;
this.calculateShow = true;
if (obj.prizeReferType == 2) {
// 卡券 获取库存值
this.getCouponStock(obj.card.coupCardId);
}
},
countRefresh(val) {
console.log(val);
this.currentObj.prizeStock = this.currentObj.prizeCount = val.calc ? parseInt(this.currentObj.prizeCount) + parseInt(val.num) : parseInt(this.currentObj.prizeCount) - parseInt(val.num);
},
selectBg(v, i) {
......
......@@ -8,7 +8,7 @@
<template>
<section class="dm-wrap">
<div class="pb22 clearfix">
<el-select class="dm-select" v-model="listParams.prizeReferType" placeholder="选择领取状态" @change="klflReportList">
<el-select class="dm-select" v-model="listParams.prizeReferType" placeholder="请选择" @change="klflReportList">
<el-option v-for="(v, i) in prizeReferTypeOptions" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-select class="dm-select" v-model="listParams.getStatus" placeholder="选择领取状态" @change="klflReportList">
......@@ -56,7 +56,7 @@ export default {
data() {
return {
prizeReferTypeOptions: [{ value: -1, label: '所有类型' }, { value: 1, label: '积分' }, { value: 2, label: '卡券' }, { value: 3, label: '礼品' }], // eslint-disable-line
getStatusOptions: [{ value: -1, label: '所有状态' }, { value: 1, label: '待领取' }, { value: 2, label: '已领取' }, { value: 3, label: '待核销' }, { value: 4, label: ' 已核销' }, { value: 5, label: '待完善信息' }, { value: 6, label: '待发货' }, { value: 7, label: '已发货' }], // eslint-disable-line
getStatusOptions: [{ value: -1, label: '所有状态' }, { value: 1, label: '待领取' }, { value: 2, label: '已领取' }, { value: 3, label: '待核销' }, { value: 4, label: ' 已核销' }], // eslint-disable-line
loading: false,
rankList: [],
rankHeader: [
......
......@@ -31,7 +31,7 @@
<el-select class="dm-select" v-model="listParams1.gameStatus" placeholder="选择发送状态" @change="LoadPtyxRecordList1">
<el-option v-for="(v, i) in gameStatusOptions" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-input v-model="listParams1.searchParam" class="w200" placeholder="会员昵称/手机号/卡号" clearable @change="LoadPtyxRecordList1"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-input v-model="listParams1.searchParam" class="w200" placeholder="会员昵称/卡号" clearable @change="LoadPtyxRecordList1"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
</div>
<el-table tooltipEffect="light" :data="recordList" style="width:100%" v-loading="loading">
<el-table-column min-width="150" header-align="left" align="left" label="会员信息">
......@@ -92,7 +92,7 @@ export default {
// return date.y + '\n' + date.h;
// }
// },
{ label: '手机号码', prop: 'memberPhone', align: 'left' },
// { label: '手机号码', prop: 'memberPhone', align: 'left' },
{ label: '消耗方式', prop: 'costType', align: 'left' },
{ label: '消耗数值', prop: 'costValue', align: 'left' },
{ label: '游戏状态', prop: 'gameStatus', align: 'left' },
......
......@@ -30,7 +30,7 @@
<el-select class="dm-select" v-model="listParams1.gameStatus" placeholder="选择发送状态" @change="znmReportList1">
<el-option v-for="(v, i) in gameStatusOptions" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-input v-model="listParams1.searchParam" class="w200" placeholder="会员昵称/手机号/卡号" clearable @change="znmReportList1"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-input v-model="listParams1.searchParam" class="w200" placeholder="会员昵称/卡号" clearable @change="znmReportList1"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-button icon="iconfont icon-icon_yunxiazai fz14" type="primary" class="fr" @click="znmRecordExcel"> 下载Excel</el-button>
</div>
<el-table tooltipEffect="light" :data="recordList" style="width:100%" v-loading="loading">
......@@ -111,7 +111,7 @@ export default {
// return date.y + '\n' + date.h;
// }
// },
{ label: '手机号码', prop: 'memberPhone', align: 'left' },
// { label: '手机号码', prop: 'memberPhone', align: 'left' },
{
label: '游戏状态',
prop: 'getStatus',
......
......@@ -86,7 +86,7 @@ export default {
remark: '',
gicSmsTemplateId: ''
},
typeOptions: [{ value: 0, label: '普通短信' }, { value: 1, label: '营销短信' }, { value: 2, label: '验证码短信' }], // eslint-disable-line
typeOptions: [{ value: 0, label: '普通短信' }, { value: 1, label: '营销短信' }], // eslint-disable-line
rules: {
title: { required: true, message: '请输入模板名称', trigger: 'blur' },
type: { required: true, message: '请选择短信类型', trigger: 'blur' },
......
......@@ -29,7 +29,7 @@
<span class="regular-font-color">{{ info.sceneSettingName }}</span>
</el-col>
<el-col :span="8">
<activity-select :actId.sync="info.marketingActivityId" readOnly></activity-select>
<activity-select :actId.sync="info.marketingActivityId" readOnly colon></activity-select>
</el-col>
<el-col :span="24">
<span class="primary-font-color">短信模板:</span>
......
......@@ -25,7 +25,8 @@
</el-col>
<el-col :span="8">
<span class="primary-font-color">模板名称:</span>
<span class="regular-font-color">{{ info.smsTitle }}(ID:{{ info.gicSmsTemplateId }})</span>
<span class="regular-font-color">{{ info.smsTitle }}</span>
<!-- (ID:{{ info.gicSmsTemplateId }}) -->
</el-col>
<el-col :span="8">
<span class="primary-font-color">模板类型:</span>
......
......@@ -17,11 +17,11 @@
<el-form-item label="上传文件">
<div>
<div v-if="fileId" class="inline-block">已导入</div>
<file v-if="!fileId" needExtraParams :paramsObj="{ smsImportPlanId: ruleForm.smsImportPlanId }" ref="fileUpload" class="dash-btn inline-block" label="点击上传" @backImg="backImg" acceptType=".csv" tips="" :url="uploadUrl" width="50" iconClass="el-icon-upload2" /><!-- 上传 -->
<file v-if="!fileId" needExtraParams :paramsObj="{ smsImportPlanId: ruleForm.smsImportPlanId }" ref="fileUpload" class="dash-btn inline-block" label="点击上传" @backImg="backImg" acceptType=".xls, .xlsx" tips="" :url="uploadUrl" width="50" iconClass="el-icon-upload2" /><!-- 上传 -->
<!-- <el-button icon="el-icon-upload2" class="dash-btn">点击上传</el-button> -->
<el-button type="text" class="ml10" @click="download">点击下载文件模板</el-button>
</div>
<p style="margin-top:8px;color:#909399;font-size:12px;line-height:1;">手机号数量单次最多不超过5000条,填写示例:‘123456(英文单引号'+券码编号文本形式)</p>
<p style="margin-top:8px;color:#909399;font-size:12px;line-height:1;">手机号数量单次最多不超过5000条</p>
</el-form-item>
</el-form>
<p class="title mb15 mt40">短信模板设置</p>
......
......@@ -58,7 +58,7 @@ export default {
formatDateTimeByType,
loading: false,
smsTempList: [],
libTypeOptions: [{ value: '', label: '全部' }, { value: 0, label: '普通短信模板' }, { value: 1, label: '营销短信模板' }, { value: 2, label: '验证码模板' }], // eslint-disable-line
libTypeOptions: [{ value: '', label: '全部' }, { value: 0, label: '普通短信模板' }, { value: 1, label: '营销短信模板' }], // eslint-disable-line
listParams: {
type: '',
content: '',
......
......@@ -28,8 +28,8 @@
<el-form-item label="头部文案">
<el-input type="textarea" :style="'color:' + info.headerColor" v-model="info.headerText" :rows="4" class="w450" :maxlength="200"></el-input>
<div class="input-suffix clearfix">
<el-color-picker class="ml10 vertical-middle" v-model="info.headerColor"></el-color-picker>
<el-button type="text" class="vertical-middle" @click="insetVar('headerText')">插入变量</el-button>
<!-- <el-color-picker class="ml10 vertical-middle" v-model="info.headerColor"></el-color-picker> -->
<el-button type="text" class="vertical-middle ml10" @click="insetVar('headerText')">插入变量</el-button>
<span class="gray fz13 fr mr10">{{ info.headerText.length }}/200</span>
</div>
</el-form-item>
......
<template>
<section class="recharge dm-wrap">
<div class="pb22"><el-date-picker v-model="dateTime" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="rechargeRecord"></el-date-picker></div>
<el-table tooltipEffect="light" :data="tableList" style="width: 100%" v-loading="loading">
<el-table tooltipEffect="dark" :data="tableList" style="width: 100%" v-loading="loading">
<el-table-column align="left" prop="timeEnd" label="充值时间">
<template slot-scope="scope">
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.timeEnd, 'yyyy-MM-dd-HH-mm-ss', true).y }}</p>
......@@ -17,6 +17,7 @@
<el-table-column label="金额" align="left" prop="totalFee">
<template slot-scope="scope"> {{ (scope.row.totalFee / 100).toFixed(2) }}</template>
</el-table-column>
<el-table-column align="left" prop="reason" label="充值原因" show-overflow-tooltip></el-table-column>
</el-table>
<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>
......
......@@ -21,7 +21,7 @@
<p class="editor-list-item_move clearfix" v-show="v.toolbar">
<i class="el-icon-upload2 fl fz16 pr10" @click.stop="moveTop(v, i)" v-show="i !== 0"></i>
<i class="el-icon-download fl fz16" @click.stop="moveBottom(v, i)" v-show="i !== imgTextList.length - 1"></i>
<i class="el-icon-delete fr fz16" @click.stop="deleteItem(v, i)"></i>
<i class="el-icon-delete fr fz16" @click.stop="deleteItem(v, i)" v-if="!$route.params.id"></i>
</p>
</div>
</div>
......
<template>
<div v-loading="loading">
<section class="dm-form__wrap">
<activity-select class="mb20" :actId.sync="info.marketingActivityId" :readOnly="isEdit || isInfo"></activity-select>
<activity-select class="mb20" :actId.sync="info.marketingActivityId" colon :readOnly="isEdit || isInfo"></activity-select>
<div class="mb20" v-if="!isAdd && info.sceneSettingName">
<span class="dm-input_label">营销场景:</span>
<span class="dm-input_label mr8">营销场景:</span>
{{ info.sceneSettingName }}
</div>
<div>
<span class="dm-input_label">发送时间:</span>
<span class="dm-input_label mr8">发送时间:</span>
<el-select class="w250" v-model="info.sendType" :disabled="isInfo">
<el-option v-for="(v, i) in sendTypeOptions" :key="i" :value="v.value" :label="v.label"></el-option>
</el-select>
......@@ -280,7 +280,7 @@ export default {
return;
}
if (this.info.contentType === 0 && !this.info.imageTextId) {
this.$tips({ type: 'warning', message: '先选择一个图文' });
this.$tips({ type: 'warning', message: '先选择一个图文' });
return;
} else if (this.info.contentType === 1 && !this.info.content) {
this.$tips({ type: 'warning', message: '请填写文本' });
......@@ -543,7 +543,13 @@ export default {
}
},
handleDataLeft(selectedData, selectionToRemove) {
console.log(selectedData, selectionToRemove);
// 不可编辑
if (this.info.memberType === 2 && this.isAdd) {
this.info.memberGroupIds = selectedData
.map(v => v.memberTagGroupId)
.filter(v => v)
.join(',');
}
}
}
};
......
......@@ -187,9 +187,18 @@ export default {
},
created() {
this.$store.commit('mutations_breadcrumb', [{ name: '营销管理' }, { name: '微信营销', path: '' }, { name: '发送记录', path: '' }]);
this.$store.commit(
'mutations_layoutTips',
`<div class="layout--tips">
<i class="el-icon-info"></i>送达人数由微信实时返;阅读人数、分享人数、收藏人数微信侧次日返回,可以查看数据
</div>`
);
this.sendRecordList();
this.handleIsShowSelf();
},
beforeDestroy() {
this.$store.commit('mutations_layoutTips', '');
},
methods: {
formatDateTimeByType,
search() {
......
export default{
export default {
//输入框的输入限制
getInputVal: function(val, max) {
getInputVal: function(val, max) {
var returnValue = '';
var byteValLen = 0;
for (var i = 0; i < val.length; i++) {
if (val[i].match(/[^\x00-\xff]/ig) != null)
byteValLen += 1;
else
byteValLen += 0.5;
if (byteValLen > max)
break;
returnValue += val[i];
if (val[i].match(/[^\x00-\xff]/gi) != null) byteValLen += 1;
else byteValLen += 0.5;
if (byteValLen > max) break;
returnValue += val[i];
}
return returnValue;
},
/*
* 一个汉字算一个字,一个英文字母或数字算半个字
*/
getZhLen: function (val) {
var len = 0;
for (var i = 0; i < val.length; i++) {
var a = val.charAt(i);
if (a.match(/[^\x00-\xff]/ig) != null) {
len += 1;
}
else {
len += 0.5;
}
/*
* 一个汉字算一个字,一个英文字母或数字算半个字
*/
getZhLen: function(val) {
var len = 0;
for (var i = 0; i < val.length; i++) {
var a = val.charAt(i);
if (a.match(/[^\x00-\xff]/gi) != null) {
len += 1;
} else {
len += 0.5;
}
return Math.ceil(len);
},
}
\ No newline at end of file
}
return Math.ceil(len);
}
};
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