Commit 992dd6ed by chenxin

Merge branch 'release' into 'master'

Release

See merge request !136
parents 30367ab4 4f227231
<!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.7156f6ca97a4dfa400cb75c4c807068d.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.45.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.19.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.24.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-card.2.0.24.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-new.2.0.68.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.43.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.16.js></script><script src=//web-1251519181.file.myqcloud.com/components/input.2.0.20.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.20.js></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/activity-select.1.0.2.1.js></script><script type=text/javascript src=/marketing/static/js/manifest.b9d0059ca6fd492b6ef3.js></script><script type=text/javascript src=/marketing/static/js/vendor.fef1c3d3b3b586faaee2.js></script><script type=text/javascript src=/marketing/static/js/main.a38bc9dd2a1132342ec3.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.5bd95db5af20667130eea0bfe3a0eceb.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.45.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.19.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.27.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-card.2.0.29.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-new.2.0.70.js></script><script src=//web-1251519181.file.myqcloud.com/components/confirm-people.2.0.05.js></script><script src=//web-1251519181.file.myqcloud.com/components/people.2.0.43.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.16.js></script><script src=//web-1251519181.file.myqcloud.com/components/input.2.0.20.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.20.js></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/activity-select.1.0.2.1.js></script><script type=text/javascript src=/marketing/static/js/manifest.3a608dfe54c084d96807.js></script><script type=text/javascript src=/marketing/static/js/vendor.fef1c3d3b3b586faaee2.js></script><script type=text/javascript src=/marketing/static/js/main.42b83750b6050a394ad3.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.
!function(e){var r=window.webpackJsonp;window.webpackJsonp=function(n,o,a){for(var f,i,u,d=0,s=[];d<n.length;d++)i=n[d],t[i]&&s.push(t[i][0]),t[i]=0;for(f in o)Object.prototype.hasOwnProperty.call(o,f)&&(e[f]=o[f]);for(r&&r(n,o,a);s.length;)s.shift()();if(a)for(d=0;d<a.length;d++)u=c(c.s=a[d]);return u};var n={},t={15:0};function c(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,c),t.l=!0,t.exports}c.e=function(e){var r=t[e];if(0===r)return new Promise(function(e){e()});if(r)return r[2];var n=new Promise(function(n,c){r=t[e]=[n,c]});r[2]=n;var o=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,c.nc&&a.setAttribute("nonce",c.nc),a.src=c.p+"static/js/"+({0:"card",1:"game",2:"wechat",3:"message",4:"ewash",5:"scan",6:"ecm",7:"evaluation",8:"activity",9:"cdKey",10:"recharge",11:"msg",12:"calllog"}[e]||e)+"."+{0:"78829e99b750d3835f0e",1:"4e36dc6b55e0fd2d3c84",2:"5dc639c3066c5b1b26cf",3:"6413b55f63391becb1ba",4:"c8a5e5c668cdc258c3c4",5:"c5259ccf38eb5ea9a2cf",6:"62446153be80861e5faf",7:"45f7d7f2d664f384f7d1",8:"35efeb2ae926b54b4341",9:"acd1803f49e3f7121560",10:"e5cd16e4f5e1229ea313",11:"00a6edc9657c9e4c34fa",12:"f1c9fa1ccd0d36ae0602"}[e]+".js";var f=setTimeout(i,12e4);function i(){a.onerror=a.onload=null,clearTimeout(f);var r=t[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=i,o.appendChild(a),n},c.m=e,c.c=n,c.d=function(e,r,n){c.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},c.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(r,"a",r),r},c.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},c.p="/marketing/",c.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
!function(e){var r=window.webpackJsonp;window.webpackJsonp=function(n,c,o){for(var i,f,u,d=0,s=[];d<n.length;d++)f=n[d],t[f]&&s.push(t[f][0]),t[f]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(r&&r(n,c,o);s.length;)s.shift()();if(o)for(d=0;d<o.length;d++)u=a(a.s=o[d]);return u};var n={},t={15:0};function a(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.e=function(e){var r=t[e];if(0===r)return new Promise(function(e){e()});if(r)return r[2];var n=new Promise(function(n,a){r=t[e]=[n,a]});r[2]=n;var c=document.getElementsByTagName("head")[0],o=document.createElement("script");o.type="text/javascript",o.charset="utf-8",o.async=!0,o.timeout=12e4,a.nc&&o.setAttribute("nonce",a.nc),o.src=a.p+"static/js/"+({0:"card",1:"game",2:"wechat",3:"message",4:"ewash",5:"scan",6:"ecm",7:"evaluation",8:"activity",9:"cdKey",10:"recharge",11:"msg",12:"calllog"}[e]||e)+"."+{0:"447295d1331fdaa1aaeb",1:"13dab37beda20959629e",2:"2bc295c93adcee55a98f",3:"0378b23ea9e2767987cf",4:"7cec0849f7d5925281a1",5:"e741e360b5ba4659cecd",6:"c1746744c38badac79ac",7:"99e49bc49f2439ac7253",8:"35efeb2ae926b54b4341",9:"acd1803f49e3f7121560",10:"e5cd16e4f5e1229ea313",11:"00a6edc9657c9e4c34fa",12:"f1c9fa1ccd0d36ae0602"}[e]+".js";var i=setTimeout(f,12e4);function f(){o.onerror=o.onload=null,clearTimeout(i);var r=t[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return o.onerror=o.onload=f,c.appendChild(o),n},a.m=e,a.c=n,a.d=function(e,r,n){a.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},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
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.
......@@ -26,10 +26,10 @@
<script src="//web-1251519181.file.myqcloud.com/components/card.2.0.19.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.24.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/store-card.2.0.24.js"></script><!-- 门店选择器 -->
<script src="//web-1251519181.file.myqcloud.com/components/store-new.2.0.68.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/member-group.2.2.27.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/store-card.2.0.29.js"></script><!-- 门店选择器 -->
<script src="//web-1251519181.file.myqcloud.com/components/store-new.2.0.70.js"></script><!-- 新版门店选择器 -->
<script src="//web-1251519181.file.myqcloud.com/components/confirm-people.2.0.05.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/people.2.0.43.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/export-excel.2.0.16.js"></script><!-- 数据导出 -->
<script src="//web-1251519181.file.myqcloud.com/components/input.2.0.20.js"></script>
......
......@@ -114,7 +114,7 @@
display: block;
width: 200px;
height: 200px;
background: url(/static/img/chart-no-data.png) no-repeat center;
background: url('/static/img/no-data_icon.png') no-repeat center;
background-size: cover;
margin: 20px auto 10px auto;
}
......
......@@ -16,6 +16,9 @@ html,body{
font-size: 14px;
font-family: Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,\\5FAE\8F6F\96C5\9ED1,Arial,sans-serif;
}
textarea {
font-family: Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,\\5FAE\8F6F\96C5\9ED1,Arial,sans-serif;
}
i {
font-size:14px;
}
......
......@@ -111,6 +111,10 @@ export default {
box-shadow: 0 0 8px 0 rgba(232, 237, 250, 0.6), 0 2px 4px 0 rgba(232, 237, 250, 0.5);
border-color: #1890ff;
}
&.is-disabled {
cursor: no-drop;
border-color: #d9d9d9 !important;
}
}
&__img {
width: 100%;
......
......@@ -20,6 +20,9 @@ function verificationPicFile(file, l_width, l_height) {
image.onload = function() {
var width = image.width;
var height = image.height;
// 没穿就设置为img的
l_width = l_width ? l_width : width;
l_height = l_height ? l_height : height;
if (width === l_width && height === l_height) {
resolve();
} else {
......
......@@ -267,12 +267,47 @@
<el-form-item label="跳转配置">
<el-switch :disabled="isInfo" :active-value="1" :inactive-value="0" v-model="form.jumpFlag"></el-switch>
<template v-if="form.jumpFlag">
<el-button @click="linkToolsVisible = true" type="text" class="ml10">{{ JSON.stringify(form.jumpLink) == '{}' ? '设置链接' : '修改链接:' }}</el-button>
<!-- 可以编辑链接 -->
<el-button @click="linkToolsVisible = true" type="text" class="ml10">{{ JSON.stringify(form.jumpLink) == '{}' ? '设置链接' : '修改链接' }}</el-button>
<span class="gray ml10">{{ form.jumpLink.name }}</span>
</template>
<div class="gray fz13">* 开启后小程序卡券详情将对应路径的跳转按钮</div>
</el-form-item>
<!-- 转赠 -->
<!-- 新建和复制要根据giveEnable来展示开关 -->
<template v-if="form.useCustomCode == 0 && (((this.isAdd || this.isCopy) && giveEnable) || !this.isAdd || !this.isCopy)">
<!-- 仅随机生成支持卡券转赠 -->
<el-form-item label="转赠开关">
<el-switch :disabled="isEdit || isInfo" :active-value="1" :inactive-value="0" v-model="form.giveFlag"></el-switch>
<span class="tips fz12 gray ml10">* code类型为自定义号段暂时不支持卡券转赠,转赠多次会消耗相同次数的库存,请设置足够的安全库存</span>
</el-form-item>
<!-- !!!需要通过$el找到,避免开关来来回回初始化,所以用v-show -->
<el-form-item label="转赠对话框文字" prop="giveContent" class="is-required" v-show="form.giveFlag === 1">
<dm-input type="textarea" :disabled="isEdit || isInfo" class="w400" ref="ruleTextarea" :row="4" :autosize="{ minRows: 4, maxRows: 8 }" v-model="form.giveContent" wrap="soft" :byte-type="1" :maxlength="24" />
</el-form-item>
<template v-if="form.giveFlag === 1">
<el-form-item label="转赠对话框图片" prop="giveImage">
<dm-upload-avatar :model.sync="giveImg1" url="/api-plug/upload-img" :unused="isEdit || isInfo" width="105" height="105" label="上传图片" tips="图片建议尺寸: 320*240px 的jpg/png图片,大小不超过1MB。" :limit="{ type: true, maxSize: 1 }"></dm-upload-avatar>
</el-form-item>
<el-form-item label="转赠页面首图" prop="bannerImage">
<dm-upload-avatar :model.sync="giveImg2" url="/api-plug/upload-img" :unused="isEdit || isInfo" width="105" height="105" label="上传图片" tips="图片建议尺寸: 640*210px 的jpg/png图片,大小不超过1MB。" :limit="{ type: true, maxSize: 1 }"></dm-upload-avatar>
</el-form-item>
<el-form-item label="首图链接设置" prop="bannerJumpUrl">
<div style="display:flex;">
<el-checkbox :disabled="isEdit || isInfo" v-model="form.useJumpFlag" :true-label="1" :false-label="0">首图链接</el-checkbox>
<span v-if="form.useJumpFlag">
<!-- 不能编辑 -->
<el-button @click="linkToolsVisible2 = true" v-if="isAdd || isCopy" type="text" class="ml10">{{ JSON.stringify(form.bannerJumpUrl) == '{}' ? '设置链接' : '修改链接' }}</el-button>
<span class="gray ml10">{{ form.bannerJumpUrl.name }}</span>
</span>
</div>
</el-form-item>
<el-form-item label="卡券转赠规则" prop="giveRule" v-show="form.giveFlag === 1">
<dm-input type="textarea" :disabled="isEdit || isInfo" class="autosize w400" :rows="4" :autosize="{ minRows: 4, maxRows: 8 }" v-model="form.giveRule" :byte-type="1" :maxlength="200" />
</el-form-item>
</template>
</template>
<el-form-item prop="cardExplain" label="适用门店说明">
<dm-input class="w400" v-model="form.cardExplain" :disabled="isInfo" :maxlength="50"></dm-input>
</el-form-item>
......@@ -286,11 +321,6 @@
<el-alert v-show="storeMode && form.cardApplyChannel.indexOf('WMmicroMall') !== -1" title="选择的门店必须保持与微盟侧门店一致,请确认选择无误" type="warning" show-icon :closable="false" class="mt20 width80"></el-alert>
</el-form-item>
<!-- feature/m12 暂时隐藏 -->
<!-- <el-form-item v-if="giveEnable && form.useCustomCode != 1" label="卡券转赠">
<el-switch :disabled="isEdit" v-model="form.giveFlag" :active-value="1" :inactive-value="0"></el-switch>
<span class="tips fz12 gray ml5">* code类型为自定义号段暂时不支持卡券转赠,转赠多次会消耗相同次数的库存,请设置足够的安全库存</span>
</el-form-item> -->
<el-form-item v-if="(isAdd || isCopy) && refundEnable && form.cardType != 2" label="退货退券">
<el-switch :disabled="isEdit" v-model="form.refundFlag" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
......@@ -309,6 +339,7 @@
</el-form-item>
<div class="btn-wrap_fixed" :class="{ on: asideShow }">
<el-button v-if="form.useCustomCode === 0 && form.giveFlag" :disabled="!preview.disabled" @click="preview.visible = true">转赠预览</el-button>
<el-button type="primary" @click="submitForm('form')" v-loading="submitLoading" v-show="!isInfo && canEdit && $store.state.marketing.appletEnable">保存</el-button>
<el-button @click="$router.go(-1)"> </el-button>
</div>
......@@ -321,8 +352,9 @@
<el-button v-if="isAdd || isCopy" type="primary" @click="xxSyspConfirm">确定</el-button>
</div>
</el-dialog>
<!-- 链接小工具 -->
<linktools showType="5" :canSave="!isInfo" :linkVisible.sync="linkToolsVisible" @linkSelect="linkSelect" :linkData="form.jumpLink" />
<dm-send-preview :data="form" :visible.sync="preview.visible" /><!-- 转赠预览 -->
<linktools showType="5" :canSave="!isInfo" :linkVisible.sync="linkToolsVisible" @linkSelect="linkSelect" :linkData="form.jumpLink" /><!-- 链接小工具 -->
<linktools showType="5" :canSave="isAdd || isCopy" :linkVisible.sync="linkToolsVisible2" @linkSelect="linkSelect2" :linkData="form.bannerJumpUrl" /><!-- 链接小工具 - 转赠 -->
</div>
</template>
......
......@@ -26,7 +26,12 @@
<div class="pb20">
<span class="dm-input_label pr10">选择会员</span>
<el-radio :disabled="isInfo" v-model="form.memberType" :label="0">会员筛选</el-radio>
<el-radio :disabled="isInfo" v-model="form.memberType" :label="1">指定会员</el-radio>
<el-radio :disabled="isInfo" v-model="form.memberType" :label="1">
指定会员
<el-tooltip class="item" effect="dark" content="指定会员下最多选择1000人" open-delay="200">
<i class="el-icon-info ml5 minor-font-color"></i>
</el-tooltip>
</el-radio>
<el-radio :disabled="isInfo" v-model="form.memberType" :label="2">会员分组</el-radio>
</div>
<div v-show="!form.memberType">
......
......@@ -102,7 +102,11 @@ export default {
this.loading = true;
try {
let res = await cardPageList(this.listParams);
this.tableList = res.result.result || [];
this.tableList =
res.result.result.map(v => {
v.isApiCreate = v.gicCouponType == 3; // 是gic侧不可用
return v;
}) || [];
this.total = res.result.totalCount;
} catch (err) {
this.$tips({ type: 'error', message: '加载列表失败' });
......
......@@ -22,7 +22,8 @@
<h5>{{ item.saleAmount }}</h5>
<p>销售额</p>
</div>
<el-tooltip class="item" effect="dark" content="卡券的领取数量\使用数量\核销率\销售额统计数据每隔3小时更新一次" :open-delay="300">
<el-tooltip class="item" effect="dark" open-delay="300">
<div slot="content">{{ item.isApiCreate ? '该卡券为外部接口创建卡券无法用于营销' : '卡券的领取数量\使用数量\核销率\销售额统计数据每隔3小时更新一次' }}</div>
<i style="position:absolute;right:10px;top:10px;cursor:pointer;color:#c0c4cc;font-size:18px;" class="el-icon-question"></i>
</el-tooltip>
</div>
......@@ -57,8 +58,9 @@
</div>
<div class="card-item_foot clearfix">
<div class="fl">
<!-- 由外部api创建 仅展示详情、删除、报表按钮 -->
<span v-if="item.auditingStatus !== -1"
>剩余库存:{{ item.couponStock }} <a title="编辑库存" v-if="!shelfFlag && item.useCustomCode === 0 && item.canEdit !== false" @click="preAdjustStock(item)"><i class="el-icon-edit"></i></a
>剩余库存:{{ item.couponStock }} <a title="编辑库存" v-if="!shelfFlag && item.useCustomCode === 0 && item.canEdit !== false && !item.isApiCreate" @click="preAdjustStock(item)"><i class="el-icon-edit"></i></a
></span>
</div>
<render-temp v-if="!shelfFlag" :item="item" @handler="handler"></render-temp>
......@@ -200,6 +202,7 @@ export default {
.card-item__detail {
padding: 10px;
height: 150px;
overflow-y: auto;
p {
line-height: 1.8em;
span {
......
......@@ -10,11 +10,12 @@ export default Vue.component('render-temp', {
},
render(h) {
const canEdit = this.item.canEdit !== false; // 只有canEdit === false 才证明不能使用 没有权限仅可以详情/报表
const isApiCreate = this.item.isApiCreate || false; // 由外部api创建 仅展示详情、删除、报表按钮
// 当前卡券是否 是长期有效||在投放有效期内
// putEffectiveMode 0:固定日期,1:长期
const canGroupSend = this.item.putEffectiveMode == 1 ? true : new Date() > new Date(this.item.putBeginDate) && new Date() < new Date(this.item.putEndDate);
const bind1 =
canEdit && canGroupSend ? (
canEdit && !isApiCreate && canGroupSend ? (
<a title="投放" onClick={this.handler.bind(null, 1)}>
<i class="iconfont icon-daohang-" />
</a>
......@@ -26,10 +27,12 @@ export default Vue.component('render-temp', {
<i class="el-icon-tickets" />
</a>
);
const bind3 = (
const bind3 = !isApiCreate ? (
<a title="编辑" onClick={this.handler.bind(null, 3)}>
<i class="el-icon-edit" />
</a>
) : (
''
);
const bind4 = canEdit ? (
<a title="删除" onClick={this.handler.bind(null, 4)}>
......@@ -43,21 +46,23 @@ export default Vue.component('render-temp', {
<i class="el-icon-document" />
</a>
);
const bind6 = canEdit ? (
<a title="复制" onClick={this.handler.bind(null, 6)}>
<i class="iconfont icon-wxcard-copy" />
</a>
) : (
''
);
const bind6 =
canEdit && !isApiCreate ? (
<a title="复制" onClick={this.handler.bind(null, 6)}>
<i class="iconfont icon-wxcard-copy" />
</a>
) : (
''
);
const bind7 = canEdit ? (
<a style="position:relative;top:1px" title="领取记录" onClick={this.handler.bind(null, 7)}>
<i class="iconfont icon-tubiaozhizuomoban-" />
</a>
) : (
''
);
const bind7 =
canEdit && !isApiCreate ? (
<a style="position:relative;top:1px" title="领取记录" onClick={this.handler.bind(null, 7)}>
<i class="iconfont icon-tubiaozhizuomoban-" />
</a>
) : (
''
);
const statushtml = (
<span>
......@@ -96,7 +101,7 @@ export default Vue.component('render-temp', {
{bind4}
</span>
);
const _html = this.item.cardEffectiveMode == 0 && this.item.endDate < Date.now() ? overDateHtml : statushtml;
const _html = this.item.putEffectiveMode == 0 && new Date(this.item.putEndDate) < new Date() ? overDateHtml : statushtml;
let failMsg = '';
if (this.item.autingFaildMsg) {
failMsg = ':' + this.item.autingFaildMsg;
......@@ -111,7 +116,7 @@ export default Vue.component('render-temp', {
}
}
if (this.item.cardEffectiveMode == 0 && this.item.endDate < Date.now()) {
if (this.item.putEffectiveMode == 0 && new Date(this.item.putEndDate) < new Date()) {
return <div class="fr">{overDateHtml}</div>;
}
......
......@@ -7,19 +7,19 @@
<el-form-item label="计划名称" prop="ecmPlanName">
<dm-input class="w400" :maxlength="9" v-model="form.ecmPlanName" :disabled="!isAdd"></dm-input>
</el-form-item>
<el-form-item label="时效">
<el-radio v-model="form.effectType" :label="0" :disabled="!isAdd">实时</el-radio>
<el-radio v-model="form.effectType" :label="2" :disabled="!isAdd">立即发送</el-radio>
<el-radio class="mr10" v-model="form.effectType" :label="1" :disabled="!isAdd">每天</el-radio>
<el-select style="width:262px;" :disabled="!isAdd" v-model="form.effectTime" v-if="form.effectType == 1" placeholder="请选择时间">
<el-form-item label="时效" class="is-required">
<el-radio v-model="form.effectType" :label="0" :disabled="!isAdd">触点</el-radio>
<el-radio v-model="form.effectType" :label="1" :disabled="!isAdd">重复</el-radio>
<el-radio v-model="form.effectType" :label="2" :disabled="!isAdd">单次</el-radio>
<!-- <el-select style="width:262px;" :disabled="!isAdd" v-model="form.effectTime" v-if="form.effectType == 1" placeholder="请选择时间">
<el-option v-for="(v, i) in dayOptions" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
</el-select> -->
<div class="layout--tips mt10" v-if="form.effectType == 1 || form.effectType == 2">
<!-- <i class="el-icon-info inline-block"></i> -->
<div class="layout--tips__content">
<p><span class="dm-status--primary pl10"></span>{{ form.effectType == 1 ? '每天发送' : '立即发送' }}<b class="bold">图文、文本、图片</b>将使用微信群发接口,占用每个用户每月4条的群发次数</p>
<p><span class="dm-status--primary pl10"></span>{{ form.effectType == 1 ? '每天发送' : '立即发送' }}<b class="bold">小程序</b>使用客服接口,但客服接口需要用户在24小时之内与微信公众号互动才能发送成功,可能导致成功率过低,不占用每个用户每月4条的群发次数。</p>
<p><span class="dm-status--primary pl10"></span>{{ form.effectType == 1 ? '每天发送' : '立即发送' }}<b class="bold">短信、话务</b>均不占用群发次数,卡券详见卡券通知方式配置不同投放方式说明。</p>
<p><span class="dm-status--primary pl10"></span>{{ form.effectType == 1 ? '重复发送' : '单次发送' }}<b class="bold">图文、文本、图片</b>将使用微信群发接口,占用每个用户每月4条的群发次数</p>
<p><span class="dm-status--primary pl10"></span>{{ form.effectType == 1 ? '重复发送' : '单次发送' }}<b class="bold">小程序</b>使用客服接口,但客服接口需要用户在24小时之内与微信公众号互动才能发送成功,可能导致成功率过低,不占用每个用户每月4条的群发次数。</p>
<p><span class="dm-status--primary pl10"></span>{{ form.effectType == 1 ? '重复发送' : '单次发送' }}<b class="bold">短信、话务</b>均不占用群发次数,卡券详见卡券通知方式配置不同投放方式说明。</p>
</div>
</div>
<div class="layout--tips" v-else>
......@@ -32,6 +32,38 @@
<el-option v-for="(v, i) in effectActionOptions" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
</el-form-item>
<!-- 重复执行 -->
<template v-if="form.effectType == 1">
<el-form-item label="执行频率" prop="execDate" class="is-required">
<div class="flex">
<el-select :disabled="!isAdd" style="width:220px;" class="mr20" v-model="form.execDateType" placeholder="请选择" @change="form.execDate = []">
<el-option v-for="(v, i) in execDateType" :key="i" :label="`${v.label}执行`" :value="v.value"></el-option>
</el-select>
<el-select v-if="form.execDateType !== 1" style="width:220px;" :disabled="!isAdd" class="w180" multiple v-model="form.execDate" clearable placeholder="可多选">
<el-option v-for="(v, i) in execDateList" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
</div>
</el-form-item>
<el-form-item label="执行时间" class="mt10 is-required">
<el-time-select v-model="form.effectTime" :disabled="!isAdd" :picker-options="{ start: '00:00', step: '01:00', end: '23:00' }" placeholder="请设置"></el-time-select>
</el-form-item>
</template>
<!-- 单次执行 -->
<template v-if="form.effectType === 2">
<el-form-item label="执行时间">
<el-radio-group :disabled="!isAdd" v-model="form.execType">
<el-radio :label="1">立即执行</el-radio>
<el-radio :label="0">
<el-tooltip content="最多只能选择当前时间的30分钟之后" placement="top" open-delay="300">
<span class="tooltip-icon">定时执行</span>
</el-tooltip>
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.execType === 0">
<el-date-picker :disabled="!isAdd" class="inputTime" value-format="yyyy-MM-dd HH:mm:ss" @change="changeExecTime" v-model="form.execTime" :picker-options="pickerOptions" type="datetime" placeholder="请选择" />
</el-form-item>
</template>
<el-form-item label="常用场景" v-if="form.effectType == 1">
<div class="fz12 gray">选填,勾选后生效</div>
<el-checkbox-group v-model="checked" :max="1">
......@@ -155,8 +187,21 @@
</el-select>
</el-form-item>
</section>
<!-- 营销次数配置 -->
<section class="dm-form__wrap" v-if="form.effectType == 0 && (form.effectAction === 'consume' || form.effectAction === 'upgrade' || form.effectAction === 'degrade')">
<!-- 营销次数配置 重复 -->
<section class="dm-form__wrap" v-if="form.effectType == 1">
<h3 class="dm-title__label">
营销次数配置
<i class="dm-title__label--icon iconfont icon-xinxixianshi"></i>
<span class="gray fz13">设置本营销计划对同个会员的触发次数</span>
</h3>
<div style="padding:20px 0;">
<label class="mr5">限制对每个用户营销一次</label>
<el-switch :disabled="!isAdd" v-model="form.marketingOnceFlag" :active-value="1" :inactive-value="0"></el-switch>
<span class="gray ml10 fz13">{{ form.marketingOnceFlag ? '该营销计划对每个用户执行一次' : '该营销计划对每个用户不限制执行次数' }}</span>
</div>
</section>
<!-- 营销次数配置 实时触点 -->
<section class="dm-form__wrap" v-if="form.effectType == 0 && ['consume', 'upgrade', 'degrade'].includes(form.effectAction)">
<h3 class="dm-title__label">
营销次数配置
<i class="dm-title__label--icon iconfont icon-xinxixianshi"></i>
......
......@@ -45,12 +45,13 @@
<script>
import activitySelect from '@/components/activity-select/index.vue';
import { loadEcmList, deleteEcm, offlineEcmPlan } from '@/service/api/ecmApi.js';
import { formatDateTimeByType } from '@/utils/index.js';
const marketingTypeOptions = [{ value: '', label: '所有发送类型' }, { value: 'card', label: '卡券营销' }, { value: 'message', label: '短信营销' }, { value: 'teletext', label: '图文营销' }, { value: 'text', label: '文本营销' }, { value: 'teltask', label: '话务' }, { value: 'image', label: '微信图片' }]; // eslint-disable-line
export default {
name: 'ecm',
data() {
return {
effectTypeOption: [{ value: '', label: '所有时效' }, { value: 0, label: '实时' }, { value: 1, label: '定时' }, { value: 2, label: '立即发送' }], // eslint-disable-line
effectTypeOption: [{ value: '', label: '所有时效' }, { value: 0, label: '触点' }, { value: 1, label: '重复' }, { value: 2, label: '单次' }], // eslint-disable-line
onlineOptions: [{ value: '', label: '所有上线状态' }, { value: 0, label: '待上线' }, { value: 1, label: '已上线' }, { value: 2, label: '已下线' }], // eslint-disable-line
marketingTypeOptions,
listParams: {
......@@ -70,33 +71,40 @@ export default {
{
label: '时效',
prop: 'effectType',
width: '160',
minWidth: '160',
align: 'left',
formatter(row) {
if (row.effectType == 0) {
return '实时';
return '触点';
} else if (row.effectType == 1) {
return `<span><i class="el-icon-time fz18 vertical-middle"></i><span class="vertical-middle"> 每天${row.effectTime}:00</span></span>`;
/** '重复执行频率(1:天; 2:周 3:月)' **/
const html = row.execDateType == 1 ? '每天' : row.execDateType == 2 ? '每周' : '每月';
return `重复(${html})`;
} else if (row.effectType == 2) {
return '立即执行';
/** '单次执行类型(1:立即执行; 0:定时执行)' **/
if (row.execType == 0) {
return `单次(<i class="el-icon-time fz18 vertical-middle"></i>${formatDateTimeByType(row.execTime, 'yyyy-MM-dd HH:mm:ss')})`;
} else {
return '单次(立即执行)';
}
}
}
},
{ label: '营销方式', prop: 'marketingType', minWidth: '160', align: 'left' },
{ label: '营销方式', prop: 'marketingType', minWidth: '140', align: 'left' },
{
label: '数据对话',
prop: 'marketingActivityName',
width: '160',
minWidth: '140',
align: 'left',
formatter(row) {
return row.marketingActivityName || '--';
}
},
{ label: '营销人次', prop: 'timesForPeople', width: '160', align: 'left' },
{ label: '营销人次', prop: 'timesForPeople', minWidth: '120', align: 'left' },
{
label: '上线状态',
prop: 'onlineStatus',
width: '160',
minWidth: '140',
align: 'left',
formatter(row) {
let result = '--';
......
......@@ -5,7 +5,7 @@
图文消息(共{{ total }}条) <el-input v-model="listParams.searchName" clearable class="w200 ml10" placeholder="请输入标题/作者" @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
</div>
<div class="fr">
<el-button type="primary" @click="add">新建图文</el-button>
<!-- <el-button type="primary" @click="add">新建图文</el-button> -->
<el-button @click="refresh">刷新列表</el-button>
</div>
</div>
......
......@@ -102,6 +102,10 @@
<div>{{ scope.row.delTaskReason || '暂无记录' }}</div>
<el-button type="text" slot="reference">回访取消</el-button>
</el-popover>
<span class="fz13" v-if="scope.row.visiteStatus === 7">
分配失败&nbsp;&nbsp;
<el-button type="text" @click="allocateData(scope.row)">重新分配</el-button>
</span>
</template>
</el-table-column>
</el-table>
......@@ -249,8 +253,8 @@ export default {
});
if (res.errorCode === 0) {
this.$tips({ type: 'warning', message: '分配成功' });
this.getTableList();
}
this.getTableList();
} else {
this.$tips({ type: 'warning', message: '门店不存在,不能执行分配操作' });
}
......
......@@ -578,6 +578,7 @@ export default {
card.storeMode = this.storeMode;
card.storeWidgetKey = this.uuid;
card.manualGetFlag = 1; // 永远都设置为 手动开启
card.giveFlag = 0; // 永远都设置为关闭转赠
// 这里判断部分门店是否为空
if (card.storeMode) {
let data = await this.$refs.storeCard.getRightList();
......@@ -588,9 +589,6 @@ export default {
return;
}
}
console.log('======');
console.log(card);
console.log('======');
params.card = JSON.stringify(card);
this.submitLoading = true;
saveUpdateCard(params)
......
......@@ -25,7 +25,12 @@
<div class="pb20">
<span class="dm-input_label pr10">选择会员</span>
<el-radio :disabled="isInfo" v-model="form.memberType" :label="0">会员筛选</el-radio>
<el-radio :disabled="isInfo" v-model="form.memberType" :label="1">指定会员</el-radio>
<el-radio :disabled="isInfo" v-model="form.memberType" :label="1">
指定会员
<el-tooltip class="item" effect="dark" content="指定会员下最多选择1000人" open-delay="200">
<i class="el-icon-info ml5 minor-font-color"></i>
</el-tooltip>
</el-radio>
<el-radio :disabled="isInfo" v-model="form.memberType" :label="2">会员分组</el-radio>
</div>
<div v-show="!form.memberType">
......
......@@ -43,7 +43,12 @@
<div class="pt10 pb20">
<span class="dm-input_label">选择会员:</span>
<el-radio v-model="info.memberType" :label="0" disabled>会员筛选</el-radio>
<el-radio v-model="info.memberType" :label="1" disabled>指定会员</el-radio>
<el-radio v-model="info.memberType" :label="1" disabled>
指定会员
<el-tooltip class="item" effect="dark" content="指定会员下最多选择1000人" open-delay="200">
<i class="el-icon-info ml5 minor-font-color"></i>
</el-tooltip>
</el-radio>
<el-radio v-model="info.memberType" :label="2" disabled>会员分组</el-radio>
</div>
<div v-show="!info.memberType">
......
......@@ -17,7 +17,12 @@
<div class="pt10 pb20">
<span class="dm-input_label">选择会员:</span>
<el-radio v-model="info.memberType" :label="0">会员筛选</el-radio>
<el-radio v-model="info.memberType" :label="1">指定会员</el-radio>
<el-radio v-model="info.memberType" :label="1">
指定会员
<el-tooltip class="item" effect="dark" content="指定会员下最多选择1000人" open-delay="200">
<i class="el-icon-info ml5 minor-font-color"></i>
</el-tooltip>
</el-radio>
<el-radio v-model="info.memberType" :label="2">会员分组</el-radio>
</div>
<div v-show="info.memberType === 0">
......
......@@ -26,7 +26,12 @@
<div class="pt10 pb20">
<span class="dm-input_label">选择会员:</span>
<el-radio v-model="info.memberType" :disabled="isInfo" :label="0">会员筛选</el-radio>
<el-radio v-model="info.memberType" :disabled="isInfo" :label="1">指定会员</el-radio>
<el-radio v-model="info.memberType" :disabled="isInfo" :label="1">
指定会员
<el-tooltip class="item" effect="dark" content="指定会员下最多选择1000人" open-delay="200">
<i class="el-icon-info ml5 minor-font-color"></i>
</el-tooltip>
</el-radio>
<el-radio v-model="info.memberType" :disabled="isInfo" :label="2">会员分组</el-radio>
</div>
<div v-show="info.memberType === 0">
......
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