Commit b2f54ddc by chenxin

Merge branch 'cx' into 'dev'

Cx

See merge request !6
parents f4f87885 bd959b60
......@@ -125,6 +125,9 @@ a:hover {
.mt20{
margin-top: 20px!important;
}
.mt30{
margin-top: 30px!important;
}
.ml5{
margin-left: 5px!important;
}
......@@ -283,6 +286,9 @@ a:hover {
.line-height2{
line-height:2;
}
.line-height1_5{
line-height:1.5;
}
.line-height1{
line-height:1;
}
......
......@@ -172,3 +172,17 @@
background-color: #ebeef5;
z-index: 4;
}
// 只读遮罩 - 无颜色
.el-view-mask {
position: relative;
&:before{
position: absolute;
z-index: 1000;
width: 100%;
height: 100%;
left: 0;
top: 0;
content:'';
}
}
\ No newline at end of file
......@@ -58,7 +58,18 @@ export default {
type: String,
default: '/api-marketing/upload-game-image'
},
labelStyle: Object
labelStyle: Object,
// 限制图片大小
limit: {
type: Object,
default() {
return {
type: false,
width: 100,
height: 100
};
}
}
},
data() {
return {
......
......@@ -7,7 +7,7 @@
<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>1.支持插入会员信息变量,如下表所示,{数字}为可插入变量,注意变量值长度,以免超过300字文本上限。</p>
<p>2.支持插入H5链接;支持插入小程序链接。</p>
<p>3.支持换行;不支持富文本格式。</p>
<p>会员信息变量表:</p>
......
......@@ -7,6 +7,36 @@ import config from '@/config';
const maxSize = 2 * 1024 * 1024; //5M
axios.defaults.withCredentials = true;
function verificationPicFile(file, l_width, l_height) {
return new Promise((resolve, reject) => {
const filePath = file.value;
if (filePath) {
//读取图片数据
const filePic = file.files[0];
let reader = new FileReader();
reader.onload = function(e) {
var data = e.target.result;
//加载图片获取图片真实宽度和高度
var image = new Image();
image.onload = function() {
var width = image.width;
var height = image.height;
if (width === l_width && height === l_height) {
resolve();
} else {
file.value = '';
reject(new Error(`上传图片尺寸应为${l_width}*${l_height}`));
}
};
image.src = data;
};
reader.readAsDataURL(filePic);
} else {
reject();
}
});
}
export default {
inserted: function(el, binding) {
el.addEventListener('change', function() {
......@@ -15,35 +45,52 @@ export default {
binding.value.$tips({ type: 'warning', message: '上传图片不能大于2M' });
return;
}
binding.value.disabled = true;
let formData = new FormData();
formData.append(binding.value.fileType, el.files[0]);
formData.append('requestProject', 'gic-web');
axios
.post(config.api + binding.value.url, formData)
.then(res => {
console.log(res);
binding.value.loading = false;
el.value = '';
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);
// 启用限制图片大小
if (binding.value.limit.type) {
const { width, height } = binding.value.limit;
verificationPicFile(el, width, height)
.then(res => {
upload();
})
.catch(err => {
binding.value.$tips({ type: 'warning', message: err.message });
});
} else {
upload();
}
function upload() {
binding.value.disabled = true;
let formData = new FormData();
formData.append(binding.value.fileType, el.files[0]);
formData.append('requestProject', 'gic-web');
axios
.post(config.api + binding.value.url, formData)
.then(res => {
console.log(res);
binding.value.loading = false;
el.value = '';
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 {
(binding.value.model.code = res.data.result.imageFiledCode), (binding.value.model.imgUrl = res.data.result.qcloudImageUrl);
binding.value.model.mediaId = res.data.result.imageMediaId;
binding.value.model.wxImg = res.data.result.wxImg || res.data.result.imageUrl || '';
}
binding.value.$tips({ type: 'success', message: '上传成功' });
} else {
(binding.value.model.code = res.data.result.imageFiledCode), (binding.value.model.imgUrl = res.data.result.qcloudImageUrl);
binding.value.model.mediaId = res.data.result.imageMediaId;
binding.value.model.wxImg = res.data.result.wxImg || res.data.result.imageUrl || '';
binding.value.$tips({ type: 'error', message: res.data.message || '上传失败' });
}
binding.value.$tips({ type: 'success', message: '上传成功' });
} else {
binding.value.$tips({ type: 'error', message: res.data.message || '上传失败' });
}
binding.value.disabled = false;
})
.catch(error => {
binding.value.loading = false;
binding.value.disabled = false;
binding.value.$tips({ type: 'error', message: error.msg || '上传失败' });
});
binding.value.disabled = false;
})
.catch(error => {
binding.value.loading = false;
binding.value.disabled = false;
binding.value.$tips({ type: 'error', message: error.msg || '上传失败' });
});
}
});
}
};
import calllog from '../../views/calllog';
import index from '../../views/calllog/index';
import calllog from '../../views/calllog/calllog';
import record from '../../views/calllog/record';
export default {
path: 'calllog',
name: '通话记录',
component: calllog
component: index,
meta: {},
redirect: 'calllog/index',
children: [
{
path: 'index',
name: '通话记录',
component: calllog,
meta: {}
},
{
path: 'record',
name: '录音存储设置',
component: record,
meta: {}
}
]
};
......@@ -105,3 +105,10 @@ export default {
return regTest.test(v);
}
};
/*
* 判断字符串是否为null,undefined,空
*/
export const isEmpty = function(v) {
return v === null || v === undefined || v === '';
};
<template>
<section class="dm-wrap">
<div class="pb22 clearfix">
<el-date-picker v-model="dateTime" :picker-options="pickerOptions" class="w250" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="getTableList"></el-date-picker>
<el-select class="dm-select" clearable="" v-model="listParams.callStatus" placeholder="选择通话状态" @change="getTableList">
<el-option v-for="(v, i) in callStatusOption" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-select class="dm-select" clearable v-model="listParams.telTaskType" placeholder="选择类型" @change="getTableList">
<el-option v-for="(v, i) in telTaskTypeOption" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-input v-model="listParams.phoneNumber" class="w200" placeholder="输入号码查询" clearable @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<!-- <el-button type="primary" class="fr" @click="$router.push('/calllog/record')">录音设置</el-button> -->
</div>
<el-table tooltipEffect="light" :data="tableList" style="width:100%" v-loading="loading">
<el-table-column align="left" width="160" prop="callBeginTime" label="呼叫时间">
<template slot-scope="scope">
{{ formatDateTimeByType(scope.row.callBeginTime, 'yyyy-MM-dd-HH-mm-ss') }}
</template>
</el-table-column>
<el-table-column align="left" min-width="150" prop="clerkName" label="主叫">
<template slot-scope="scope">
<img class="vertical-middle table__avatar--40" :src="scope.row.clerkImage || defaultAvatar" width="60" height="60" alt="" />
<div class="inline-block vertical-middle">
<p class="table-name--ellipsis">{{ scope.row.clerkName || '--' }}</p>
<p class="fz13 gray">{{ scope.row.storeGroupName || '--' }}</p>
</div>
</template>
</el-table-column>
<el-table-column align="left" min-width="150" prop="memberId" label="被叫(会员)">
<template slot-scope="scope">
<img class="vertical-middle table__avatar--40" :src="filterAvatar(scope.row.photoUrl)" width="60" height="60" alt="" />
<div class="inline-block vertical-middle">
<p class="table-name--ellipsis">{{ scope.row.name || '--' }}</p>
<p class="fz13 gray">{{ scope.row.phoneNumber || '--' }}</p>
</div>
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="status" label="通话状态">
<template slot-scope="scope">
{{ scope.row.callStatus === 1 ? '未接通' : scope.row.callStatus === 2 ? '接通' : '成功' }}
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="status" label="类型">
<template slot-scope="scope">
{{ scope.row.telTaskType !== 1 ? scope.row.ecmName : '不良评价回访' }}
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="callTime" label="通话时长(秒)">
<template slot-scope="scope">
{{ scope.row.callTime }}
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="callFee" label="录音">
<template slot-scope="scope">
<a v-if="scope.row.recordUrl && scope.row.callStatus == 2" :href="scope.row.recordUrl" target="_blank" title="通话录音">通话录音</a>
</template>
</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="[10, 20, 30, 40]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></el-pagination>
</section>
</template>
<script>
import { callLogList } from '@/service/api/calllogApi.js';
import tableMethods from '@/mixins/tableMethods.js';
import { formatDateTimeByType } from '@/utils/index.js';
import filterAvatar from '@/mixins/filterAvater.js';
export default {
name: 'call-log',
mixins: [filterAvatar, tableMethods],
data() {
const that = this;
return {
formatDateTimeByType,
dateTime: [Date.now() - 30 * 24 * 60 * 60 * 1000, Date.now()],
callStatusOption: [{ value: '', label: '全部' }, { value: 1, label: '未接通' }, { value: 2, label: '接通' }],
telTaskTypeOption: [{ value: '', label: '全部' }, { value: 1, label: '不良评价回访' }, { value: 2, label: 'ECM话务任务' }],
listParams: { marketingType: '', sceneSettingId: '', phoneNumber: '', currentPage: 1, pageSize: 20, callStatus: '', telTaskType: '', memberId: '', storeId: '', referId: '' },
total: 0,
loading: false,
tableList: [],
pickerOptions: {
onPick({ maxDate, minDate }) {
if (new Date(maxDate).getTime() - new Date(minDate).getTime() > 90 * 24 * 60 * 60 * 1000) {
that.$tips({ type: 'warning', message: '时间范围不能大于90天' });
that.$nextTick(_ => {
that.dateTime = ['', ''];
});
}
},
disabledDate(time) {
return time.getTime() > Date.now();
}
}
};
},
created() {
this.$store.commit('aside_handler', false);
this.$store.commit('mutations_breadcrumb', [{ name: '会员管理', path: '' }, { name: '通话记录', path: '' }]);
this.getTableList();
},
methods: {
//列表请求
async getTableList() {
if (this.dateTime) {
this.listParams.beginTime = formatDateTimeByType(this.dateTime[0], 'yyyy-MM-dd');
this.listParams.endTime = formatDateTimeByType(this.dateTime[1], 'yyyy-MM-dd');
} else {
this.listParams.beginTime = '';
this.listParams.endTime = '';
}
this.loading = true;
try {
let res = await callLogList(this.listParams);
if (res.errorCode === 0) {
this.tableList = res.result.result || [];
this.total = res.result.totalCount;
}
} catch (err) {
this.$tips({ type: 'error', message: '请求列表出错' });
}
this.loading = false;
}
}
};
</script>
<template>
<section class="dm-wrap">
<div class="pb22 clearfix">
<el-date-picker v-model="dateTime" :picker-options="pickerOptions" class="w250" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="getTableList"></el-date-picker>
<el-select class="dm-select" clearable="" v-model="listParams.callStatus" placeholder="选择通话状态" @change="getTableList">
<el-option v-for="(v, i) in callStatusOption" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-select class="dm-select" clearable v-model="listParams.telTaskType" placeholder="选择类型" @change="getTableList">
<el-option v-for="(v, i) in telTaskTypeOption" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-input v-model="listParams.phoneNumber" class="w200" placeholder="输入号码查询" clearable @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
</div>
<el-table tooltipEffect="light" :data="tableList" style="width:100%" v-loading="loading">
<el-table-column align="left" width="160" prop="callBeginTime" label="呼叫时间">
<template slot-scope="scope">
{{ formatDateTimeByType(scope.row.callBeginTime, 'yyyy-MM-dd-HH-mm-ss') }}
</template>
</el-table-column>
<el-table-column align="left" min-width="150" prop="clerkName" label="主叫">
<template slot-scope="scope">
<img class="vertical-middle table__avatar--40" :src="scope.row.clerkImage || defaultAvatar" width="60" height="60" alt="" />
<div class="inline-block vertical-middle">
<p class="table-name--ellipsis">{{ scope.row.clerkName || '--' }}</p>
<p class="fz13 gray">{{ scope.row.storeGroupName || '--' }}</p>
</div>
</template>
</el-table-column>
<el-table-column align="left" min-width="150" prop="memberId" label="被叫(会员)">
<template slot-scope="scope">
<img class="vertical-middle table__avatar--40" :src="filterAvatar(scope.row.photoUrl)" width="60" height="60" alt="" />
<div class="inline-block vertical-middle">
<p class="table-name--ellipsis">{{ scope.row.name || '--' }}</p>
<p class="fz13 gray">{{ scope.row.phoneNumber || '--' }}</p>
</div>
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="status" label="通话状态">
<template slot-scope="scope">
{{ scope.row.callStatus === 1 ? '未接通' : scope.row.callStatus === 2 ? '接通' : '成功' }}
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="status" label="类型">
<template slot-scope="scope">
{{ scope.row.telTaskType !== 1 ? scope.row.ecmName : '不良评价回访' }}
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="callTime" label="通话时长(秒)">
<template slot-scope="scope">
{{ scope.row.callTime }}
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="callFee" label="录音">
<template slot-scope="scope">
<a v-if="scope.row.recordUrl && scope.row.callStatus == 2" :href="scope.row.recordUrl" target="_blank" title="通话录音">通话录音</a>
</template>
</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="[10, 20, 30, 40]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></el-pagination>
</section>
<div>
<router-view />
</div>
</template>
<script>
import { callLogList } from '@/service/api/calllogApi.js';
import tableMethods from '@/mixins/tableMethods.js';
import { formatDateTimeByType } from '@/utils/index.js';
import filterAvatar from '@/mixins/filterAvater.js';
export default {
name: 'call-log',
mixins: [filterAvatar, tableMethods],
data() {
const that = this;
return {
formatDateTimeByType,
dateTime: [Date.now() - 30 * 24 * 60 * 60 * 1000, Date.now()],
callStatusOption: [{ value: '', label: '全部' }, { value: 1, label: '未接通' }, { value: 2, label: '接通' }],
telTaskTypeOption: [{ value: '', label: '全部' }, { value: 1, label: '不良评价回访' }, { value: 2, label: 'ECM话务任务' }],
listParams: { marketingType: '', sceneSettingId: '', phoneNumber: '', currentPage: 1, pageSize: 20, callStatus: '', telTaskType: '', memberId: '', storeId: '', referId: '' },
total: 0,
loading: false,
tableList: [],
pickerOptions: {
onPick({ maxDate, minDate }) {
if (new Date(maxDate).getTime() - new Date(minDate).getTime() > 90 * 24 * 60 * 60 * 1000) {
that.$tips({ type: 'warning', message: '时间范围不能大于90天' });
that.$nextTick(_ => {
that.dateTime = ['', ''];
});
}
},
disabledDate(time) {
return time.getTime() > Date.now();
}
}
};
},
created() {
this.$store.commit('aside_handler', false);
this.$store.commit('mutations_breadcrumb', [{ name: '会员管理', path: '' }, { name: '通话记录', path: '' }]);
this.getTableList();
},
methods: {
//列表请求
async getTableList() {
if (this.dateTime) {
this.listParams.beginTime = formatDateTimeByType(this.dateTime[0], 'yyyy-MM-dd');
this.listParams.endTime = formatDateTimeByType(this.dateTime[1], 'yyyy-MM-dd');
} else {
this.listParams.beginTime = '';
this.listParams.endTime = '';
}
this.loading = true;
try {
let res = await callLogList(this.listParams);
if (res.errorCode === 0) {
this.tableList = res.result.result || [];
this.total = res.result.totalCount;
}
} catch (err) {
this.$tips({ type: 'error', message: '请求列表出错' });
}
this.loading = false;
}
}
name: 'calllog'
// created() {}
};
</script>
<template>
<section class="dm-wrap" v-loading="loading" element-loading-text="数据保存中">
<el-alert type="info" :closable="false" show-icon>
<p slot="title" class="fz16 info-color line-height1_5">使用录音功能需开启录音服务,未开启则录音不作保存。开启后,仅支持保存从开启当天起的录音数据,未开启录音服务之前的历史录音数据不做同步。选择不同保存时长收费标准不同,当前收费标准如下:1、三个月 0.04元/分钟 2、六个月 0.06元/分钟 3、十二个月 0.1元/分钟</p>
</el-alert>
<section class="mt20">
<div class="mb20">
<span class="dm-input_label mr10">开启录音服务</span>
<el-switch v-model="swithKey"></el-switch>
</div>
<div>
<span class="dm-input_label mr10">录音保存时长</span>
<el-radio-group v-model="saveTime">
<el-radio :label="3">三个月</el-radio>
<el-radio :label="6">六个月</el-radio>
<el-radio :label="9">十二个月</el-radio>
</el-radio-group>
</div>
<div class="mt30"><el-button type="primary" class="save" @click="submit">保存</el-button></div>
</section>
</section>
</template>
<script>
export default {
name: 'record',
data() {
return {
swithKey: false,
saveTime: 3,
loading: false
};
},
methods: {
// getRecordDetail() {}
submit() {
this.loading = true;
setTimeout(() => {
this.loading = false;
this.$tips({ type: 'success', message: '保存成功!' });
// this.$tips({ type: 'error', message: '删除失败!' });
}, 2000);
}
},
created() {
this.$store.commit('aside_handler', false);
this.$store.commit('mutations_breadcrumb', [{ name: '会员管理', path: '' }, { name: '通话记录', path: '/calllog/index' }, { name: '录音存储设置', path: '' }]);
}
};
</script>
<style scoped>
.save {
margin-left: 98px;
}
</style>
<template>
<section class="dm-form__wrap">
<!-- TODO: 1接口没有这个参数 -->
<h3 class="dm-title__label">分享设置</h3>
<el-form-item label="分享到朋友圈" class="width50 is-required">
<el-radio-group v-model="shareGroup">
<el-form-item label="分享设置" class="width50 is-required">
<el-radio-group v-model="form.shareFlag">
<el-radio :label="1">可分享</el-radio>
<el-radio :label="2">不可分享</el-radio>
<el-radio :label="0">不可分享</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="分享给朋友" class="width50 is-required">
<el-radio-group v-model="shareFriend">
<el-radio :label="1">可分享</el-radio>
<el-radio :label="2">不可分享</el-radio>
</el-radio-group>
<el-form-item v-if="form.shareFlag === 1" label="分享图" prop="shareImg.imgUrl" class="width50" :rules="{ required: true, message: '请上传分享图片', trigger: 'blur' }">
<dm-upload-avatar :model.sync="form.shareImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:高度200px*200px" :disabled="isInfo"></dm-upload-avatar>
</el-form-item>
<el-form-item label="分享图" class="width50 is-required">
<dm-upload-avatar :model.sync="shareImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:高度200px*200px" :disabled="isInfo"></dm-upload-avatar>
<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>
</el-form-item>
<el-form-item label="分享标题" prop="shareTitle" class="width50">
<dm-input v-model="shareTitle" class="w400" placeholder="请输入分享标题" :disabled="isInfo" :maxlength="20"></dm-input>
</el-form-item>
<el-form-item label="分享描述" prop="shareTextInfo" class="width50">
<dm-input type="textarea" class="w400" :rows="4" v-model="shareTextInfo" placeholder="请输入分享描述" :disabled="isInfo" :maxlength="50"></dm-input>
<el-form-item v-if="form.shareFlag === 1" label="分享描述" prop="shareTextInfo" class="width50" :rules="{ required: true, message: '描述不能为空', trigger: 'blur' }">
<dm-input type="textarea" class="w400" :rows="4" v-model="form.shareTextInfo" placeholder="请输入分享描述" :disabled="isInfo" :maxlength="50"></dm-input>
</el-form-item>
</section>
</template>
<script>
import dmUploadAvatar from '@/components/upload/avatar';
export default {
props: {
shareGroup: {
type: Number,
default: 1
},
shareFriend: {
type: Number,
default: 1
},
shareImg: {
form: {
type: Object,
default() {
return {
imgUrl: '',
code: ''
shareFlag: 1,
shareTitle: '',
shareTextInfo: '',
shareImg: {
code: '',
imgUrl: require("./img/default-share.png"), // eslint-disable-line
wxImg: ''
}
};
}
},
shareTitle: {
type: String,
default: ''
},
shareTextInfo: {
type: String,
default: ''
ruleShareChange: {
type: Function
},
isInfo: {
type: Boolean,
......@@ -59,10 +48,15 @@ export default {
}
},
watch: {
childData: {
handler(val) {},
deep: true
}
// childData: {
// handler(val) {
// console.log(val);
// },
// deep: true
// }
},
components: {
dmUploadAvatar
}
};
</script>
<template>
<section class="dm-form__wrap clearfix">
<h3 class="dm-title__label">
参与门槛
<i class="iconfont icon-xinxixianshi pl5 gray"></i>
<span class="gray fz13">满足参与门槛会员才可以参与游戏</span>
</h3>
<el-form-item label="参与门槛" prop="memberType">
<el-radio v-model="form.memberType" :label="0">所有用户</el-radio>
<el-radio v-model="form.memberType" :label="1">会员筛选</el-radio>
<el-radio v-model="form.memberType" :label="2">会员分组</el-radio>
</el-form-item>
<!-- 会员筛选 -->
<el-form-item label="选择会员" v-if="form.memberType === 1">
<vue-gic-people :projectName="projectName" :isAdd="isAdd" :triggerReset="true" :useId="thresholdData.useId" :hasSearchData="thresholdData.hasSearchData" :sceneValue="sceneValue" ref="peopleFilter" @findFilter="findFilter" @getBackData="getBackData" @editHide="editHide" @editShow="editShow" @hideBtn="hideBtn" />
<div class="gic-people--button" v-show="toggleTag">
<el-button size="small" type="primary" @click="getData">确 定</el-button>
<el-button size="small" @click="cancelFilter">取 消</el-button>
</div>
</el-form-item>
<!-- 会员分组 -->
<vue-gic-member-group v-if="form.memberType === 2" :defaltSelected="thresholdData.defaltSelected" :height="400" :projectName="projectName" :headerList="headerList" @handleDataTransferred="handleDataTransferred" @handleDataLeft="handleDataLeft"></vue-gic-member-group>
<div class="width60 fl">
<el-form-item label="提示图片" prop="tipsImg">
<dm-upload-avatar :model.sync="form.tipsImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸,600*600,格式为PNG\JPG\GIF,大小不超过2MB" :disabled="isInfo"></dm-upload-avatar>
</el-form-item>
<el-form-item label="提示文字" prop="tipTitle">
<dm-input v-model="form.tipTitle" type="textarea" placeholder="最多输入60个字" :maxlength="60" class="w400" :rows="6"></dm-input>
</el-form-item>
</div>
<div class="width40 fr">
<div class="game-tips__preview">
<div class="game-tips__preview__inner">
<p class="game-tips__preview--title">你还未满足参与游戏条件!</p>
<img class="game-tips__preview--img" :src="form.tipsImg.imgUrl || defaultImg" alt="" />
<p class="game-tips__preview--desc">{{ form.tipTitle }}</p>
</div>
</div>
</div>
</section>
</template>
<script>
import dmUploadAvatar from '@/components/upload/avatar';
// 参与门槛组件
export default {
name: 'threshold',
props: {
thresholdData: {
type: Object,
default() {
return {
searchParams: '', // 会员筛选
hasSearchData: '', // 反显数据保存
getSaveData: '', // 会员筛选回显保存的数据
useId: '', // 会员筛选filter
memberGroupIds: '', // 会员分组
defaltSelected: [] // 会员分组默认穿梭窗已选入数据
};
}
},
form: {
type: Object
},
isAdd: {
type: Boolean,
default: true
}
},
data() {
return {
// 会员分组可传参数
projectName: 'marketing', // 默认是memberTag
headerList: ['isRealTime', 'latestUpdateTime', 'updateType', 'effectiveStatus', 'effectiveDate'],
effectiveStatus: 1, // 不传: 所有状态 1: 有效 0: 失效
// 人群筛选器可传参数
// memberGroupIds: '', // 传入数据 放入
sceneValue: 'member', // 场景值
toggleTag: false, // 控制按钮显示的参数,仅供参考,可自行修改
saveTag: false
};
},
components: {
dmUploadAvatar
},
methods: {
/**---------人群筛选器的方法-------------*/
getData() {
this.$refs.peopleFilter.confirmSet();
},
// 子组件触发父组件事件,返回过滤条件数据
findFilter(value) {
this.thresholdData.searchParams = value;
},
// 取消
cancelFilter() {
this.$refs.peopleFilter.cancelSet();
},
// 获取需要回显的数据, 供保存时候使用
getBackData(val) {
this.thresholdData.getSaveData = val; // 回显数据写在父组件对象中
},
// 显示编辑,保存按钮隐藏,确认按钮显示 (子组件会调用)
editShow() {
this.toggleTag = true;
this.saveTag = false;
},
// 显示保存按钮,隐藏确认按钮显示 (子组件会调用)
editHide() {
this.toggleTag = false;
this.saveTag = true;
},
// 隐藏保存按钮和确认按钮 (子组件会调用)
hideBtn() {
this.toggleTag = false;
this.saveTag = false;
},
/**---------会员分组的方法-------------*/
handleDataTransferred(data) {
// 会员分组 情况下 memberSearchDTO 传数组字符串
if (this.form.memberType === 2) {
this.thresholdData.memberGroupIds = data
.map(v => v.memberTagGroupId)
.filter(v => v)
.join(',');
}
},
handleDataLeft(selectedData, selectionToRemove) {
// 删除右侧
this.thresholdData.memberGroupIds = selectedData
.map(v => v.memberTagGroupId)
.filter(v => v)
.join(',');
}
}
};
</script>
......@@ -168,20 +168,10 @@
</div>
</el-form-item>
</section>
<!-- <section class="dm-form__wrap">
<h3 class="dm-title__label">分享设置</h3>
<el-form-item label="分享图片" class="width50">
<dm-upload-avatar :model.sync="form.shareImg" label="上传图片" tips="图片建议尺寸:高度200*200"></dm-upload-avatar>
</el-form-item>
<el-form-item label="分享标题" prop="shareTitle" class="width50">
<dm-input class="w400" v-model="form.shareTitle" :maxlength="20"></dm-input>
</el-form-item>
<el-form-item label="分享描述" prop="shareTextInfo" class="width50">
<dm-input class="w400" type="textarea" :rows="4" v-model="form.shareTextInfo" :maxlength="50"></dm-input>
</el-form-item>
</section> -->
<!-- 分享设置 -->
<dm-share :form="form" ref="share"></dm-share>
<dm-share :form="form"></dm-share>
<!-- 参与门槛 -->
<dm-threshold :form="form" :isAdd="isAdd" :thresholdData="thresholdData" ref="threshold"></dm-threshold>
<div class="btn-wrap_fixed" :class="{ on: asideShow }">
<el-button type="primary" @click="klflSave('form')" v-if="!isInfo">保 存</el-button>
<el-button @click="$router.go(-1)">返 回</el-button>
......@@ -205,6 +195,8 @@ import dmShare from '../common/share.vue';
import editAlertMixin from '../common/editAlertMixin.js';
import axios from 'axios';
import config from '@/config';
import dmShare from '../common/share.vue';
import dmThreshold from '../common/threshold.vue';
let result = {};
export default {
mixins: [editAlertMixin],
......@@ -214,6 +206,15 @@ export default {
loading: false,
tableLoading: false,
prizeLoading: false,
// 参与门槛组件传递的数据
thresholdData: {
searchParams: '', // 会员筛选
hasSearchData: '', // 反显数据保存
getSaveData: '', // 会员筛选回显保存的数据
useId: '', // 会员筛选filter
memberGroupIds: '', // 会员分组
defaltSelected: [] // 会员分组默认穿梭窗已选入数据
},
form: {
gameActivityId: this.$route.params.id,
gameName: '',
......@@ -227,15 +228,6 @@ export default {
},
dateTime: [],
gameIntroduction: '',
//分享
shareGroup: 1, // 1可分享 2不可分享 TODO:
shareTitle: '输入口令福利赢大奖',
shareTextInfo: '玩游戏,赢大奖~',
shareImg: {
code: '',
imgUrl: require("../common/share.jpg"), // eslint-disable-line
wxImg: ''
},
codeType: 1,
singleCode: '',
gameActivityCustomId: '',
......@@ -243,7 +235,25 @@ export default {
winRecordTitleFontColor: '', // 15.中奖记录文案色
tipFontColor: '', // 9.口令提示文案色
errorTipType: 1, // 16.报错提示色 黑底白字: 1; 红底白字: 2
tipUrl: ''
tipUrl: '',
// 分享
shareFlag: 1,
GameShareSettingId: '',
shareTitle: '大转盘中大奖',
shareTextInfo: '玩游戏,赢大奖~',
shareImg: {
code: '',
imgUrl: require("../common/img/default-share.png"), // eslint-disable-line
wxImg: ''
},
// 参与门槛
memberType: 0,
gameActivityAttendConditionId: '',
tipTitle: '尚未满足游戏参与条件,请多多努力。',
tipsImg: {
imgUrl: require('../common/img/default-attention.png'), // eslint-disable-line
code: ''
}
},
rules: {
gameName: { type: 'string', required: true, message: '游戏标题不能为空', trigger: 'blur' },
......@@ -293,7 +303,8 @@ export default {
strategy,
calculate,
codeDialog,
dmShare
dmShare,
dmThreshold
},
computed: {
asideShow() {
......@@ -483,14 +494,52 @@ export default {
this.form.gameName = result.game && result.game.gameName;
this.form.dateTime = result.game && [result.game.gameStartTime || '', result.game.gameEndTime || ''];
this.form.gameIntroduction = result.game && result.game.gameIntroduction;
//分享
this.form.shareTitle = result.game && result.game.shareTitle;
this.form.shareTextInfo = result.game && result.game.shareTextInfo;
this.form.shareImg = result.game && {
code: result.game.shareImgFieldCode,
imgUrl: result.game.shareImgUrl,
wxImg: result.game.shareImgUrlWX
};
this.form.shareFlag = result.game.shareFlag || 0;
// 分享
if (result.game.shareFlag === 1) {
const { shareTitle, shareTextInfo, shareImgFieldCode, shareImgUrl, shareImgUrlWX, gameShareSettingId } = result.game;
this.form = Object.assign(this.form, {
shareTitle,
shareTextInfo,
gameShareSettingId,
shareImg: {
code: shareImgFieldCode,
imgUrl: shareImgUrl,
wxImg: shareImgUrlWX
}
});
}
// 参与门槛
if (result.game.attendCondition) {
const { memberType, tipTitle, tipImageFieldCode, tipImageUrl, searchParams, gameActivityAttendConditionId } = result.game.attendCondition;
this.form = Object.assign(this.form, {
memberType,
tipTitle,
tipsImg: {
code: tipImageFieldCode,
imgUrl: tipImageUrl,
wxImg: ''
},
gameActivityAttendConditionId
});
if (memberType === 1) {
// 会员分组
this.thresholdData.searchParams = searchParams;
this.thresholdData.hasSearchData = searchParams;
this.thresholdData.getSaveData = searchParams || ''; // searchJson
if (res.result.searchId) {
this.thresholdData.useId = res.result.searchId || '';
this.thresholdData.hasSearchData = searchParams || '{}';
}
} else if (memberType === 2) {
// 会员筛选
this.thresholdData.defaltSelected = res.result.tagGroupList || [];
this.thresholdData.memberGroupIds = searchParams;
}
}
this.form.backgroudImg = {
imgUrl: result.game.backgroudImgUrl,
code: result.game.backgroudImgFieldCode
......@@ -529,6 +578,14 @@ export default {
},
//提交保存
async klflSave(formName) {
if (this.form.memberType === 1 && !this.thresholdData.getSaveData) {
this.$tips({ type: 'warning', message: '会员筛选不能为空' });
return;
}
if (this.form.memberType === 2 && !this.thresholdData.memberGroupIds) {
this.$tips({ type: 'warning', message: '会员分组不能为空' });
return;
}
// if (this.form.dateTime[0] < Date.now() && this.isAdd) {
// this.$tips({ type: 'warning', message: `开始时间不能小于当前时间` });
// return;
......@@ -563,8 +620,39 @@ export default {
errorTipType: this.form.errorTipType,
gameActivityCustomId: this.form.gameActivityCustomId // get-game-klfl-edit编辑回显的 游戏自定义配置表主键ID
},
tempActivityId: this.isAdd ? this.form.gameActivityId : '' // 与上面新建不同, 这个没
tempActivityId: this.isAdd ? this.form.gameActivityId : '', // 与上面新建不同, 这个没
shareFlag: this.form.shareFlag || 0
};
// 游戏分享
let shareSetting = {};
if (this.form.shareFlag) {
const { shareTitle, shareTextInfo, shareImg, GameShareSettingId } = this.form;
shareSetting = {
shareTitle,
shareTextInfo,
shareImgUrl: shareImg.imgUrl,
shareImgFieldCode: shareImg.code,
shareImgUrlWX: shareImg.wxImg
};
if (this.isEdit) {
shareSetting.GameShareSettingId = GameShareSettingId;
}
}
// attendCondition 参与门槛
const { memberType, tipTitle, tipsImg } = this.form;
let attendCondition = {
memberType: memberType || 0,
searchJson: memberType === 1 ? this.thresholdData.getSaveData : '',
searchParams: memberType === 1 ? this.thresholdData.searchParams : this.thresholdData.memberGroupIds,
tipTitle: tipTitle,
tipImageUrl: tipsImg.imgUrl || '',
tipImageFieldCode: tipsImg.code || ''
};
if (this.isEdit) {
attendCondition.gameActivityAttendConditionId = this.form.gameActivityAttendConditionId;
}
let gameCodePrizeList = [];
this.prizeList.map((v, i) => {
if (v.prizeReferType == 1) {
......@@ -611,7 +699,13 @@ export default {
}
});
params.gameCodePrizeList = gameCodePrizeList;
klflSave({ reqData: JSON.stringify(params) }).then(res => {
const postParam = {
reqData: JSON.stringify(params),
attendCondition: JSON.stringify(attendCondition),
shareSetting: JSON.stringify(shareSetting)
};
klflSave(postParam).then(res => {
if (res.errorCode === 0) {
this.$tips({ type: 'success', message: this.isAdd ? '新增成功' : '编辑成功' });
if (this.isAdd) {
......
......@@ -32,6 +32,7 @@
<p class="fz12 gray line-height2">2、请尽量保障账户余额大于您日常使用的额度,避免因余额不足导致业务中断</p>
<p class="fz12 gray line-height2">3、若未能及时充值或其他问题,请联系客户经理或客服人员</p>
<p class="fz12 gray line-height2">4、各项服务单价:短信验证码{{ allUnitFee.smsfee }}元/条,语音验证码{{ allUnitFee.voiceIfee }}元/条,双向呼叫{{ allUnitFee.callfee }}元/分钟</p>
<p class="fz12 gray line-height2">5、通话录音存储收费标准:「三个月0.04元/分钟」「六个月0.06元/分钟」「十二个月0.1元/分钟」,不满一分钟按一分钟收费</p>
</div>
</article>
<article v-if="step === 1">
......
......@@ -15,23 +15,591 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-arrowdown:before { content: "\e613"; }
.icon-tupian:before {
content: "\e6d2";
}
.icon-guaguaqia:before {
content: "\e6e0";
}
.icon-tupian2:before {
content: "\e654";
}
.icon-video:before {
content: "\e620";
}
.icon-dazhuanpan:before {
content: "\e602";
}
.icon-tupian1:before {
content: "\e6ff";
}
.icon-17:before {
content: "\e613";
}
.icon-shuangxianghujiao:before {
content: "\e617";
}
.icon-qiaquanyingxiao:before {
content: "\e614";
}
.icon-jia:before {
content: "\e652";
}
.icon-erweima:before {
content: "\e6bc";
}
.icon-lianjie:before {
content: "\e627";
}
.icon-fenzu:before {
content: "\e6d6";
}
.icon-mobanku:before {
content: "\e659";
}
.icon-yuyinxiaoxi:before {
content: "\e65d";
}
.icon-tijianyi:before {
content: "\e7b1";
}
.icon-tiaoxingma101:before {
content: "\e6f7";
}
.icon-shangchuan:before {
content: "\e667";
}
.icon-wxcard-copy:before {
content: "\e603";
}
.icon-wsc:before {
content: "\e60b";
}
.icon-chuzhi:before {
content: "\e60a";
}
.icon-jihua:before {
content: "\e607";
}
.icon-duanxin:before {
content: "\e61d";
}
.icon-qiaquan:before {
content: "\e60d";
}
.icon-duanxinyingxiao:before {
content: "\e615";
}
.icon-pintu:before {
content: "\e683";
}
.icon-shipin:before {
content: "\e63a";
}
.icon-liebiao:before {
content: "\e62f";
}
.icon-duanxin1:before {
content: "\e623";
}
.icon-youxi1:before {
content: "\e62d";
}
.icon-mendian1:before {
content: "\e82a";
}
.icon-hexiao:before {
content: "\e606";
}
.icon-weixinyingxiao:before {
content: "\e653";
}
.icon-fenxi:before {
content: "\e608";
}
.icon-shoujiyanzhengma:before {
content: "\e619";
}
.icon-shanchu:before {
content: "\e605";
}
.icon-next-:before {
content: "\e611";
}
.icon-xiaofei:before {
content: "\e609";
}
.icon-icon-QRcode:before {
content: "\e6fd";
}
.icon-qiaquanbao:before {
content: "\e604";
}
.icon-paixu_up-copy:before {
content: "\e600";
}
.icon-xinxiguanli:before {
content: "\e610";
}
.icon-huiyuanguanli:before {
content: "\e60c";
}
.icon-moshiqiehuan:before {
content: "\e616";
}
.icon-tonghuajilu:before {
content: "\e69b";
}
.icon-jilu:before {
content: "\e756";
}
.icon-xuanze:before {
content: "\e6d8";
}
.icon-duankailianjie:before {
content: "\e674";
}
.icon-xiaofei1:before {
content: "\e6e3";
}
.icon-xiaochengxu:before {
content: "\e61a";
}
.icon-fengefu:before {
content: "\e61f";
}
.icon-zhankai:before {
content: "\e742";
}
.icon-shouqi:before {
content: "\e743";
}
.icon-hudong:before {
content: "\e60e";
}
.icon-yuyin:before {
content: "\e650";
}
.icon-bianji:before {
content: "\e618";
}
.icon-wenzi:before {
content: "\e65b";
}
.icon-zhinengyinqing:before {
content: "\e734";
}
.icon-tuozhuai:before {
content: "\ea17";
}
.icon-xiaochengxu11:before {
content: "\e61b";
}
.icon-zhuzuoquan:before {
content: "\e60f";
}
.icon-tiaoxingma:before {
content: "\ea30";
}
.icon-weixin-:before {
content: "\e6ab";
}
.icon-huiyuanpengyou:before {
content: "\e6ad";
}
.icon-dianshangtupian:before {
content: "\e6ae";
}
.icon-jifen:before {
content: "\e6b0";
}
.icon-renzhengxinxi:before {
content: "\e6b2";
}
.icon-huiyuantequan-:before {
content: "\e6b3";
}
.icon-huiyuanjiazhifenlei:before {
content: "\e6b4";
}
.icon-sucaiku:before {
content: "\e6b5";
}
.icon-qiapian-:before {
content: "\e6b6";
}
.icon-qiaquan-:before {
content: "\e6ba";
}
.icon-wodeqiaquan-:before {
content: "\e6bb";
}
.icon-mima:before {
content: "\e6be";
}
.icon-moban:before {
content: "\e6bf";
}
.icon-fenxi-:before {
content: "\e6c0";
}
.icon-qiandao-:before {
content: "\e6c1";
}
.icon-qiandaopx:before {
content: "\e6c2";
}
.icon-pingjiaguanli:before {
content: "\e6c3";
}
.icon-shu:before {
content: "\e6c4";
}
.icon-pintu1:before {
content: "\e6c7";
}
.icon-mendian:before {
content: "\e6c8";
}
.icon-shanghuxinxi:before {
content: "\e6c9";
}
.icon-huafei:before {
content: "\e6ca";
}
.icon-icon_huiyuanguanli:before {
content: "\e6cb";
}
.icon-erjicaidan-jiesuanguanli:before {
content: "\e6cc";
}
.icon-xinyongqiajiesuanfuwu:before {
content: "\e6cd";
}
.icon-laowujiesuan:before {
content: "\e6ce";
}
.icon-huifu:before {
content: "\e6cf";
}
.icon-zidingyicaidan-:before {
content: "\e6d0";
}
.icon-zujian-lunbo:before {
content: "\e6d1";
}
.icon-cg-yuanshengguanggao:before {
content: "\e6d3";
}
.icon-youxi:before {
content: "\e6d4";
}
.icon-icon_zidingyiyemianshezhi:before {
content: "\e6d5";
}
.icon-daohang-:before {
content: "\e6d7";
}
.icon-huiyuan-:before {
content: "\e6d9";
}
.icon-shequ-zhutifenxiang:before {
content: "\e6da";
}
.icon-icon_yunxiazai:before {
content: "\e6e8";
}
.icon-Icon_addPhotoB:before {
content: "\e68a";
}
.icon-mobanxiaoxiku:before {
content: "\e6e9";
}
.icon-mobanxiaoxiqunfa:before {
content: "\e6ea";
}
.icon-yd-icon-upload2:before {
content: "\e6ec";
}
.icon-tubiaoweikong:before {
content: "\e7ae";
}
.icon-shaixuan-shi:before {
content: "\e687";
}
.icon-CSV:before {
content: "\e601";
}
.icon-huiyuanzaixiangoutong:before {
content: "\e708";
}
.icon-shiwufenpeijizhi:before {
content: "\e709";
}
.icon-guige:before { content: "\e9fa"; }
.icon-oa_nofind:before {
content: "\e612";
}
.icon-selected:before {
content: "\e6bd";
}
.icon-saomiao:before {
content: "\e65e";
}
.icon-icon02:before {
content: "\e622";
}
.icon-shipin1:before {
content: "\e625";
}
.icon-xiaochengxu1:before {
content: "\e61c";
}
.icon-gengduo:before {
content: "\e624";
}
.icon-xiazairizhi:before {
content: "\e621";
}
.icon-jifenmingxibiao:before {
content: "\e746";
}
.icon-jifenjiesuanguishu:before {
content: "\e747";
}
.icon-jifenchengbenpeizhi:before {
content: "\e748";
}
.icon-tuwenyangshi:before {
content: "\e61e";
}
.icon-dongjie:before {
content: "\e749";
}
.icon-yemianshezhi:before {
content: "\e74e";
}
.icon-leimupinleifenleileibie--1:before { content: "\e600"; }
.icon-xinxixianshi:before {
content: "\e74f";
}
.icon-zhankai:before { content: "\e742"; }
.icon-dianhua:before {
content: "\e655";
}
.icon-shouqi:before { content: "\e743"; }
.icon-xuanzewenjianshangchuan:before {
content: "\e62a";
}
.icon-dingdan-:before { content: "\e67e"; }
.icon-qiaquanhexiao:before {
content: "\e76e";
}
.icon-shuxingguanli:before { content: "\e65d"; }
.icon-shougongbiaoqian:before {
content: "\e782";
}
.icon-zhuzuoquan:before { content: "\e60f"; }
.icon-pingtaibiaoqianku:before {
content: "\e789";
}
.icon-shougongbiaoqianku:before {
content: "\e78a";
}
.icon-pinpai-:before { content: "\e6de"; }
.icon-wodebiaoqianku:before {
content: "\e78b";
}
.icon-icon_yunxiazai fz14:before { content: "\e6e8"; }
.icon-guijijiansuo:before {
content: "\e78c";
}
.icon-xiaofei2:before {
content: "\e78d";
}
.icon-jibenxinxi:before {
content: "\e78e";
}
.icon-yingxiaohuodongguanli:before {
content: "\e78f";
}
.icon-xinxixianshi1:before {
content: "\e791";
}
.icon-xinxixianshi2:before {
content: "\e792";
}
.icon-zhankai-:before {
content: "\e793";
}
.icon-zhongzhi:before {
content: "\e794";
}
.icon-xuanze-:before {
content: "\e7a2";
}
.icon-chakan:before {
content: "\e7a4";
}
.icon-shenhe:before {
content: "\e7a5";
}
.icon-daishenhe:before {
content: "\e7a6";
}
.icon-daishenhe1:before {
content: "\e7a8";
}
.icon-gengduo1:before {
content: "\e639";
}
.icon-yongjinjiesuanmingxi:before {
content: "\e7d9";
}
.icon-yongjinjiesuanguize:before {
content: "\e7da";
}
.icon-luyinzhong:before {
content: "\e6b7";
}
.icon-guanbi:before {
content: "\e626";
}
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.
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