Commit 48ea43bb by liuchenxi

Merge branch 'feature/10月迭代'

parents 60812cd4 156f2f58
......@@ -11,7 +11,7 @@
</el-breadcrumb>
<h3>
<div>
<span class="content-title">{{ contentTitle }}</span>
<span class="content-title">{{ contentTitle }}<span v-if="contentTitle == '触达效果'" class="title_tip">每日上午更新昨日数据</span></span>
<div v-html="layoutTips" class="layout--tips--wrap"></div>
</div>
<div v-if="showDescription" class="intro_wrap"><i class="iconfont icon-zhibiaoshuoming introlIcon" alt="" /><span class="intro" @click="() => (drawer = true)">指标说明</span></div>
......@@ -221,5 +221,12 @@ export default {
font-weight: 600;
color: #303133;
line-height: 28px;
display: flex;
align-items: center;
.title_tip {
font-size: 14px;
color: #909399;
margin-left: 10px;
}
}
</style>
<template>
<script :id="id" type="text/plain"></script>
<div :id="id" type="text/plain"></div>
</template>
<script>
......
......@@ -11,6 +11,9 @@ export default {
},
formatterNumAndFixed() {
return val => parseFloat(val || 0).toLocaleString('zh', { minimumFractionDigits: 2 });
},
timeLimit() {
return this.$route.query.createTime > 1635436800000;
}
}
};
......@@ -67,6 +67,8 @@ export const massDiagram = params => requests(PREFIX + 'ecmMassColumnDiagram', p
export const massList = params => requests(PREFIX + 'ecmMassTaskTable', params); // 单独数据
export const massTable = params => requests(PREFIX + 'ecmMassTaskPage', params); // 下钻表格
export const massTableExport = config.api + PREFIX + 'ecmMassTaskPageExport'; // 导出数据
// 营销类型
export const getTouchType = params => requests(PREFIX + 'ecmTouchTypeForWx', params);
// 智能营销线索页tree
export const getGroupTree = params => requests(PREFIX + 'getGroupTree', params);
......
......@@ -16,6 +16,7 @@ const initForm = {
cardType: 0, // 1.卡券类型: 抵金券: 0; 折扣券: 1; 兑换券: 2
cardName: '', // 2.卡券名称
cardApplyChannel: [], // 卡券适用渠道
channelTip: '',
subName: '', // 3.备注名
subTitle: '', // 4.卡券副标题
erpDemoCode: '', // demo券号
......@@ -527,6 +528,7 @@ export default {
this.storeMode = card.storeMode === 0 ? 0 : 1;
this.gicCouponType = card.gicCouponType;
this.form.cardApplyChannel = card.cardApplyChannel ? card.cardApplyChannel.split(',') : [];
this.form.channelTip = card.channelTip;
this.form.auditingStatus = card.auditingStatus || '';
this.form.giveFlag = card.giveFlag;
this.form.refundFlag = card.refundFlag || 0;
......@@ -896,6 +898,7 @@ export default {
let card = {};
let params = {};
card.channelTip = this.form.channelTip;
card.cardApplyChannel = this.form.cardApplyChannel.join(',');
card.coupCardId = this.form.coupCardId;
card.cardType = this.form.cardType;
......
......@@ -13,6 +13,13 @@
<el-option v-for="item in cardApplyChannelOptions" :key="item.value" :label="item.name" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="展示适用渠道文案" prop="channelTip">
<dm-input v-model="form.channelTip" class="w400" placeholder="请输入小程序端展示的适用渠道文案" :byteType="1" :maxlength="18"></dm-input>
<el-popover placement="right" width="360" trigger="hover">
<img :src="require('@/assets/img/coupon-preview.png')" alt="" style="display:block" />
<el-button slot="reference" type="text" class="ml10">查看示例</el-button>
</el-popover>
</el-form-item>
<el-form-item prop="cardName" label="卡券名称">
<dm-input v-model="form.cardName" class="w400" placeholder="请输入卡券名称" :disabled="isEdit || isInfo" :byteType="1" :maxlength="30"></dm-input>
</el-form-item>
......
......@@ -70,10 +70,10 @@ export default {
{
label: '提交状态',
prop: 'errCode',
width: '100',
minWidth: '100',
align: 'left',
formatter(row) {
return row.errCode === '0' ? '提交成功' : '提交失败';
return row.errCode == '0' ? '<span class="dm-status--success">提交成功</span>' : '<span class="dm-status--error">提交失败</span>';
}
},
{ label: '主门店', prop: 'mainStoreName', minWidth: '120', align: 'left' },
......
......@@ -24,12 +24,14 @@
<span>{{ v.label }}</span>
<el-tooltip v-if="v.prop == 'successCount'" placement="top" :open-delay="200">
<i class="iconfont icon-xinxixianshi" style="color:#909399;font-size:14px"></i>
<div slot="content">
<div>指的是GIC系统成功提交针对这些用户的营销行为,并不是指的实际触达成功,如:</div>
成功通过服务号接口进行消息群发;<br />
成功向短信运营商提交需要发送短信的用户名单;<br />
成功通过企微群发接口下发群发任务;<br />
成功通过话务任务接口下发话务任务;<br />
<div slot="content" style="line-height: 18px">
<div style="line-height: 18px">
指的是GIC系统成功提交针对这些用户的营销行为,并不是指的实际触达成功,如:<br />
成功通过服务号接口进行消息群发;<br />
成功向短信运营商提交需要发送短信的用户名单;<br />
成功通过企微群发接口下发群发任务;<br />
成功通过话务任务接口下发话务任务;<br />
</div>
</div>
</el-tooltip>
</span>
......@@ -40,7 +42,7 @@
<span v-else>{{ scope.row[v.prop] }}</span>
</template>
</el-table-column>
<el-table-column label="批次时间" align="left" width="120" prop="execTime">
<el-table-column label="批次时间" align="left" min-width="120" prop="execTime">
<template slot-scope="scope">
<p class="cell-time">
{{ formatDateTimeByType(scope.row.execTime, 'yyyy-MM-dd-HH-mm-ss', true).y }}<br />
......@@ -48,7 +50,7 @@
</p>
</template>
</el-table-column>
<el-table-column label="操作" align="left" width="220" fixed="right">
<el-table-column label="操作" align="left" min-width="120" fixed="right">
<template slot-scope="scope">
<el-button type="text" @click="toDialog(scope.row)">批次人数</el-button>
</template>
......
......@@ -29,7 +29,7 @@
<el-table-column v-for="(v, i) in infoHeader" :fixed="v.fixed" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="i" :prop="v.prop" :label="v.label" :formatter="v.formatter">
<template slot="header" slot-scope="scope">
<span>
<span>{{ v.label }}</span>
<span style="font-weight: 500">{{ v.label }}</span>
<el-tooltip v-if="v.prop == 'successCount'" placement="top" :open-delay="200">
<i class="iconfont icon-xinxixianshi" style="color:#909399;font-size:14px"></i>
<div slot="content">
......@@ -76,11 +76,11 @@
<template slot-scope="scope">
<span v-if="v.formatter" v-html="v.formatter(scope.row)"></span>
<component v-else-if="v.component" :is="v.component" :row="scope.row"></component>
<span v-else>{{ scope.row[v.prop] }}</span>
<span v-else>{{ scope.row[v.prop] || '--' }}</span>
</template>
</el-table-column>
</el-table>
<dm-pagination v-show="infoList.length" background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
<dm-pagination hide-on-single-page background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
</div>
<vue-gic-export-excel :dialogVisible.sync="dialogVisible" :dataArr="tableList" :type="2" :excelUrl="excelUrl" :params="params" :projectName="projectName"></vue-gic-export-excel>
</section>
......@@ -175,10 +175,10 @@ export default {
{
label: '提交状态',
prop: 'errCode',
width: '100',
minWidth: '120',
align: 'left',
formatter(row) {
return row.errCode === '0' ? '<span class="dm-status--success">提交成功</span>' : '<span class="dm-status--erroe">提交失败</span>';
return row.errCode == '0' ? '<span class="dm-status--success">提交成功</span>' : '<span class="dm-status--error">提交失败</span>';
}
},
{ label: '备注', prop: 'errMsg', minWidth: '120', align: 'left' }
......
......@@ -40,19 +40,6 @@ export default {
couponAutoGetFlag: 0, // 1开启自动领取 0关闭
couponAutoGetStock: 0, // 自动领取最大库存数
enterpriseId: '',
wihteList: [
// 'ff8080815dacd3a2015dacd3ef5c0000', // 金华达摩(测试环境)
'3115714d847811e69d0818c58a146fd2', // 达摩网络
'ff8080816a36326c016a53380d8b5f52', // 金华达摩
'ff8080816dd0385e016ddca436d01fe1', // Balabala
'ff8080816f334552016f59fa1eaa7802', // 乔丹
'ff808081734de4c6017375c148501364', // 七匹狼
'ff80808177da33a0017810c5374262c2', // 恒宣
'ff8080816dd03743016dd9062ac31c60', // 康奈
'ff80808171838eaf01719b44558d458d', // PIT
'ff80808163a84edb0163aee389832ed4', // HAZZYS
'ff8080816ed6a34f016f11d38ba97f87' // 迪赛尼斯
],
form: {
memberType: 0,
ecmPlanName: '',
......
......@@ -109,23 +109,18 @@
<el-form-item>
<div class="no_label_form_label">
<el-checkbox class="el-form-item__label align-left" :disabled="!isAdd" v-model="consumeChecked.store" @change="initStoreCardLeft"
>消费门店<el-tooltip class="item" effect="dark" :open-delay="200" v-if="wihteList.includes(enterpriseId)"
>消费门店<el-tooltip class="item" effect="dark" :open-delay="200"
><template slot="content">固定门店:系统基于所选定的门店来判断是否触发<br />按门店条件:系统基于所选的门店条件下所包含的门店来实时判断是否触发;所选门店条件下门店发生变更,立即生效。</template><i style="margin-left:4px;cursor:pointer;color:#c0c4cc;font-size:14px;" class="el-icon-question"></i> </el-tooltip
></el-checkbox>
<div>
<span class="fz14 gray" v-show="!consumeChecked.store">所有消费门店</span>
<template v-if="consumeChecked.store">
<template v-if="wihteList.includes(enterpriseId)">
<el-radio-group :disabled="!isAdd" v-show="consumeChecked.store" v-model="form.consumerStoreType">
<el-radio :label="0">固定门店</el-radio>
<el-radio :label="1">按门店条件</el-radio>
</el-radio-group>
<vue-gic-store-card style="margin:20px 0 0 35px" v-if="form.consumerStoreType === 0" v-bind="storeParams" :readonly="!isAdd" ref="storeCard" :uuid.sync="form.order_store"></vue-gic-store-card>
<dm-store-selector style="margin:20px 0 0 35px" v-if="form.consumerStoreType === 1" ref="newStoreCard" :readonly="!isAdd" :uuid.sync="form.order_store_new"></dm-store-selector>
</template>
<template v-else>
<vue-gic-store-card v-bind="storeParams" :readonly="!isAdd" ref="storeCard" :uuid.sync="form.order_store"></vue-gic-store-card>
</template>
<el-radio-group :disabled="!isAdd" v-show="consumeChecked.store" v-model="form.consumerStoreType">
<el-radio :label="0">固定门店</el-radio>
<el-radio :label="1">按门店条件</el-radio>
</el-radio-group>
<vue-gic-store-card style="margin:20px 0 0 35px" v-if="form.consumerStoreType === 0" v-bind="storeParams" :readonly="!isAdd" ref="storeCard" :uuid.sync="form.order_store"></vue-gic-store-card>
<dm-store-selector style="margin:20px 0 0 35px" v-if="form.consumerStoreType === 1" ref="newStoreCard" :readonly="!isAdd" :uuid.sync="form.order_store_new"></dm-store-selector>
</template>
</div>
</div>
......
......@@ -25,9 +25,16 @@
</div>
<div class="map_area">
<div class="top">
<span class="txt" v-if="type == '计划整体'">区域详情转化效果</span>
<span v-else></span>
<el-button type="primary" class="btn" @click="cdkeyExport"><i class="iconfont icon-icon_yunxiazai" style="marginRight:6px;fontSize:14px"></i>导出</el-button>
<span class="txt" v-if="type == '计划整体'">
区域详情转化效果
</span>
<span v-else>
<span class="uncredited_num" v-if="showUncreditedNum">(另外有{{ uncreditedNum }}名顾客没有归属门店,无法下发任务。)</span>
</span>
<div>
<el-checkbox label="展开所选区域下门店明细" v-model="expendStoreFlag" @change="changeExpendFlag" class="expend_store"></el-checkbox>
<el-button type="primary" class="btn" @click="cdkeyExport"><i class="iconfont icon-icon_yunxiazai" style="marginRight:6px;fontSize:14px"></i>导出</el-button>
</div>
</div>
<el-table ref="table" tooltipEffect="dark" :data="tableList" element-loading-text="拼命加载中" @sort-change="sortChange" header-cell-class-name="clue-table-header" style="width: 100%">
<el-table-column v-for="(v, i) in tableHeader" :key="i" :prop="v.prop" :min-width="v.minWidth" :label="v.label" :formatter="v.formatter" :sortable="v.sortable" :render-header="onRender" :fixed="v.fixed" show-overflow-tooltip>
......@@ -100,7 +107,9 @@ export default {
projectName: 'marketing', // 当前项目名
exportDialog: false,
excelUrl: '', // 下载数据的地址
params: {} // 导出数据传递的参数
params: {}, // 导出数据传递的参数
expendStoreFlag: false, // 导出分组下所有得门店数据
uncreditedNum: 0 // 无归属门店会员数量
};
},
mounted() {
......@@ -158,16 +167,20 @@ export default {
meth(params).then(res => {
const data = res.result || {};
if (this.type == '计划整体') {
data.customrPrice = data.convSalesAmt * 1 && data.convMbrNum * 1 ? (data.convSalesAmt / data.convMbrNum).toFixed(2) : 0;
data.relatedRate = data.convGoodsCnt * 1 && data.convOrderCnt * 1 ? (data.convGoodsCnt / data.convOrderCnt).toFixed(2) : '--';
data.taskRate = (data.cplTaskTotalCnt / data.taskCnt) * 100;
data.isSales = 1;
data.touchRate = data.touchMbrNum * 1 && data.planMbrNum * 1 ? ((data.touchMbrNum / data.planMbrNum) * 100).toFixed(2) : 0;
data.transformRate = data.convMbrNum * 1 && data.touchMbrNum * 1 ? ((data.convMbrNum / data.touchMbrNum) * 100).toFixed(2) : 0;
this.dynamicParams = [{ ...data }];
} else {
this.dynamicParams = data;
if (this.type == '群发') {
data.massExecuteNum = data.taskExecuteNum;
}
this.dynamicParams = data;
this.uncreditedNum = this.dynamicParams.noGroupNum;
}
});
},
......@@ -206,7 +219,7 @@ export default {
formatter(row) {
if (!row.groupName) return '--';
else if (row.groupName == '-1') return '【无归属门店】';
else if (row.groupName == '区域合计' || row.groupId == '-1') return row.groupName;
else if (row.groupName == '区域合计' || row.groupId == '-1') return row.groupName; // row.groupId == '-1' 是最后一层
return `<span style="color:#1890FF;cursor:pointer;" data-type="groupName">${row.groupName}</span>`;
}
}
......@@ -215,12 +228,16 @@ export default {
const convMbrText = '成功触达的顾客中,于收益有效期内在区域(门店)消费的人数,按照订单消费门店进行统计。统计“区域合计”数据时,按照每个门店求和计算,即如果一个顾客在同一个区域的两个门店都有消费,在计算区域合计时,会被算作两个人。';
const convOrderText = '智能营销计划触达的顾客中,在收益有效期内在区域(门店)消费产生的订单数。统计区域数据时按照每个门店求和计算。';
const convSalesText = '智能营销计划触达的顾客中,在收益有效期内在区域(门店)消费产生的订单金额。统计区域数据时按照每个门店求和计算。';
const customrPriceText = '触达顾客转化收益/触达顾客转化人数';
const relatedRateText = '触达顾客订单商品件数/触达顾客订单数。在2021年10月29日前创建的智能营销计划不进行连带率统计。';
// eslint-disable-next-line
this.tableHeader = [
...pubilc,
{ label: { name: '触达顾客转化人数', tipText: convMbrText }, prop: 'convMbrNum', align: 'left', sortable: 'custom', formatter: row => this.formatterNum(row.convMbrNum) },
{ label: { name: '触达顾客订单数', tipText: convOrderText }, prop: 'convOrderCnt', align: 'left', sortable: 'custom', formatter: row => this.formatterNum(row.convOrderCnt) },
{ label: { name: '触达顾客转化收益', tipText: convSalesText }, prop: 'convSalesAmt', align: 'left', sortable: 'custom', formatter: row => this.formatterNumAndFixed(row.convSalesAmt) }
{ label: { name: '触达顾客转化收益', tipText: convSalesText }, prop: 'convSalesAmt', align: 'left', sortable: 'custom', formatter: row => this.formatterNumAndFixed(row.convSalesAmt) },
{ label: { name: '客单价', tipText: customrPriceText }, align: 'left', sortable: 'custom', formatter: row => this.formatterNumAndFixed(row.customrPrice) },
{ label: { name: '连带率', tipText: relatedRateText }, align: 'left', sortable: 'custom', formatter: row => (this.timeLimit && row.relatedRate != '--' ? this.formatterNumAndFixed(row.relatedRate) : '--') }
];
}
if (this.type.indexOf('话务') != -1 || this.type == '群发') {
......@@ -292,7 +309,7 @@ export default {
},
getTableList() {
let meth;
let params = { ecmPlanId: this.$route.query.id, pageNum: this.currentPage, pageSize: this.pageSize, orderBy: this.listTabsIndex == 1 ? this.touchOrderBy : this.taskOrderBy, storeGroupId: this.storeGroupId, level: this.level, type: this.listTabsIndex ? 1 : 2 };
let params = { ecmPlanId: this.$route.query.id, pageNum: this.currentPage, pageSize: this.pageSize, orderBy: this.listTabsIndex == 1 ? this.touchOrderBy : this.taskOrderBy, storeGroupId: this.storeGroupId, level: this.level, type: this.listTabsIndex ? 1 : 2, shopShow: this.expendStoreFlag ? 1 : 0 };
if (this.type == '计划整体') {
meth = overAllTable;
} else if (this.type == '话务') {
......@@ -310,6 +327,8 @@ export default {
return;
}
this.tableList = res.result.result.map((el, index) => {
el.customrPrice = el.convSalesAmt * 1 && el.convMbrNum * 1 ? (el.convSalesAmt / el.convMbrNum).toFixed(2) : 0;
el.relatedRate = el.convGoodsCnt * 1 && el.convOrderCnt * 1 ? (el.convGoodsCnt / el.convOrderCnt).toFixed(2) : '--';
if (el.groupName == '区域合计') {
el.index = '';
return el;
......@@ -322,6 +341,9 @@ export default {
});
this.getTableHeader();
},
changeExpendFlag() {
this.getTableList();
},
sortChange(column) {
let prop = column.prop;
let orderby = column.order;
......@@ -381,7 +403,7 @@ export default {
cdkeyExport() {
this.exportDialog = true;
let meth;
let params = { requestProject: 'marketing', ecmPlanId: this.$route.query.id, pageNum: this.currentPage, pageSize: this.pageSize, orderBy: this.listTabsIndex == 1 ? this.touchOrderBy : this.taskOrderBy, storeGroupId: this.storeGroupId, level: this.level, type: this.listTabsIndex ? 1 : 2 };
let params = { requestProject: 'marketing', ecmPlanId: this.$route.query.id, pageNum: this.currentPage, pageSize: this.pageSize, orderBy: this.listTabsIndex == 1 ? this.touchOrderBy : this.taskOrderBy, storeGroupId: this.storeGroupId, level: this.level, type: this.listTabsIndex ? 1 : 2, shopShow: this.expendStoreFlag ? 1 : 0 };
if (this.type == '计划整体') {
meth = overAllTableExport;
} else if (this.type.indexOf('话务') != -1) {
......@@ -425,6 +447,9 @@ export default {
'text-align': 'center',
'line-height': '16px'
};
},
showUncreditedNum() {
return this.uncreditedNum > 0 && this.listTabsIndex == 1 && this.level == 1;
}
}
};
......@@ -453,7 +478,8 @@ export default {
font-weight: 600;
height: 22px;
color: #303133;
line-height: 22px;
display: flex;
align-items: center;
}
.area_content {
display: flex;
......@@ -506,6 +532,12 @@ export default {
.btn {
font-family: PingFangSC-Regular, PingFang SC;
}
.expend_store {
border: 1px solid #dcdfe6;
border-radius: 4px;
padding: 6px 10px 5px 5px;
margin-right: 6px;
}
}
}
}
......@@ -548,6 +580,10 @@ export default {
}
}
}
.uncredited_num {
color: #909399;
font-size: 14px;
}
}
.area {
margin-top: 0 !important;
......
......@@ -6,14 +6,14 @@
<img :src="require('@/assets/img/icon-send.png')" class="img" />
<h2>群发任务</h2>
</div>
<el-link type="primary" :underline="false" style="color: #1890ff" @click="$emit('toClue', '群发')">查看详情<i class="el-icon-arrow-right" style="margin-left: 10px"></i></el-link>
<div class="detail" @click="$emit('toClue', '群发')"><i class="iconfont icon-chakanxiangqing"></i>查看详情</div>
</div>
<batch-send-sum v-if="taskList" :data="taskList" />
<div class="wrap" v-if="telTrafficList || msgList">
<div v-if="telTrafficList">
<div class="flex_between" style="margin-bottom: 12px;padding-right: 20px">
<h3>群发失败-话务</h3>
<el-link type="primary" :underline="false" style="color: #1890ff" @click="$emit('toClue', '群发转话务')">查看详情<i class="el-icon-arrow-right" style="margin-left: 10px"></i></el-link>
<div class="detail" @click="$emit('toClue', '群发转话务')"><i class="iconfont icon-chakanxiangqing"></i>查看详情</div>
</div>
<div style="padding: 0px 20px"><batch-fail-phone :data="telTrafficList" /></div>
</div>
......@@ -57,9 +57,9 @@ export default {
margin-bottom: 10px !important;
font-family: PingFangSC-Regular, PingFang SC;
.title {
height: 22px;
height: 32px;
margin-bottom: 10px;
line-height: 22px;
line-height: 32px;
h2 {
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
......@@ -94,5 +94,23 @@ export default {
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 600;
}
.detail {
padding: 0 10px;
background: rgba(24, 144, 255, 0.1);
border-radius: 4px;
height: 32px;
color: #1890ff;
box-sizing: border-box;
display: flex;
align-items: center;
cursor: pointer;
border: none;
&:hover {
color: #46a6ff;
}
i {
margin-right: 2px;
}
}
}
</style>
......@@ -80,7 +80,7 @@
<span class="squre"></span>
<div class="text">
<p>转化收益</p>
<p>当前智能营销实际触达顾客中,在收益有效期内消费的顾客应收订单金额。只计销售单,不看退货单和换货单。</p>
<p>当前智能营销实际触达顾客中,在收益有效期内消费的顾客实付订单金额。只计销售单,不看退货单和换货单。</p>
</div>
</li>
<li>
......
......@@ -47,20 +47,40 @@
<p :class="{ active: isReference && item.isSales == 1 && data[0].transformRate < data[1].transformRate }">转化率</p>
<p :class="{ active: isReference && item.isSales == 1 && data[0].transformRate < data[1].transformRate }">{{ formatterRate(item.transformRate) }}</p>
</div>
<div class="item-bg bg-green center_flex min-w-206">
<div class="item-bg bg-green center_flex min-w-206" :class="[isCluePage && 'h143']">
<div>
<p style="min-width: 130px">{{ item.isSales == 1 ? '触达顾客转化人数' : '转化人数' }}<tip :text="item.isSales == 1 ? experText.convMbrText : controText.convMbrText" /></p>
<p style="min-width: 130px">{{ formatterNum(item.convMbrNum) }}</p>
</div>
</div>
<div class="item-bg bg-green min-w-389">
<div>
<p>{{ item.isSales == 1 ? '触达顾客订单数' : '转化订单数' }}<tip :text="item.isSales == 1 ? experText.convOrderText : controText.convOrderText" /></p>
<p>{{ formatterNum(item.convOrderCnt) }}</p>
</div>
<div>
<p>{{ item.isSales == 1 ? '触达顾客转化收益' : '转化收益' }}<tip :text="item.isSales == 1 ? experText.convSalesText : controText.convSalesText" /></p>
<p>{{ formatterNumAndFixed(item.convSalesAmt) }}</p>
<div class="item-bg bg-green min-w-389 wrap" :class="[isCluePage && 'h143']">
<template v-if="!isCluePage">
<div>
<p>{{ item.isSales == 1 ? '触达顾客订单数' : '转化订单数' }}<tip :text="item.isSales == 1 ? experText.convOrderText : controText.convOrderText" /></p>
<p>{{ formatterNum(item.convOrderCnt) }}</p>
</div>
<div>
<p>{{ item.isSales == 1 ? '触达顾客转化收益' : '转化收益' }}<tip :text="item.isSales == 1 ? experText.convSalesText : controText.convSalesText" /></p>
<p>{{ formatterNumAndFixed(item.convSalesAmt) }}</p>
</div>
</template>
<div class="center_wrap" v-else>
<div>
<p>{{ item.isSales == 1 ? '触达顾客订单数' : '转化订单数' }}<tip :text="item.isSales == 1 ? experText.convOrderText : controText.convOrderText" /></p>
<p>{{ formatterNum(item.convOrderCnt) }}</p>
</div>
<div>
<p>{{ item.isSales == 1 ? '触达顾客转化收益' : '转化收益' }}<tip :text="item.isSales == 1 ? experText.convSalesText : controText.convSalesText" /></p>
<p>{{ formatterNumAndFixed(item.convSalesAmt) }}</p>
</div>
<div>
<p>{{ '客单价(元)' }}<tip :text="controText.customrPriceText" /></p>
<p>{{ formatterNumAndFixed(item.customrPrice) }}</p>
</div>
<div>
<p>{{ '连带率' }}<tip :text="controText.relatedRateText" /></p>
<p>{{ timeLimit && item.relatedRate != '--' ? formatterNumAndFixed(item.relatedRate) : '--' }}</p>
</div>
</div>
</div>
</div>
......@@ -113,7 +133,9 @@ export default {
planMbrText: '当前智能营销计划选择顾客范围中,未进行营销触达的顾客人数。用于与实验组进行对比,评估营销/未营销所带来的转化效果差异。',
convMbrText: '当前智能营销计划选择顾客范围中,未进行营销触达的顾客人数,在收益有效期内产生消费的顾客人数。收益有效期按照实验组首次进行营销触达时间加收益分析天数统计。',
convOrderText: '当前智能营销计划选择顾客范围中,未进行营销触达的顾客,在收益有效期内产生消费的订单数量。收益有效期按照实验组首次进行营销触达时间加收益分析天数统计。',
convSalesText: '当前智能营销计划选择顾客范围里,未进行营销触达的顾客,在收益有效期内产生消费的订单金额。收益有效期按照实验组首次进行营销触达时间加收益分析天数统计。'
convSalesText: '当前智能营销计划选择顾客范围里,未进行营销触达的顾客,在收益有效期内产生消费的订单金额。收益有效期按照实验组首次进行营销触达时间加收益分析天数统计。',
customrPriceText: '触达顾客转化收益/触达顾客转化人数',
relatedRateText: '触达顾客订单商品件数/触达顾客订单数。在2021年10月29日前创建的智能营销计划不进行连带率统计。'
}
};
},
......@@ -259,6 +281,16 @@ export default {
.active {
color: #f5222d !important;
}
.center_wrap {
display: flex;
height: 90%;
flex-wrap: wrap;
flex-direction: column;
justify-content: space-between;
}
.h143 {
height: 143px !important;
}
.min-w-173 {
min-width: 173px;
}
......
......@@ -5,7 +5,7 @@
<img :src="require('@/assets/img/icon-phone.png')" class="img" />
<h2>话务</h2>
</div>
<el-link type="primary" :underline="false" style="color: #1890ff" @click="$emit('toClue', '话务')">查看详情<i class="el-icon-arrow-right" style="margin-left: 10px"></i></el-link>
<div class="detail" @click="$emit('toClue', '话务')"><i class="iconfont icon-chakanxiangqing"></i>查看详情</div>
</div>
<phone-traffic-sum v-bind="$attrs" />
</div>
......@@ -25,9 +25,9 @@ export default {
padding: 22px 20px 30px !important;
font-family: PingFangSC-Regular, PingFang SC;
.title {
height: 22px;
margin-bottom: 20px;
line-height: 22px;
height: 32px;
margin-bottom: 10px;
line-height: 32px;
h2 {
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
......@@ -44,5 +44,23 @@ export default {
justify-content: space-between;
align-items: center;
}
.detail {
padding: 0 10px;
background: rgba(24, 144, 255, 0.1);
border-radius: 4px;
height: 32px;
color: #1890ff;
box-sizing: border-box;
display: flex;
align-items: center;
cursor: pointer;
border: none;
&:hover {
color: #46a6ff;
}
i {
margin-right: 2px;
}
}
}
</style>
......@@ -36,8 +36,8 @@ export default {
const chart = new G2.Chart({
container: 'draw_g2',
forceFit: true,
height: 376,
padding: [55, 90, 46, 68]
height: 385,
padding: [55, 90, 60, 68]
});
chart.source(this.chartData);
chart.tooltip({
......@@ -45,8 +45,8 @@ export default {
shared: true
});
chart.legend({
position: 'top',
offsetY: -20
position: 'bottom',
offsetY: 8
});
chart.axis('value', {
grid: {
......@@ -199,6 +199,7 @@ export default {
</script>
<style lang="scss" scoped>
.draw {
margin-bottom: 30px;
.title {
padding-left: 12px;
font-size: 16px;
......@@ -209,7 +210,7 @@ export default {
margin-bottom: 36px;
}
#draw_g2 {
height: 376px;
height: 385px;
margin: 0 auto;
position: relative;
font-size: 12px;
......
......@@ -7,11 +7,11 @@
</div>
</div>
<div v-if="customServiceData">
<h3>{{ $route.query.effectType == 0 ? '客服接口(文本、图文、图片、小程序)' : '客服接口(小程序)' }}</h3>
<h3>客服接口{{ $route.query.effectType == 0 ? `${getBatchType(['text', 'teletext', 'image', 'wxa'])}` : `${getBatchType(['wxa'])}` }}</h3>
<wechat-sum :data="customServiceData" :tipText="customText" />
</div>
<div v-if="batchData" style="margin-top: 30px">
<h3>群发接口(文本、图文、图片)</h3>
<h3>群发接口{{ getBatchType(['text', 'teletext', 'image']) }}</h3>
<wechat-sum :data="batchData" :tipText="batchText" />
</div>
</div>
......@@ -28,6 +28,20 @@ export default {
},
batchData: {
type: Object || undefined
},
touchType: {
type: Object
}
},
computed: {
getBatchType() {
return v => {
let str = '';
v.forEach(el => {
if (this.touchType[el]) str = !str ? this.touchType[el] : str + '、' + this.touchType[el];
});
return str ? `(${str})` : '';
};
}
},
data() {
......
......@@ -3,7 +3,7 @@
<div class="dm-wrap effect">
<div class="title">
<h2>计划整体效果</h2>
<el-link type="primary" :underline="false" style="color: #1890ff" @click="toClue('计划整体')">查看详情<i class="el-icon-arrow-right" style="margin-left: 10px"></i></el-link>
<el-button type="primary" class="detail" @click="toClue('计划整体')"><i class="iconfont icon-chakanxiangqing"></i>查看详情</el-button>
</div>
<touch-charts :type="0" :createTime="$route.query.createTime" />
<market-list v-if="marketListData.length" :isRepeat="isRepeat" :data="marketListData" :isReference="isReference" :batchNum="batchNum" :batchTimes="batchTime" @toClue="toClue" />
......@@ -12,7 +12,7 @@
<batch-send v-if="findTypeIsExist(1) || findTypeIsExist(2) || findTypeIsExist(3)" :task-list="findTypeObj(optionsList, 1)" :tel-traffic-list="findTypeObj(optionsList, 2)" :msg-list="findTypeObj(optionsList, 3)" @toClue="toClue" />
<phone-traffic v-if="findTypeIsExist(4)" :data="findTypeObj(optionsList, 4)" @toClue="toClue" />
<short-msg v-if="findTypeIsExist(5)" :data="findTypeObj(optionsList, 5)" />
<wechat v-if="findTypeIsExist(6) || findTypeIsExist(7)" :custom-service-data="findTypeObj(optionsList, 6)" :batch-data="findTypeObj(optionsList, 7)" />
<wechat v-if="(findTypeIsExist(6) || findTypeIsExist(7)) && getTouchTypeFlag" :custom-service-data="findTypeObj(optionsList, 6)" :batch-data="findTypeObj(optionsList, 7)" :touch-type="touchType" />
</div>
</template>
<script>
......@@ -23,7 +23,7 @@ import batchSend from '@/views/ecm/touch-components/batch-send/index.vue';
import phoneTraffic from '@/views/ecm/touch-components/phone-traffic/index.vue';
import shortMsg from '@/views/ecm/touch-components/short-msg/index.vue';
import wechat from '@/views/ecm/touch-components/wechat/index.vue';
import { ecmTouchEffectTable, ecmPlanTouchConfig, getCardLeads, getCardLeadsList, ecmTouchTypeTableList } from '@/service/api/ecmApi.js';
import { ecmTouchEffectTable, ecmPlanTouchConfig, getCardLeads, getCardLeadsList, ecmTouchTypeTableList, getTouchType } from '@/service/api/ecmApi.js';
export default {
name: 'ecm',
data() {
......@@ -37,6 +37,8 @@ export default {
batchTime: '', // 批次时间
cardLead: {},
cardLeadTable: [],
touchType: {},
getTouchTypeFlag: false,
optionsList: [] //type 1 群发任务、2 群发失败-话务、3 群发失败-短信、4 话务、5 短信、6 微信-触点 、7 微信-文本、图文、图片
};
},
......@@ -58,6 +60,7 @@ export default {
this.getTouchConfig();
this.getCardLeadsSum();
this.getCardLeadTable();
this.getTouchTypeList();
},
methods: {
toClue(type) {
......@@ -118,6 +121,31 @@ export default {
ecmTouchTypeTableList({ ecmPlanId: this.ecmPlanId }).then(res => {
this.optionsList = res.result || [];
});
},
// 获取营销类型
getTouchTypeList() {
getTouchType({ ecmPlanId: this.$route.params.id })
.then(res => {
this.touchType = {};
const result = Array.isArray(res.result) ? [...new Set(res.result)] : [];
result.forEach(el => {
switch (el) {
case 'text':
this.touchType.text = '文本';
break;
case 'teletext':
this.touchType.teletext = '图文';
break;
case 'wxa':
this.touchType.wxa = '小程序';
break;
case 'image':
this.touchType.image = '图片';
break;
}
});
})
.finally(() => (this.getTouchTypeFlag = true));
}
},
computed: {
......@@ -152,5 +180,23 @@ export default {
line-height: 22px;
}
}
.detail {
padding: 0 10px;
background: rgba(24, 144, 255, 0.1);
border-radius: 4px;
height: 32px;
color: #1890ff;
box-sizing: border-box;
display: flex;
align-items: center;
cursor: pointer;
border: none;
&:hover {
color: #46a6ff;
}
i {
margin-right: 2px;
}
}
}
</style>
......@@ -8,10 +8,10 @@
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.shareFlag === 1" label="分享图" prop="shareImg.imgUrl" class="width50" :rules="{ required: true, message: '请上传分享图片', trigger: 'blur' }">
<dm-upload-avatar :limit="{ maxSize: 1 }" name="H5分享图" :model.sync="form.shareImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:200*200,格式为jpg/png/gif。图片大小不超过1MB,点击图片可重新上传。" :disabled="isInfo"></dm-upload-avatar>
<dm-upload-avatar style="white-space: nowrap" :limit="{ maxSize: 1 }" name="H5分享图" :model.sync="form.shareImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:200*200,格式为jpg/png/gif。图片大小不超过1MB,点击图片可重新上传。" :disabled="isInfo"></dm-upload-avatar>
</el-form-item>
<el-form-item v-if="form.shareFlag === 1" prop="shareAppImg.imgUrl" class="width50">
<dm-upload-avatar :limit="{ maxSize: 1 }" name="小程序分享图" :model.sync="form.shareAppImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:320*240,格式为jpg/png。图片大小不超过1MB,点击图片可重新上传。" :disabled="isInfo"></dm-upload-avatar>
<dm-upload-avatar style="white-space: nowrap" :limit="{ maxSize: 1 }" name="小程序分享图" :model.sync="form.shareAppImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:320*240,格式为jpg/png。图片大小不超过1MB,点击图片可重新上传。" :disabled="isInfo"></dm-upload-avatar>
</el-form-item>
<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>
......
......@@ -87,7 +87,12 @@
</div>
</template>
</el-table-column>
<el-table-column v-for="(v, i) in messageHeader" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="i" :prop="v.prop" :label="v.label" :formatter="v.formatter"></el-table-column>
<el-table-column v-for="(v, i) in messageHeader" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="i" :prop="v.prop" :label="v.label" :formatter="v.formatter">
<template slot-scope="{ row }">
<div v-if="v.formatter" v-html="v.formatter(row)"></div>
<span v-else>{{ row[v.prop] }}</span>
</template>
</el-table-column>
<el-table-column :min-width="80" align="left" label="错误码" prop="errorMsg">
<template slot-scope="scope">
<span v-if="scope.row.errorMsg == -1">--</span>
......@@ -97,9 +102,10 @@
</el-table-column>
<el-table-column :min-width="120" align="left" label="上报时间" prop="backTime">
<template slot-scope="scope">
<p class="cell-time">
<p class="cell-time" v-if="scope.row.backTime">
{{ formatDateTimeByType(scope.row.backTime, 'yyyy-MM-dd-HH-mm-ss', true).y }}<br /><span>{{ formatDateTimeByType(scope.row.backTime, 'yyyy-MM-dd-HH-mm-ss', true).h }}</span>
</p>
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="false" :min-width="150" align="left" label="短信内容" prop="remark">
......@@ -111,7 +117,7 @@
</template>
</el-table-column>
</el-table>
<dm-pagination v-show="messageList.length" background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
<dm-pagination hide-on-single-page v-show="messageList.length" background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
</section>
<error-code-dialog :show.sync="errorCodeShow"></error-code-dialog>
<vue-gic-export-excel :dialogVisible.sync="dialogVisible" :dataArr="messageList" :type="2" :excelUrl="excelUrl" :params="params" :projectName="projectName"></vue-gic-export-excel>
......@@ -143,7 +149,24 @@ export default {
minWidth: '80',
align: 'left',
formatter: function(row) {
return row.sendStatus === 0 ? '提交成功' : row.sendStatus === 1 ? '未提交' : '提交失败';
let status = row.sendStatus * 1;
let statucClass;
let text;
switch (status) {
case 0:
statucClass = 'dm-status--success';
text = '提交成功';
break;
case 1:
statucClass = 'dm-status--info';
text = '未提交';
break;
default:
statucClass = 'dm-status--error';
text = '提交失败';
break;
}
return `<span class='${statucClass}'><span class="vertical-middle">${text}</span></span>`;
}
}
// {
......
......@@ -68,7 +68,12 @@
</div>
</template>
</el-table-column>
<el-table-column v-for="(v, i) in messageHeader" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="i" :prop="v.prop" :label="v.label" :formatter="v.formatter"></el-table-column>
<el-table-column v-for="(v, i) in messageHeader" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="i" :prop="v.prop" :label="v.label" :formatter="v.formatter">
<template slot-scope="{ row }">
<div v-if="v.formatter" v-html="v.formatter(row)"></div>
<span v-else>{{ row[v.prop] || '--' }}</span>
</template>
</el-table-column>
<el-table-column :min-width="80" align="left" label="错误码" prop="errorMsg" show-overflow-tooltip>
<template slot-scope="scope">
<span v-if="scope.row.errorMsg == -1">--</span>
......@@ -78,9 +83,10 @@
</el-table-column>
<el-table-column :min-width="100" align="left" label="上报时间" prop="backTime">
<template slot-scope="scope">
<p class="cell-time">
<p v-if="scope.row.backTime" class="cell-time">
{{ formatDateTimeByType(scope.row.backTime, 'yyyy-MM-dd-HH-mm-ss', true).y }}<br /><span>{{ formatDateTimeByType(scope.row.backTime, 'yyyy-MM-dd-HH-mm-ss', true).h }}</span>
</p>
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="false" :min-width="150" align="left" label="短信内容" prop="remark">
......@@ -92,7 +98,7 @@
</template>
</el-table-column>
</el-table>
<dm-pagination v-show="messageList.length" background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
<dm-pagination hide-on-single-page v-show="messageList.length" background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[20, 40, 60, 80]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></dm-pagination>
</section>
<error-code-dialog :show.sync="errorCodeShow"></error-code-dialog>
<vue-gic-export-excel :dialogVisible.sync="dialogVisible" :dataArr="messageList" :type="2" :excelUrl="excelUrl" :params="params" :projectName="projectName"></vue-gic-export-excel>
......@@ -116,20 +122,37 @@ export default {
messageList: [],
messageLoading: false,
messageHeader: [
{ label: '手机号码', prop: 'telephone', width: '120', align: 'left' },
{ label: '手机号码', prop: 'telephone', minWidth: '120', align: 'left' },
{
label: '提交状态',
prop: 'sendStatus',
width: '80',
minWidth: '80',
align: 'left',
formatter: function(row) {
return row.sendStatus === 0 ? '提交成功' : row.sendStatus === 1 ? '未提交' : '提交失败';
let status = row.sendStatus * 1;
let statucClass;
let text;
switch (status) {
case 0:
statucClass = 'dm-status--success';
text = '提交成功';
break;
case 1:
statucClass = 'dm-status--info';
text = '未提交';
break;
default:
statucClass = 'dm-status--error';
text = '提交失败';
break;
}
return `<span class='${statucClass}'><span class="vertical-middle">${text}</span></span>`;
}
},
{
label: '回执状态',
prop: 'backStatus',
width: '80',
minWidth: '80',
align: 'left',
formatter: function(row) {
// eslint-disable-next-line
......
<template>
<section class="recharge">
<div class="dm-wrap">
日期:<el-date-picker :clearable="false" :pickerOptions="pickerOptions" v-model="dateTime" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="loadAll(false)"></el-date-picker>
日期:<el-date-picker :disabled="loading" :clearable="false" :pickerOptions="pickerOptions" v-model="dateTime" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="loadAll(false)"></el-date-picker>
<span class="fz12 gray">* 此处仅支持筛选近半年的统计数据</span>
</div>
<div class="dm-form__wrap">
......
......@@ -55,6 +55,30 @@
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe892;</span>
<div class="name">查看详情</div>
<div class="code-name">&amp;#xe892;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe6f8;</span>
<div class="name">教程</div>
<div class="code-name">&amp;#xe6f8;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe675;</span>
<div class="name">操作日志</div>
<div class="code-name">&amp;#xe675;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe671;</span>
<div class="name">确认 圆 正确 对勾 提交 成功 完成 </div>
<div class="code-name">&amp;#xe671;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe66d;</span>
<div class="name">支付宝</div>
<div class="code-name">&amp;#xe66d;</div>
......@@ -1548,9 +1572,9 @@
<pre><code class="language-css"
>@font-face {
font-family: 'iconfont';
src: url('iconfont.woff2?t=1629873400222') format('woff2'),
url('iconfont.woff?t=1629873400222') format('woff'),
url('iconfont.ttf?t=1629873400222') format('truetype');
src: url('iconfont.woff2?t=1634537158782') format('woff2'),
url('iconfont.woff?t=1634537158782') format('woff'),
url('iconfont.ttf?t=1634537158782') format('truetype');
}
</code></pre>
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
......@@ -1577,6 +1601,42 @@
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-chakanxiangqing"></span>
<div class="name">
查看详情
</div>
<div class="code-name">.icon-chakanxiangqing
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-jiaocheng"></span>
<div class="name">
教程
</div>
<div class="code-name">.icon-jiaocheng
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-caozuorizhi"></span>
<div class="name">
操作日志
</div>
<div class="code-name">.icon-caozuorizhi
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-querenyuanzhengqueduigoutijiaochenggongwancheng"></span>
<div class="name">
确认 圆 正确 对勾 提交 成功 完成
</div>
<div class="code-name">.icon-querenyuanzhengqueduigoutijiaochenggongwancheng
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-umidd17"></span>
<div class="name">
支付宝
......@@ -3819,6 +3879,38 @@
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-chakanxiangqing"></use>
</svg>
<div class="name">查看详情</div>
<div class="code-name">#icon-chakanxiangqing</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-jiaocheng"></use>
</svg>
<div class="name">教程</div>
<div class="code-name">#icon-jiaocheng</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-caozuorizhi"></use>
</svg>
<div class="name">操作日志</div>
<div class="code-name">#icon-caozuorizhi</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-querenyuanzhengqueduigoutijiaochenggongwancheng"></use>
</svg>
<div class="name">确认 圆 正确 对勾 提交 成功 完成 </div>
<div class="code-name">#icon-querenyuanzhengqueduigoutijiaochenggongwancheng</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-umidd17"></use>
</svg>
<div class="name">支付宝</div>
......
@font-face {
font-family: "iconfont"; /* Project id 688955 */
src: url('iconfont.woff2?t=1629873400222') format('woff2'),
url('iconfont.woff?t=1629873400222') format('woff'),
url('iconfont.ttf?t=1629873400222') format('truetype');
src: url('iconfont.woff2?t=1634537158782') format('woff2'),
url('iconfont.woff?t=1634537158782') format('woff'),
url('iconfont.ttf?t=1634537158782') format('truetype');
}
.iconfont {
......@@ -13,6 +13,22 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-chakanxiangqing:before {
content: "\e892";
}
.icon-jiaocheng:before {
content: "\e6f8";
}
.icon-caozuorizhi:before {
content: "\e675";
}
.icon-querenyuanzhengqueduigoutijiaochenggongwancheng:before {
content: "\e671";
}
.icon-umidd17:before {
content: "\e66d";
}
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -6,6 +6,34 @@
"description": "",
"glyphs": [
{
"icon_id": "9002691",
"name": "查看详情",
"font_class": "chakanxiangqing",
"unicode": "e892",
"unicode_decimal": 59538
},
{
"icon_id": "22607678",
"name": "教程",
"font_class": "jiaocheng",
"unicode": "e6f8",
"unicode_decimal": 59128
},
{
"icon_id": "10605659",
"name": "操作日志",
"font_class": "caozuorizhi",
"unicode": "e675",
"unicode_decimal": 58997
},
{
"icon_id": "23089611",
"name": "确认 圆 正确 对勾 提交 成功 完成 ",
"font_class": "querenyuanzhengqueduigoutijiaochenggongwancheng",
"unicode": "e671",
"unicode_decimal": 58993
},
{
"icon_id": "18516314",
"name": "支付宝",
"font_class": "umidd17",
......
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