Commit 55eee6ca by crushh

udpate: dist

parent 084ced0a
......@@ -416,4 +416,4 @@
}
}
}
}
\ No newline at end of file
}
......@@ -21,7 +21,7 @@ export default {
case 4:
str = '客户复购';
break;
case 5:
case 0:
str = '其它场景';
break;
}
......
import { requests } from './index';
const PREFIX = 'api-marketing/ai/';
//活动分页查询-统计
export const pageStatistics = params => requests(PREFIX + 'page-statistics', params, true);
......@@ -43,11 +44,12 @@ export const getLogs = params => requests('/api-marketing/page-activity-event-ex
// 获取AI数据统计详情
export const getCustomDetail = params => requests('/api-marketing/statistics/page-data-statistics-custom-detail', params, true, false, 'get');
//标签库-分页列表数据
export const platformTagPageListV2 = params => requests('/gic-member-tag-web/memberTag/platformTagPageListV2', params, true, false, 'get');
//标签库-标签值列表
export const pageMemberTagDetail = params => requests('/gic-member-tag-web/memberTag/pageMemberTagDetail', params, true, false, 'get');
//标签库-标签层级
export const platformHomePageV2 = params => requests('/gic-member-tag-web/memberTag/platformHomePageV2', params, true, false, 'get');
export const platformHomePageV2 = params => requests('/gic-member-tag-web/memberTag/platformHomePageByAI', params, true, false, 'get');
// 获取AI数据统计活动信息
export const getActivityInfo = params => requests('/api-marketing/statistics/get-activity-info', params, true, false, 'get');
......
......@@ -8,6 +8,11 @@ import router from '../../router/index';
import store from '../../store/index';
import Vue from 'vue';
/**
* 兼容 errorCode:0 || code:'0' 为正确返回的接口
*
*/
// 加载最小时间
const MINI_TIME = 300;
// 超时时间
......@@ -133,6 +138,8 @@ const requests = (url, data = {}, contentTypeIsJSON = false, isSilence = false,
.then(res => {
clearTimeout(_timer);
popRequest(_random);
resolve(res.data);
return;
if (res.data.errorCode !== 0 && res.data.code != 0) {
reject(res);
if (res.data.message.indexOf('抱歉') >= 0) {
......
import axios from 'axios';
import qs from 'qs';
import { Message } from 'element-ui';
/**
* 兼容 errorCode:1 || code:'0' 为正确返回的接口
*
*/
let __DEVELOPMENT = process.env.NODE_ENV === 'development';
let __PRODUCTION = process.env.NODE_ENV === 'production';
const service = axios.create();
service.defaults.timeout = 30000;
if (__DEVELOPMENT) {
service.defaults.withCredentials = true;
}
service.interceptors.request.use(
config => {
return config;
},
err => {
if (__DEVELOPMENT) {
console.log('>>>>>>>>>> request error >>>>>>>>>>');
}
return Promise.reject(err);
}
);
service.interceptors.response.use(
response => {
const { data, config } = response;
let err;
const { errorCode, code } = data;
switch (errorCode) {
case 1:
return data;
case 401:
Message({
message: '登录失效',
type: 'error'
});
__PRODUCTION && (window.location.href = '/gic-web/#/login');
break;
case undefined:
break;
default:
Message({
message: data.message,
type: 'error'
});
err = new Error(`${data.message}: ${config.url}`);
if (__DEVELOPMENT) {
console.log('>>>>>>>>>> response data error >>>>>>>>>>');
}
return Promise.reject(err);
}
switch (code) {
case '0':
return data.result;
case '401':
Message({
message: '登录失效',
type: 'error'
});
__PRODUCTION && (window.location.href = '/gic-web/#/login');
break;
default:
Message({
message: data.message,
type: 'error'
});
err = new Error(`${data.message}: ${config.url}`);
if (__DEVELOPMENT) {
console.log('>>>>>>>>>> response data error >>>>>>>>>>');
}
return Promise.reject(err);
}
},
err => {
const status = err.response.status;
switch (status) {
case 400:
err.message = '请求错误';
break;
case 401:
err.message = '未授权,请登录';
__PRODUCTION && (window.location.href = '/gic-web/#/login');
break;
case 403:
err.message = '拒绝访问';
break;
case 404:
err.message = `请求地址出错: ${err.response.config.url}`;
break;
case 408:
err.message = '请求超时';
break;
case 500:
err.message = '服务器内部错误';
break;
case 501:
err.message = '服务未实现';
break;
case 502:
err.message = '网关错误';
break;
case 503:
err.message = '服务不可用';
break;
case 504:
err.message = '网关超时';
break;
case 505:
err.message = 'HTTP版本不受支持';
break;
default:
break;
}
if (__DEVELOPMENT) {
console.log('>>>>>>>>>> response error >>>>>>>>>>');
}
Message({
message: '系统异常',
type: 'error'
});
return Promise.reject(err);
}
);
export function request(config, options = {}) {
const defaultConfig = {
headers: {
'Content-Type': 'application/json',
sign: localStorage.getItem('sign') || ''
},
params: {},
data: {}
};
config = Object.assign(defaultConfig, config);
if (config.url.match(/requestProject/) === null) {
config.url = config.url + '?requestProject=marketing';
}
// if (config.useName) {
// if (config.method.toLowerCase() === 'post') {
// config.data.requestProject = 'marketing';
// } else if (config.method.toLowerCase() === 'get') {
// config.params.requestProject = 'marketing';
// }
// }
if (config.useForm) {
config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
config.data = qs.stringify(config.data);
}
return service(config);
}
......@@ -11,7 +11,7 @@
</el-form-item>
</el-radio>
</el-form-item>
<el-form-item label="生日范围" prop="birthDate1" v-show="form.birth_type == 1 || form.birth_type == 3">
<el-form-item label="生日范围" prop="birthDate1" v-show="form.birth_type == 1 || form.birth_type == 3" required>
<el-date-picker value-format="timestamp" format="MM-dd" v-model="form.birthDate1" @change="handleDateChange" :picker-options="pickerOptions" type="daterange" placeholder="请选择生日范围" range-separator="~" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
</el-form-item>
<el-form-item label="生日范围" prop="birthDate2" v-show="form.birth_type == 2">
......@@ -42,9 +42,9 @@ let maxTimeMonth = null;
export default {
data() {
const birthDateValidtor = (rule, value, callback) => {
if ((this.form.birth_type == 1 || this.form.birth_type == 3) && !this.form.birthDate1.length) {
if ((this.form.birth_type == 1 || this.form.birth_type == 3) && !this.form.birthDate1) {
return callback(new Error('生日范围不能为空'));
} else if (this.form.birth_type == 2 && !this.form.birthDate2.length) {
} else if (this.form.birth_type == 2 && !this.form.birthDate2) {
return callback(new Error('生日范围不能为空'));
}
callback();
......@@ -125,11 +125,11 @@ export default {
computed: {
activeTime() {
let str = '';
if (this.form.birth_type == 1 && this.form.birthDate1.length) {
if (this.form.birth_type == 1 && this.form.birthDate1 && this.form.birthDate1.length) {
str = formatDateTimeByType(this.form.birthDate1[0], 'yyyy-MM-dd') + ' 至 ' + formatDateTimeByType(this.form.birthDate1[1], 'yyyy-MM-dd');
} else if (this.form.birth_type == 2 && this.form.birthDate2.length) {
} else if (this.form.birth_type == 2 && this.form.birthDate2 && this.form.birthDate2.length) {
str = formatDateTimeByType(this.form.birthDate2[0], 'yyyy-MM-dd') + ' 至 ' + formatDateTimeByType(this.form.birthDate2[1], 'yyyy-MM-dd');
} else if (this.form.birth_type == 3 && this.form.birthDate1.length) {
} else if (this.form.birth_type == 3 && this.form.birthDate1 && this.form.birthDate1.length) {
let start = this.form.birthDate1[0] - this.form.birth_days * 24 * 60 * 60 * 1000;
let end = this.form.birthDate1[1] - this.form.birth_days * 24 * 60 * 60 * 1000;
str = formatDateTimeByType(start, 'yyyy-MM-dd') + ' 至 ' + formatDateTimeByType(end, 'yyyy-MM-dd');
......
......@@ -20,7 +20,7 @@
<div class="section">
<birthSense ref="activeTime1" :data="birthTimeData" v-show="form.scene == 1" />
<holidaySense ref="activeTime2" :data="holidayTimeData" v-show="form.scene == 2" />
<activeTime ref="activeTime" :data="activeTimeData" v-show="form.scene == 3 || form.scene == 4 || form.scene == 5" />
<activeTime ref="activeTime" :data="activeTimeData" v-show="form.scene == 3 || form.scene == 4 || form.scene == 0" />
</div>
<dm-sub-title line>人群规则<span class="tips">针对选择的客户仅会执行一次外呼任务。</span></dm-sub-title>
<div class="section">
......@@ -29,13 +29,13 @@
<el-radio v-model="form.memberType" :label="1">客户分组</el-radio>
<div>
<div class="tips" style="margin:0 0 12px 0;">默认为权限范围内的全部客户</div>
<el-button v-if="form.memberType == 0 && !memberCrowdWidgetId && form.scene != 4" size="small" @click="ruleVisible = true">添加其他条件</el-button>
<ruleFilter v-show="form.memberType == 0 && form.scene != 4" :visiable.sync="ruleVisible" @save="handleRuleFilterSave" :memberCrowdWidgetId="memberCrowdWidgetId" />
<el-button v-if="form.memberType == 0 && !memberCrowdWidgetId && form.scene != 0" size="small" @click="ruleVisible = true">添加其他条件</el-button>
<ruleFilter v-show="form.memberType == 0 && form.scene != 0" :visiable.sync="ruleVisible" @save="handleRuleFilterSave" :memberCrowdWidgetId="memberCrowdWidgetId" />
<el-button v-if="form.memberType == 1 && !selectedGroup.length" size="small" @click="groupVisible = true">添加分组</el-button>
<gic-new-member-group v-show="form.memberType == 1" :visiable.sync="groupVisible" :defaltSelected="selectedGroup" @change="confirmGroupDialog" />
</div>
</el-form-item>
<el-form-item label="消费条件" v-if="form.scene == 4">
<el-form-item label="消费条件" v-if="form.scene == 0">
<div class="consumeLine">
<el-checkbox v-model="form.consume_days_flag" :true-label="1" :false-label="0" :disabled="disabledCheck" @change="handleLastconsume('days')">最近消费间隔</el-checkbox>
<el-input-number v-model="form.consume_days" controls-position="right" :max="730" :min="30" size="small" style="margin:0 10px;" />
......@@ -48,8 +48,8 @@
<el-checkbox v-model="form.consume_amount_flag" :true-label="1" :false-label="0" :disabled="disabledCheck" @change="handleLastconsume('amount')">累计消费金额</el-checkbox>
<el-input-number v-model="form.consume_amount" controls-position="right" :max="100000" :min="1" size="small" style="margin:0 10px;" />
</div>
<el-button size="small" @click="ruleVisible2 = true" v-if="!memberCrowdWidgetId">添加其它条件</el-button>
<ruleFilter :visiable.sync="ruleVisible2" @save="handleRuleFilterSave" :memberCrowdWidgetId="memberCrowdWidgetId" :hideId="hideId" />
<el-button size="small" @click="ruleVisible2 = true" v-if="form.memberType == 0 && !memberCrowdWidgetId">添加其它条件</el-button>
<ruleFilter v-show="form.memberType == 0" :visiable.sync="ruleVisible2" @save="handleRuleFilterSave" :memberCrowdWidgetId="memberCrowdWidgetId" :hideId="hideId" />
<span class="tips">勾选消费条件后,添加规则不支持选择【金字塔分层】</span>
</el-form-item>
<el-form-item label="预计覆盖人数">
......@@ -224,7 +224,7 @@
</dm-form-bottom>
</el-form>
<lib-message v-if="smsDialogVisible" :show.sync="smsDialogVisible" :useByEcm="false" @sendItem="handleSendItem"></lib-message>
<tagPop :visiable.sync="tagsDialogVisible" />
<tagPop :visiable.sync="tagsDialogVisible" @save="saveTagPop" />
<el-dialog :title="tipsDialogContent.title" :visible="tipsDialogContent.visible" width="700px" @close="tipsDialogContent.visible = false">
<div class="gradeContent">
<div class="tips">
......@@ -323,8 +323,8 @@ export default {
// 打标签列表
{
options: [],
id: 'fd6b44967aa647bcadfad10706244c56',
name: '区间'
id: '',
name: ''
}
],
smsList: [
......@@ -560,8 +560,9 @@ export default {
async getMemberCount() {
const activeTimeData = await this.$refs[`activeTime${[1, 2].includes(this.form.scene) ? this.form.scene : ''}`].submit();
const { startDate, endDate, birth_type, birth_days, holiday_date, holiday_type, holiday_name } = activeTimeData;
const { scene, consume_days_flag, consume_days, consume_times_flag, consume_times, consume_amount_flag, consume_amount, memberType, filterJson } = this.form;
const { scene, consume_days_flag, consume_days, consume_times_flag, consume_times, consume_amount_flag, consume_amount, memberType } = this.form;
let sceneJson = JSON.stringify({});
let filterJson = '';
if (scene == 1) {
sceneJson = JSON.stringify({
birth_type,
......@@ -583,6 +584,11 @@ export default {
consume_amount
});
}
if (memberType == 0) {
filterJson = this.memberCrowdWidgetId;
} else if (memberType == 1) {
filterJson = this.selectedGroupIds;
}
const data = {
memberType,
sceneJson,
......@@ -606,12 +612,13 @@ export default {
handleRuleFilterSave(id, data) {
this.memberCrowdWidgetId = id;
this.filterFrontShow = data ? JSON.parse(data.filterFrontShow) : [];
console.log(data);
this.getMemberCount();
},
/**客户分组 */
confirmGroupDialog(arr, idStr) {
this.selectedGroup = arr;
this.selectedGroupIds = idStr;
this.getMemberCount();
console.log(arr);
console.log(idStr);
},
......@@ -664,10 +671,14 @@ export default {
},
/** 根据客户意向打标签 */
openTagsDialog(index) {
this.currentIndex = index;
this.tagsDialogVisible = true;
},
confirmTagsDialog() {
this.tagsDialogVisible = false;
saveTagPop(data) {
const { tagItemId, tagItemName } = data;
this.tagMatchList[this.currentIndex].id = tagItemId;
this.tagMatchList[this.currentIndex].name = tagItemName;
this.tagMatchList = this.tagMatchList.splice(0);
},
handleTagClose(item) {
const obj = this.tagMatchList.find(val => val.id == item.id);
......
......@@ -123,7 +123,7 @@ export default {
form: {
activityName: '', //活动名称
activityId: '', //活动id
scene: '', //活动场景 「1 客户生日」、「2 节日活动邀约」、「3 加企微好友」、「4 客户复购」、「5 其它场景」
scene: '', //活动场景 「1 客户生日」、「2 节日活动邀约」、「3 加企微好友」、「4 客户复购」、「0 其它场景」
aiTemplateId: '', //话术模板id
memberType: 0, // 会员类型(0:会员筛选,1:会员分组)
filterJson: '{"list":[{"type":"or","list":[{"type":"data","data":{"key":"city","compute":"in","value":"330100"}}]},{"type":"or","list":[{"type":"data","data":{"key":"mainStoreId","compute":"in","value":"e8fdc210a59411ecb9cb9f7ed8d63716","dealKey":"storeWidget"}}]}],"type":"and"}',
......
<template>
<div class="flex">
<el-input v-model="item.tagItemName" placeholder="请输入标签值" class="w-380" maxlength="15" show-word-limit @change="onChange" />
<template>
<i v-if="currentLength < 50" class="iconfont plus icon margin icon-PlusOutlined" @click="add" />
<i v-else class="icon margin" />
</template>
<i v-if="currentLength > 1" class="iconfont delete icon icon-delete" @click="del" />
</div>
</template>
<script>
export default {
name: 'TagValueItem',
props: {
item: Object,
currentLength: Number
},
data() {
return {
tagValue: ''
};
},
methods: {
add() {
this.$emit('add', this.item.id);
},
del() {
this.$emit('del', this.item.id);
}
}
};
</script>
<style scoped lang="scss">
@mixin flex($justify, $alignItems) {
display: flex;
justify-content: $justify;
align-items: $alignItems;
}
.flex {
@include flex(initial, center);
&:not(:last-of-type) {
margin-bottom: 20px;
}
}
.w-380 {
width: 380px;
}
.icon {
display: inline-block;
width: 24px;
height: 24px;
border-radius: 2px;
text-align: center;
line-height: 24px;
cursor: pointer;
}
.margin {
margin: 0 7px 0 16px;
}
.plus {
color: #2f54eb;
&:hover {
background: rgba(47, 84, 235, 0.1);
}
}
.delete {
color: #f5222d;
&:hover {
background: rgba(245, 34, 45, 0.1);
}
}
</style>
<template>
<el-dialog title="选择标签" :visible.sync="visiable" width="900px" :before-close="close">
<div class="container">
<el-tabs tab-position="left" @tab-click="onTabsClick" v-model="activeName">
<el-tab-pane :label="item.levelName" v-for="item in tabList" :key="item.id" :name="item.id" v-loading="tabPaneLoading">
<div class="rightContent">
<div class="searchWrap">
<div><el-input prefix-icon="el-icon-search" v-model="search" placeholder="请输入标签名称" @keyup.enter.native="getList" clearable @clear="getList"></el-input></div>
<div class="btn"><el-button size="small" type="primary" @click="addGroup">新增标签</el-button></div>
<div>
<el-dialog title="选择标签" :visible.sync="visiable" width="900px" :before-close="close">
<div class="container">
<el-tabs tab-position="left" @tab-click="onTabsClick" v-model="activeName">
<el-tab-pane :label="item.levelName" v-for="item in tabList" :key="item.id" :name="item.id" v-loading="tabPaneLoading">
<div class="rightContent">
<div class="searchWrap">
<div><el-input prefix-icon="el-icon-search" v-model="search" placeholder="请输入标签名称" @keyup.enter.native="getList" clearable @clear="getList"></el-input></div>
<div class="btn"><el-button size="small" type="primary" @click="showPopVisible = true">新增标签</el-button></div>
</div>
<div class="radioContainer">
<div v-for="item in valueList" :key="item.tagId" class="radioLine">
<div class="lineTitle">{{ item.tagName }}</div>
<el-radio v-for="value in item.itemList" :key="value.tagItemId" :label="value" v-model="selectedTag">{{ value.tagItemName }}</el-radio>
</div>
</div>
<el-pagination class="fr" layout="prev, pager, next" v-if="totalCount" :total="totalCount" :page-size="pageSize" :current-page.sync="currentPage" @current-change="getGroupList"> </el-pagination>
</div>
<div class="radioContainer">
<el-radio v-for="item in value" :key="item.tagId" :label="item.tagId">{{ item.tagName }}</el-radio>
</div>
<el-pagination layout="prev, pager, next" v-if="totalCount" :total="totalCount" :page-size="pageSize" :current-page.sync="currentPage" @current-change="getGroupList"> </el-pagination>
</div>
</el-tab-pane>
</el-tabs>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="confirm">确定</el-button>
</div>
</el-dialog>
</el-tab-pane>
</el-tabs>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="confirm">确定</el-button>
</div>
</el-dialog>
<manual-tag-edit :options="manualTagPop" :showPop.sync="showPopVisible" @save="addNewTag"></manual-tag-edit>
</div>
</template>
<script>
import { platformTagPageListV2, platformHomePageV2 } from '@/service/api/aiApi.js';
import { pageMemberTagDetail, platformHomePageV2 } from '@/service/api/aiApi.js';
import ManualTagEdit from './manualTagEdit';
export default {
data() {
return {
activeName: '',
search: '',
tabList: [],
value: [],
valueList: [],
tabPaneLoading: false,
totalCount: 0,
currentPage: 1,
pageSize: 40
pageSize: 5,
showPopVisible: false,
manualTagPop: {
show: false,
popTitle: '',
tagId: '',
tagLevelGroupId: '',
tagTwoLevelGroupId: '',
isSync: false
},
selectedTag: ''
};
},
props: {
......@@ -47,32 +65,48 @@ export default {
mounted() {
this.getPlatformHomePageV2();
},
components: {
ManualTagEdit
},
methods: {
confirm() {
if (!this.selectedTag) {
this.$message.waring('请选择标签');
return;
}
this.$emit('save', this.selectedTag);
this.close();
},
addNewTag() {
this.activeName = this.tabList[0].id;
this.currentPage = 1;
this.getPageMemberTagDetail();
},
getList() {
this.currentPage = 1;
this.getPlatformTagPageListV2();
this.getPageMemberTagDetail();
},
onTabsClick(val) {
const { name } = val;
console.log(name);
this.getPlatformTagPageListV2();
this.getPageMemberTagDetail();
this.currentPage = 1;
},
close() {
this.selectedTag = '';
this.$emit('update:visiable', false);
},
async getPlatformTagPageListV2() {
async getPageMemberTagDetail() {
const param = {
search: this.search,
tagLevelGroupId: this.activeName != 2 ? this.activeName : 0,
// tagType: 2,
tagLevelGroupId: this.activeName,
pageNum: this.currentPage,
pageSize: this.pageSize
};
const { result } = await platformTagPageListV2(param);
const { result } = await pageMemberTagDetail(param);
if (result) {
this.totalCount = result.totalCount;
this.value = result.result;
this.valueList = result.result;
}
},
async getPlatformHomePageV2() {
......@@ -81,11 +115,12 @@ export default {
};
const { result } = await platformHomePageV2(param);
if (result) {
this.tabList = [{ levelName: '所有活动标签', id: 2 }, ...result[0].children];
this.tabList = [{ levelName: '所有活动标签', id: result[0].tagLevelGroupId }, ...result[0].children];
}
if (this.tabList.length) {
this.activeName = this.tabList[0].id;
this.getPlatformTagPageListV2();
this.currentPage = 1;
this.getPageMemberTagDetail();
}
}
}
......@@ -108,12 +143,25 @@ export default {
border: 1px solid #dcdfe6;
}
.radioContainer {
display: flex;
flex-wrap: wrap;
gap: 10px;
height: 400px;
overflow-y: auto;
.el-radio + .el-radio {
margin: 0;
}
}
.radioLine {
.lineTitle {
font-weight: bolder;
margin-bottom: 12px;
width: 100%;
}
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-bottom: 24px;
}
.fr {
float: right;
}
</style>
......@@ -89,7 +89,7 @@
</template>
<script>
import { page, rechargeCenter, stopActivityPlan, startActivityPlan } from '@/service/api/aiApi.js';
import { page, rechargeCenter, stopActivityPlan, startActivityPlan, pageStatistics } from '@/service/api/aiApi.js';
import { formatDateTimeByType } from '@/utils/index.js';
import filterAvater from '@/mixins/filterAvater.js';
import dmDropdown from '@/components/dm-drop-down/dm-drop-down';
......@@ -162,7 +162,7 @@ export default {
limitCode: ''
},
visible: row => {
return row.log_flag === 1;
return row.logFlag === 1;
},
handler: row =>
this.$router.push({
......@@ -180,7 +180,7 @@ export default {
limitCode: ''
},
visible: row => {
return row.log_flag === 1;
return row.logFlag === 1;
},
handler: row => {
this.$router.push({
......@@ -219,7 +219,7 @@ export default {
},
{
title: '其它场景',
scene: 5,
scene: 0,
iconName: 'icon-qitachangjing',
content: '自定义营销场景'
}
......@@ -238,7 +238,7 @@ export default {
label: '客户复购'
},
{
value: 5,
value: 0,
label: '其它场景'
}
],
......@@ -355,10 +355,32 @@ export default {
params.endTime = formatDateTimeByType(params.time[1]).replace('00:00:00', '23:59:59');
}
delete params.time;
const { result } = await page(params).finally(() => (this.loading = false));
this.tableData = result.list || [];
this.total = result.total;
console.log(this.tableData);
const { result } = await page(params);
if (result) {
this.tableData = result.list || [];
const ids = this.tableData.map(item => item.activityId).join(',');
this.total = result.total;
console.log(this.tableData);
this.pageStatistics(ids);
} else {
this.loading = false;
}
},
async pageStatistics(ids) {
const { result } = await pageStatistics({ ids }).finally(() => (this.loading = false));
if (result) {
result.forEach(element => {
let obj = this.tableData.find(item => item.activityId == element.activityId);
const { marketingNumber, outboundNumber, totalConnectionNumber, telephoneConnectionRate, connectionIntentionRate } = element;
obj.marketingNumber = marketingNumber;
obj.outboundNumber = outboundNumber;
obj.totalConnectionNumber = totalConnectionNumber;
obj.telephoneConnectionRate = telephoneConnectionRate;
obj.connectionIntentionRate = connectionIntentionRate;
});
}
this.tableData = this.tableData.splice(0);
},
stopTask(row) {
this.$confirm('任务终止后未外呼的客户将停止外呼任务,终止后不可重新启用任务,是否继续终止任务?', '提示', {
......
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