Commit b8db235a by 黄冷

update: dist

parent 336b6020
import gicNewMemberGroup from './index.vue'; // 导入组件
// gicNewMemberGroup.install = function(Vue) {
// Vue.component(gicNewMemberGroup.name, gicNewMemberGroup);
// };
// if (typeof window !== 'undefined' && window.Vue) {
// window.Vue.use(gicNewMemberGroup);
// }
export let baseUrl = '';
export default gicNewMemberGroup;
<template>
<div class="member-group-container">
<div class="echo-member-group" v-if="echoFlag">
<div class="mini-sub-title">
<div class="line"></div>
<div class="text">
<div class="space-between">
已选分组
<span v-if="!onlyRead"><el-button type="text" class="delBtn" @click="del">删除</el-button><el-button type="text" @click="edit">编辑</el-button></span>
</div>
</div>
</div>
<div class="echoLine" v-for="item in defaultSelected" :key="item.memberTagGroupId">
<div class="dot"></div>
<el-tag size="mini" v-if="item.isRealTime">实时</el-tag>
<el-tag size="mini" type="warning" v-else>非实时</el-tag>
<span class="groupName"> {{ item.groupName }}</span>
</div>
</div>
<el-dialog title="选择客户分组" :visible.sync="visiable" width="1000px" :before-close="close" custom-class="custom-class-dialog" class="dialog-wrap">
<div class="member-group">
<div class="left">
<el-tabs v-model="activeName">
<el-tab-pane :label="item.label" v-for="item in options" :name="item.name" :key="item.name">
<tableComponent :ref="`table${item.name}`" :name="item.name" :creatorId="creatorId" :key="visiable" :realTimeType="realTimeType" :activeName="activeName" :selected="selectedArray" @handleSelectionChange="handleSelectionChange" @deleteRow="deleteRow" />
</el-tab-pane>
</el-tabs>
</div>
<div class="right">
<div class="right-top">
已选分组
</div>
<ul class="right-content">
<li class="contact-li" v-for="item in selectedArray" :key="item.memberTagGroupId">
<div class="li-cell cursor-pointer">
<div>
<el-tag size="mini" v-if="item.isRealTime">实时</el-tag>
<el-tag size="mini" type="warning" v-else>非实时</el-tag>
<span class="groupName"> {{ item.groupName }}</span>
</div>
<i class="el-icon-close" @click="deleteRow(item)"></i>
</div>
</li>
</ul>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="confirm">确定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { baseUrl } from './index.js';
import table from './table';
export default {
name: 'gic-new-member-group',
props: {
selectedIds: {
type: String,
default: ''
},
visiable: {
type: Boolean,
default: false
},
projectName: {
type: String,
default: 'memberTag'
},
creatorId: {
type: String,
default: ''
// require: true
},
maxLimit: {
type: Number,
default: 5
},
showTabs: {
// 展示哪些tab
type: Array,
default: () => [0, 1, 2]
},
realTimeType: {
// 实时与非实时分组的可选
// 0:可选非实时分组 1:可选实时分组
type: Array,
default: () => [0, 1]
},
onlyRead: {
type: Boolean,
default: false
}
},
components: {
tableComponent: table
},
data() {
return {
activeName: 0, //0 我的客户分组 1固化分组 2金字塔会员分层
baseUrl,
echoFlag: false,
selected: {},
optionsVal: [
{
name: 0,
label: '我的客户分组'
},
{
name: 1,
label: '固化分组'
},
{
name: 2,
label: '金字塔会员分层'
}
],
options: [
{
name: 0,
label: '我的客户分组'
},
{
name: 1,
label: '固化分组'
},
{
name: 2,
label: '金字塔会员分层'
}
]
};
},
mounted() {
document.addEventListener('visibilitychange', () => {
if (!document.hidden) {
try {
this.$refs[`table${this.activeName}`][0].getGroupList();
} catch (e) {
return null;
}
}
});
},
computed: {
selectedArray() {
let arr = [];
Object.keys(this.selected).forEach(item => {
arr.push(this.selected[item]);
});
return arr;
}
},
watch: {
selectedIds: {
immediate: true,
handler(val) {
if (val.length) {
this.echoFlag = true;
this.getDefaultSelected(val);
}
}
},
visiable(val) {
if (val && this.selectedIds) {
this.getDefaultSelected(this.selectedIds);
}
},
showTabs: {
immediate: true,
handler(val) {
console.log(val);
let arr = this.optionsVal;
if (val && val.length) {
arr = this.optionsVal.filter(item => val.includes(item.name));
}
this.options = arr;
}
}
},
methods: {
getDefaultSelected(val) {
this.axios.get(`${this.baseUrl}/gic-member-tag-web/member-tag-group/queryGroupByIds?requestProject=${this.projectName}&memberTagGroupIds=${val}`).then(res => {
if (res.data.errorCode == 0) {
this.defaultSelected = res.data.result;
this.handleSelectionChange(this.defaultSelected);
}
});
},
confirm() {
if (!Object.keys(this.selected).length) {
this.$message.warning('请选择分组');
return;
}
let arr = [];
Object.keys(this.selected).forEach(key => {
arr.push(this.selected[key]);
});
const str = arr.map(item => item.memberTagGroupId).join(',');
if (arr.length) {
this.echoFlag = true;
} else {
this.echoFlag = false;
}
this.initPage();
this.$emit('change', arr, str); // 被选中数组,数组id的字符串
},
close() {
Object.keys(this.selected).forEach(key => {
this.deleteRow(this.selected[key]);
});
this.initPage();
},
initPage() {
this.activeName = '0';
this.$emit('update:visiable', false);
},
del() {
this.selected = {};
this.$emit('change', [], '');
this.echoFlag = false;
},
edit() {
this.$emit('update:visiable', true);
},
handleSelectionChange(val) {
const obj = JSON.parse(JSON.stringify(this.selected));
if (val.length) {
val.forEach(item => {
obj[item.memberTagGroupId] = item;
});
if (Object.keys(obj).length > this.maxLimit) {
this.deleteRow(val[val.length - 1]);
this.$message.error(`最多支持选择${this.maxLimit}个分组`);
return false;
}
}
this.selected = obj;
},
deleteRow(row) {
console.log(this.activeName);
console.log(this.$refs);
delete this.selected[row.memberTagGroupId];
this.selected = Object.assign({}, this.selected);
this.$refs[`table${this.activeName}`][0].$refs.table.toggleRowSelection(row, false);
}
}
};
</script>
<style lang="scss" scoped>
.delBtn {
color: #f5222d;
}
.space-between {
display: flex;
justify-content: space-between;
}
.subTitle {
width: 100%;
height: 40px;
display: flex;
box-sizing: border-box;
align-items: center;
margin-bottom: 5px;
.line {
width: 2px;
height: 14px;
background: #2f54eb;
margin-right: 8px;
}
.text {
font-size: 14px;
color: #303133;
width: 100%;
}
}
.member-group-container {
width: 400px;
}
.echo-member-group {
width: 100%;
background: #f7f8fa;
border-radius: 4px;
padding: 0 16px 16px;
box-sizing: border-box;
.echoLine {
margin-bottom: 8px;
line-height: 20px;
.dot {
display: inline-block;
width: 6px;
height: 6px;
background: #2f54eb;
border-radius: 3px;
margin-right: 6px;
}
.groupName {
font-weight: 400;
}
&:last-child {
margin-bottom: 0;
}
}
}
.member-group {
background: #ffffff;
display: flex;
.left {
width: 666px;
height: 560px;
border-radius: 4px;
border: 1px solid #dcdfe6;
padding: 5px 17px;
box-sizing: border-box;
/deep/ .el-table th.el-table__cell {
line-height: 1;
}
}
.right {
width: 274px;
// height: 582px;
border-radius: 4px;
border: 1px solid #dcdfe6;
margin-left: 12px;
.right-top {
padding: 20px 15px;
display: flex;
justify-content: space-between;
color: #303133;
box-sizing: border-box;
line-height: 20px;
background: #fff;
}
.right-content {
color: #303133;
overflow-y: auto;
height: 89%;
}
.contact-li {
padding: 0 12px 0 16px;
margin-top: 4px;
&:hover {
background: #f7f8fa;
}
&:first-child {
margin-top: 0;
}
.li-cell {
border-radius: 2px;
line-height: 32px;
display: inline-flex;
width: 100%;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
i {
width: 20px;
height: 20px;
border-radius: 10px;
cursor: pointer;
font-size: 12px;
display: inline-flex;
justify-content: center;
align-items: center;
&:hover {
background: #e5e6eb;
}
}
}
}
.contact-li + .contact-li {
margin-top: 4px;
}
}
}
</style>
客户分组
# 业务props
| 参数 | 说明 | 类型 | 默认值 | 是否必传 |
| - | - | - | - | - |
| selectedIds | 所选择的分组id | String | '' | 否 |
| visiable | 是否展示筛选器弹窗 | Boolean | false | 否 |
| projectName | 项目名称 | String | 'memberTag' | 否 |
| creatorId |创建人id | String | '' | 是 |
| maxLimit | 最大可选择分组个数 | Number | 5 | 否 |
| showTabs | 展示哪些tab 1:我的客户分组,2:固化分组,3:金字塔会员分层 | Array | [1,2,3] | 否 |
| onlyRead | 是否只读 | Boolean | false | 否 |
| realTimeType | 实时与非实时分组的可选 [0:可选非实时分组 1:可选实时分组 ]| Array | [] | 否 |
```
```
# 更新日志:
v 1.0.0 新增筛选器 by黄冷
\ No newline at end of file
<template>
<div>
<div class="leftHead">
<div class="tips">
<li><span class="dots"></span> 选择多个分组时,会自动去重分组下的客户;</li>
<li><span class="dots"></span> 非实时分组到期后,客户数据会清空,任务将不在继续执行;</li>
</div>
<div class="searchWrap">
<div><el-input prefix-icon="el-icon-search" v-model="dataSearch" placeholder="请输入分组名称" @keyup.enter.native="search" clearable @clear="search"></el-input></div>
<div class="btn"><el-button size="small" type="primary" @click="addGroup">新增分组</el-button></div>
</div>
</div>
<el-table :data="tableData" ref="table" style="width:100%" v-loading="loading" @select="handleSelect" height="355px" @selection-change="handleSelectionChange" row-key="memberTagGroupId" @row-click="selectRow">
<el-table-column type="selection" width="55" :selectable="selectable"> </el-table-column>
<el-table-column label="分组名称" min-width="180px" prop="groupName">
<template slot-scope="{ row }">
<el-tooltip :disabled="row.readyStatus == 1" content="当前分组还未更新完成">
<div>
<el-tag size="mini" v-show="activeName != 2" :type="!row.isRealTime ? 'warning' : ''"> {{ !row.isRealTime ? '非实时' : '实时' }}</el-tag>
{{ row.groupName }}
</div>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="最近更新时间" v-if="activeName != 2" min-width="120px" prop="latestUpdateTime">
<template slot-scope="scope">
<p class="h-18">{{ scope.row.latestUpdateTime | formatTimeYMD }}</p>
<p class="h-18">{{ scope.row.latestUpdateTime | formatTimeHMS }}</p>
</template>
</el-table-column>
<el-table-column label="到期时间" v-if="activeName != 2" min-width="120px">
<template slot-scope="{ row }">
<p class="h-18" v-if="!row.isRealTime">{{ row.effectiveDate | formatTimeYMD }}</p>
<p class="h-18" v-else>--</p>
<p class="h-18" v-if="!row.isRealTime">{{ row.effectiveDate | formatTimeHMS }}</p>
<p class="h-18" v-else>--</p>
</template>
</el-table-column>
</el-table>
<div class="pageBtn">
<el-pagination layout="prev, pager, next" v-if="totalCount" :total="totalCount" :page-size="pageSize" :current-page.sync="currentPage" @current-change="getGroupList"> </el-pagination>
</div>
</div>
</template>
<script>
import { baseUrl } from './index.js';
export default {
props: {
realTimeType: {
type: Array,
default: () => [0, 1]
},
selected: {
type: Array,
default: () => []
},
activeName: {
type: String,
default: ''
},
projectName: {
type: String,
default: 'memberTag'
},
creatorId: {
type: String,
default: ''
},
maxLimit: {
type: Number
},
name: {
type: [String, Number],
default: 0
}
},
data() {
return {
baseUrl,
loading: false,
tableData: [],
totalCount: 0,
pageSize: 20,
currentPage: 1,
dataSearch: '',
fixedType: 0 // 0普通的分组, 1固化分组 3固化分组分堆
};
},
filters: {
formatTimeYMD(data) {
return data && data != '- -' ? String(data).split(' ')[0] : '--';
},
formatTimeHMS(data) {
return data && data != '- -' ? String(data).split(' ')[1] : '--';
}
},
mounted() {
console.log('mounted');
},
watch: {
tableData(val) {
if (!val.length) return;
this.$nextTick(() => {
if (!this.selected.length) return;
const obj = {};
val.forEach(item => {
obj[item.memberTagGroupId] = item;
});
this.selected.forEach(item => {
obj[item.memberTagGroupId] && this.$refs.table.toggleRowSelection(obj[item.memberTagGroupId]);
});
});
},
activeName: {
handler(val) {
if (val == '0' && this.name == '0') {
this.fixedType = 0;
this.getGroupList();
} else if (val == '1' && this.name == '1') {
this.fixedType = 1;
this.getGroupList();
} else if (val == '2' && this.name == '2') {
this.getGroupList();
}
},
immediate: true
}
},
methods: {
selectable(row) {
return row.readyStatus == 1 && this.realTimeType.includes(row.isRealTime);
},
addGroup() {
let str = window.location.host.includes('localhost') ? 'http://www.gicdev.com' : '';
window.open(`${str}/member-tag/#/memberGroupEdit?refresh`, '_blank');
},
selectRow(row) {
if (this.realTimeType.some(el => el == row.isRealTime) && row.readyStatus == 1) {
if (this.selected.length && this.selected.find(item => item.memberTagGroupId == row.memberTagGroupId)) {
this.$emit('deleteRow', row);
} else {
this.$refs.table.toggleRowSelection(row);
}
}
},
handleSelectionChange(val) {
if (val.length) {
this.$emit('handleSelectionChange', val);
}
},
handleSelect(selection, row) {
if (this.selected.length && this.selected.find(item => item.memberTagGroupId == row.memberTagGroupId)) {
this.$emit('deleteRow', row);
}
},
search() {
this.currentPage = 1;
this.getGroupList();
},
/**
* 获取 列表数据
*/
getGroupList() {
this.loading = true;
this.tableData = [];
this.totalCount = 0;
let url = `${this.baseUrl}/gic-member-tag-web/member-tag-group/findList.json?requestProject=${this.projectName}&fixedType=${this.fixedType}&creatorId=${this.creatorId}&pageSize=${this.pageSize}&pageNum=${this.currentPage}&groupName=${this.dataSearch}&effectiveStatus=1&permissionType=1`;
if (this.activeName == '2') {
url = `${this.baseUrl}/gic-member-tag-web/memberTagGrade/gradeGroupListV2?requestProject=${this.projectName}&pageSize=${this.pageSize}&pageNum=${this.currentPage}&groupName=${this.dataSearch}`;
}
this.axios
.get(url)
.then(res => {
if (res.data.errorCode == 0) {
res.data.result.result.forEach(item => (item.activeName = this.activeName));
this.tableData = res.data.result.result;
this.totalCount = res.data.result.totalCount;
return;
}
this.$message.error({
duration: 2000,
message: res.data.message
});
})
.catch(error => {
this.$message.error({
duration: 2000,
message: error.message
});
})
.finally(() => {
this.loading = false;
});
}
}
};
</script>
<style lang="scss" scoped>
.leftHead {
.tips {
padding-bottom: 15px;
li {
display: flex;
align-items: center;
line-height: 17px;
&:last-child {
margin-top: 4px;
}
}
.dots {
width: 5px;
height: 5px;
background: #c4c6cf;
display: inline-block;
border-radius: 2.5px;
margin-right: 6px;
}
}
.searchWrap {
display: flex;
justify-content: space-between;
margin-bottom: 15px;
/deep/ .el-input__inner {
border-color: #dcdfe6 !important;
}
}
}
.pageBtn {
float: right;
margin-top: 5px;
}
.h-18 {
line-height: 18px;
}
/deep/ .el-table__header .el-checkbox {
display: none;
}
</style>
/**
* 解析property
* @param {Number | String} val property值,也可能是多个对应值之和
* @return {Object} map
* @return {Boolean} map.isCompute 是否是计算属性
* @return {Boolean} map.isField 是否是字段属性
* @return {Boolean} map.isValue 是否是值属性
* @return {Boolean} map.isCategray 是否是不是属性
* @return {Boolean} map.notProperty 是否是类别属性
*/
function parseProperty(val) {
// 用二进制对应位上的1表示对应属性的开启状态
// {
// 1: '0001', // 计算属性
// 2: '0010', // 字段属性
// 4: '0100', // 值属性
// 8: '1000', // 不是属性
// 16: '00010000', // 类别属性
// }
// 将val转为二进制,来处理值之和的情况,例如:3 = 1 + 2 = 0001 + 0010 = 0011
// 然后再把二进制值的字符串转为数字,调转顺序,0 1转为bool
const status = Number(val)
.toString(2)
.split('')
.reverse()
.map(i => i == 1);
// 根据上面的键值对表,从二进制最末一位开始,对应在数组里
const keys = ['isCompute', 'isField', 'isValue', 'isCategray', 'notProperty'];
// 根据数组转换出状态结果
return keys.reduce((map, key, index) => ({ ...map, [key]: !!status[index] }), {});
}
function getParamsData(node) {
const result = { key: '', compute: '', value: '' };
const property = parseProperty(node.property);
if (property.isField) {
result.key = node.columnKey;
// console.log(result.key)
}
// isCompute 是否是计算属性
// 计算属性的值来源:computeCharacter或是选择的值
if (property.isCompute) {
result.compute = node.computeCharacter;
}
// notProperty 是否是类别属性
// 类别属性 dealkey有值就带上,和value key同级,如果没值要删掉
if (property.notProperty && node.dealKey) {
result.dealKey = node.dealKey;
}
result.value = node.value;
return { type: 'data', data: result };
}
/**
* @description 将数据转换成后端需要的数据、缩略信息数据
* @param {Object} data 选择好的筛选条件数据
* @return {Array} result.filterJson 后端需要的查询条件
* @return {Array} result.filterFrontShow 前端回显的数据
*/
const transform = (data, scenes) => {
const result = {
filterJson: [], // 后台需要的查询条件
filterFrontShow: [], // 前端回显的数据
scenes // 场景值 member02
};
const obj = { list: [], type: 'and' };
let filterFrontShow = [];
data.forEach(item => {
if (!item.value) return;
obj.list.push({ type: 'or', list: [getParamsData(item)] });
filterFrontShow.push(item);
});
result.filterJson = JSON.stringify(obj);
result.filterFrontShow = JSON.stringify(filterFrontShow);
return { data: result, bool: filterFrontShow.length > 0 };
};
export default transform;
<template>
<ruleFilter :visiable.sync="ruleVisible" @save="handleRuleFilterSave" :memberCrowdWidgetId="memberCrowdWidgetId" />
</template>
<script>
export default {
methods: {
/**id:筛选器id,data:保存筛选器时提交的参数 data.filterJson 后端需要的查询条件 data.filterFrontShow 前端回显的数据 */
handleRuleFilterSave(id, data) {
this.memberCrowdWidgetId = id;
console.log(id, data);
}
}
};
</script>
规则筛选器
筛选条件:会员等级,金字塔会员分层,会员服务门店,会员类型
# 业务props
| 参数 | 说明 | 类型 | 默认值 | 是否必传 |
| - | - | - | - | - |
| visiable | 是否展示筛选器弹窗 | Boolean | false | 否 |
| memberCrowdWidgetId | 筛选器id | String | '' | 否 |
| hideId | get-screening-init-data返回的esScreeningWidgetChainId, 传入则隐藏该节点 | Array | '' | 否 |
| onlyRead | 是否只读 | Boolean | false | 否 |
| requestProject | 弹窗可见与否 | Boolean | false | 否 |
```
```
# 更新日志:
v 1.0.0 新增规则筛选器 by黄冷
\ No newline at end of file
......@@ -30,7 +30,7 @@
</div>
<div class="member-rule" v-if="scene != 5">
<div class="member-rule-title">人群规则:</div>
<ruleFilter class="member-rule-list" v-if="activityInfo.memberType == 0" :memberCrowdWidgetId="activityInfo.filterJson" />
<gic-new-rule class="member-rule-list" v-if="activityInfo.memberType == 0" :memberCrowdWidgetId="activityInfo.filterJson" />
<gic-new-member-group class="member-rule-list" v-if="activityInfo.memberType == 1" :selected-ids="activityInfo.filterJson"></gic-new-member-group>
</div>
<div class="member-rule" v-else>
......@@ -46,11 +46,10 @@
<script>
import { formatDateTimeByType } from '@/utils/index.js';
import { getActivityInfo } from '@/service/api/aiApi.js';
import ruleFilter from '@/components/dm-new-rule/ruleFilter.vue';
export default {
name: 'ActivityInfo',
components: { ruleFilter },
data() {
return {
activityInfo: {},
......
......@@ -40,7 +40,7 @@
<div class="tips" style="margin-bottom: 12px;" v-if="form.scene == 1">{{ memberCrowdWidgetId || selectedGroupIds ? '默认客户范围并且满足以下条件的客户' : form.memberType == 0 ? '默认为权限范围内,生日时间为生日范围内的全部客户' : '' }}</div>
<div>
<el-button v-if="form.memberType == 0 && !memberCrowdWidgetId && form.scene != 4" size="small" @click="ruleVisible = true" :disabled="disabled"><i class="iconfont fz14 icon-Plus"></i> 添加其他条件</el-button>
<ruleFilter :onlyRead="disabled" v-show="form.memberType == 0 && form.scene != 4" :visiable.sync="ruleVisible" @save="handleRuleFilterSave" :memberCrowdWidgetId="memberCrowdWidgetId" />
<gic-new-rule :onlyRead="disabled" v-show="form.memberType == 0 && form.scene != 4" :visiable.sync="ruleVisible" @save="handleRuleFilterSave" :memberCrowdWidgetId="memberCrowdWidgetId" />
<el-button v-if="form.memberType == 1 && !selectedGroupIds" size="small" @click="groupVisible = true" :disabled="disabled">添加分组</el-button>
<gic-new-member-group v-show="form.memberType == 1" :showTabs="showTabs" :onlyRead="disabled" :visiable.sync="groupVisible" :selectedIds="selectedGroupIds" :realTimeType="[0, 1]" @change="confirmGroupDialog" />
</div>
......@@ -61,7 +61,7 @@
<span class="tips ml16">输入100则查询有效消费次数大于等于 100 的客户</span>
</div>
<el-button size="small" @click="ruleVisible2 = true" v-if="!memberCrowdWidgetId" :disabled="disabled">添加其它条件</el-button>
<ruleFilter :onlyRead="disabled" :visiable.sync="ruleVisible2" @save="handleRuleFilterSave" :memberCrowdWidgetId="memberCrowdWidgetId" :hideId="hideId" />
<gic-new-rule :onlyRead="disabled" :visiable.sync="ruleVisible2" @save="handleRuleFilterSave" :memberCrowdWidgetId="memberCrowdWidgetId" :hideId="hideId" />
<span class="tips ml10">勾选消费条件后,添加规则不支持选择【金字塔分层】</span>
</div>
</el-form-item>
......@@ -289,7 +289,7 @@ import LibMessage from '@/views/ecm/marketing-event/components/lib-message.vue';
import activeTime from '@/views/ai/task/components/activeTime.vue';
import { formatDateTimeByType, _debounce } from '@/utils/index';
import ruleFilter from '@/components/dm-new-rule/ruleFilter.vue';
export default {
mixins: [filterAvater],
data() {
......@@ -520,8 +520,7 @@ export default {
birthSense,
holidaySense,
activeTime,
LibMessage,
ruleFilter
LibMessage
},
methods: {
async getActivityDetail(activityId) {
......
......@@ -49,7 +49,7 @@
></el-descriptions-item
>
</el-descriptions>
<ruleFilter v-show="form.memberType == 0 && memberCrowdWidgetId" :memberCrowdWidgetId="memberCrowdWidgetId" onlyRead style="width:100%" />
<gic-new-rule v-show="form.memberType == 0 && memberCrowdWidgetId" :memberCrowdWidgetId="memberCrowdWidgetId" onlyRead style="width:100%" />
<gic-new-member-group v-show="form.memberType == 1" :selectedIds="selectedGroupIds" onlyRead style="width:100%" />
</div>
<dm-sub-title type="line">外呼规则配置</dm-sub-title>
......@@ -146,7 +146,6 @@
</template>
<script>
import ruleFilter from '@/components/dm-new-rule/ruleFilter.vue';
import filterAvater from '@/mixins/filterAvater.js';
import { formatDateTimeByType } from '@/utils/index.js';
import { getActivityDetail, aiDictList, templateList, getSmsTemplateEcho } from '@/service/api/aiApi.js';
......@@ -198,9 +197,6 @@ export default {
// this.getAiDictList();
this.getActivityDetail(this.$route.params.id);
},
components: {
ruleFilter
},
filters: {
birthTypeFilter(val) {
let str = '';
......
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