You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
521 lines
13 KiB
521 lines
13 KiB
<template> |
|
<div class="market_data_page"> |
|
<div class="data_list"> |
|
<ul> |
|
<li v-for="(item,index) in dataList" :key="index"> |
|
<p>{{ item.value }}</p> |
|
<p>{{ item.name }} <i class="el-icon-warning-outline" :title="item.tips"></i></p> |
|
</li> |
|
</ul> |
|
</div> |
|
|
|
<div v-if="false" class="visit_data"> |
|
<div class="item_box"> |
|
<p class="echart_title">访问分布情况</p> |
|
<map-chart :mapdata="mapData" /> |
|
</div> |
|
<div class="item_box"> |
|
<div class="item_box-chart"> |
|
<p class="echart_title">访问占比</p> |
|
<div class="chart_box"><cake :chart-data="cakeData" /></div> |
|
<div class="chart_box"><cake :chart-data="cakeData" /></div> |
|
</div> |
|
<div class="item_box-chart"> |
|
<p class="echart_title">终端分布</p> |
|
<div class="chart_box"><cake :chart-data="cakeData" /></div> |
|
<div class="chart_box"><cake :chart-data="cakeData" /></div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<div class="tendency_data"> |
|
<div class="item_box"> |
|
<p class="echart_title">趋势图</p> |
|
<el-tabs v-model="activeName"> |
|
<el-tab-pane v-for="(item, index) in tabList" :key="index" :label="item.name" :name="item.id" /> |
|
</el-tabs> |
|
<bar :chart-data="tendencyData" style="height: calc(100% - 54px)" /> |
|
</div> |
|
<div class="item_box"> |
|
<p class="title"> |
|
商家成交排行榜 |
|
<span>成交额/元</span> |
|
</p> |
|
<ul v-if="merchantRank.length"> |
|
<li v-for="(item,index) in merchantRank" :key="index"> |
|
<p> |
|
<span>{{ index + 1 }}</span> |
|
</p> |
|
<p>{{ item.storeName }}</p> |
|
<p>{{ item.tradeAmount / 100 }}</p> |
|
</li> |
|
</ul> |
|
<div |
|
v-else |
|
class="empty" |
|
> |
|
<img |
|
:src="empty" |
|
alt="" |
|
/> |
|
<p>暂无数据</p> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<div v-if="false" class="sale_data"> |
|
<div class="item_box"> |
|
<p class="echart_title">销售类别分类</p> |
|
<pie :chart-data="saleData" /> |
|
</div> |
|
<div class="item_box"> |
|
<p class="title"> |
|
畅销商品排行榜 |
|
<span>售卖数/个</span> |
|
</p> |
|
<ul> |
|
<li v-for="(item,index) in rankList" :key="index"> |
|
<p> |
|
<span>{{ index + 1 }}</span> |
|
</p> |
|
<p>{{ item.name }}</p> |
|
<p>{{ item.value }}</p> |
|
</li> |
|
</ul> |
|
</div> |
|
</div> |
|
|
|
<div class="merchants_detail"> |
|
<p> |
|
商家数据明细 |
|
<span v-if="false">导出</span> |
|
</p> |
|
<el-table |
|
:data="tableData.statItemDTOList" |
|
border |
|
style="width: 100%" |
|
> |
|
<el-table-column |
|
prop="storeName" |
|
label="店铺名称" |
|
/> |
|
<el-table-column |
|
prop="tenantCode" |
|
label="店铺编码" |
|
/> |
|
<el-table-column |
|
prop="tradeProductCount" |
|
:formatter="getNum" |
|
label="参与商品数 (件)" |
|
/> |
|
<el-table-column |
|
prop="tradeUserCount" |
|
:formatter="getNum" |
|
label="访客数 (人)" |
|
/> |
|
<el-table-column |
|
prop="orderCount" |
|
:formatter="getNum" |
|
label="订单数 (笔)" |
|
/> |
|
<el-table-column |
|
prop="payedUserCount" |
|
:formatter="getNum" |
|
label="成交客户数 (笔)" |
|
/> |
|
<el-table-column |
|
:formatter="getPrice" |
|
prop="pricePerUser" |
|
label="客单件 (元)" |
|
/> |
|
<el-table-column |
|
:formatter="getPrice" |
|
prop="tradeAmount" |
|
label="成交总额 (元)" |
|
/> |
|
</el-table> |
|
<pagination |
|
v-show="tableData.total > 0" |
|
:limit.sync="formParams.pageSize" |
|
:page.sync="formParams.pageIndex" |
|
:total="Number(tableData.total)" |
|
@pagination="fetch" |
|
/> |
|
</div> |
|
</div> |
|
</template> |
|
|
|
<script> |
|
import empty from '@/assets/empty.png' |
|
import Marketing from '@/api/Marketing' |
|
import Pagination from '@/components/Pagination' |
|
import bar from '@/components/marketEchart/bar' |
|
import pie from '@/components/marketEchart/pie' |
|
import echarts from 'echarts' |
|
import mapChart from '@/components/marketEchart/map' |
|
import cake from '@/components/marketEchart/cake' |
|
export default { |
|
components: { |
|
Pagination, |
|
bar, |
|
pie, |
|
cake, |
|
mapChart |
|
}, |
|
props: { |
|
params: { |
|
type: Object, |
|
default: () => {} |
|
} |
|
}, |
|
data() { |
|
return { |
|
empty: empty, |
|
dataList: [ |
|
{ name: '成交总额(元)', value: 0, tips: '活动开始之后参与活动的商品总成交额', field: 'tradeAmout' }, |
|
{ name: '支付订单数(笔)', value: 0, tips: '活动期间活动商品带来的支付成功订单数,不包括退款订单', field: 'tradeOrderCount' }, |
|
{ name: '支付客户数(人)', value: 0, tips: '对活动商品进行支付的客户数', field: 'tradeUserCount' }, |
|
{ name: '参与商家数(家)', value: 0, tips: '本活动报名成功的商家数量', field: 'tradeTenantCount' }, |
|
{ name: '参与商品数(件)', value: 0, tips: '本活动报名中的商家所有的活动商品数,不按最小SKU算', field: 'tradeProductCount' } |
|
|
|
], |
|
rankList: [ |
|
{ name: '阿里巴巴小店', value: '12321,3232' }, |
|
{ name: '阿里巴巴小店', value: '12321,3232' }, |
|
{ name: '阿里巴巴小店', value: '12321,3232' }, |
|
{ name: '阿里巴巴小店', value: '12321,3232' }, |
|
{ name: '阿里巴巴小店', value: '12321,3232' }, |
|
{ name: '阿里巴巴小店', value: '12321,3232' }, |
|
{ name: '阿里巴巴小店', value: '12321,3232' }, |
|
{ name: '阿里巴巴小店', value: '12321,3232' }, |
|
{ name: '阿里巴巴小店', value: '12321,3232' }, |
|
{ name: '阿里巴巴小店', value: '12321,3232' } |
|
|
|
], |
|
merchantRank: [], |
|
tabList: [ |
|
{ name: '销售额', id: 'sale' } |
|
// { name: '访问量', id: 'visit' } |
|
], |
|
activeName: 'sale', |
|
tendencyData: { |
|
xData: [], |
|
series: { |
|
type: 'bar', |
|
itemStyle: { |
|
normal: { |
|
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ |
|
offset: 0, |
|
color: '#74D6FF' |
|
}, { |
|
offset: 1, |
|
color: '#3A68F1' |
|
}]) |
|
} |
|
}, |
|
label: { |
|
normal: { |
|
show: true, |
|
position: 'top', |
|
color: '#fff', |
|
formatter: function (p) { |
|
return p.value || '' |
|
} |
|
} |
|
}, |
|
data: [], |
|
barMaxWidth: '20px' |
|
} |
|
}, |
|
saleData: { |
|
series: { |
|
data: [ |
|
{ name: '家用电器', value: 4544 }, |
|
{ name: '食用酒水', value: 4544 }, |
|
{ name: '个护健康', value: 4544 }, |
|
{ name: '服饰箱包', value: 4544 }, |
|
{ name: '母婴产品', value: 4544 }, |
|
{ name: '其它', value: 4544 } |
|
] |
|
} |
|
}, |
|
cakeData: { |
|
series: { |
|
data: [ |
|
{ name: '湖北省', value: 75 }, |
|
{ name: '广东省', value: 20 } |
|
] |
|
} |
|
}, |
|
mapData: [{ fProvince: "北京", fCity: '北京', fVisitCount: 199 }], |
|
formParams: { |
|
pageSize: 10, |
|
pageIndex: 1 |
|
}, |
|
tableData: { |
|
|
|
} |
|
} |
|
}, |
|
created() { |
|
this.getDetail() |
|
this.findTenantStatDetail() |
|
}, |
|
methods: { |
|
async getDetail() { |
|
const arr = this.dataList |
|
const res = await Marketing.getDetail(this.params.id) |
|
const resData = res.data |
|
if (resData.code === 0) { |
|
const d = resData.data |
|
const x = [] |
|
const y = [] |
|
arr.map(item => { |
|
item.value = d[item.field] || 0 |
|
if (item.field === 'tradeAmout') { |
|
item.value /= 100 |
|
} |
|
}) |
|
if (d.promotionStatDayDTOList && d.promotionStatDayDTOList.length) { |
|
d.promotionStatDayDTOList.forEach(item => { |
|
x.push(item.statDay.replace(/-/, '/')) |
|
y.push(item.tradeAmount / 100) |
|
}) |
|
} |
|
this.tendencyData.xData = x |
|
this.tendencyData.series.data = y |
|
this.merchantRank = d.promotionTenantRankDTOList || [] |
|
} |
|
}, |
|
async findTenantStatDetail() { |
|
const res = await Marketing.findTenantStatDetail(Object.assign({}, this.formParams, { promotionId: this.params.id })) |
|
const resData = res.data |
|
if (resData.code === 0) { |
|
this.tableData = resData.data |
|
} |
|
}, |
|
fetch() { |
|
this.findTenantStatDetail() |
|
}, |
|
getPrice(row, item, value) { |
|
return value / 100 |
|
}, |
|
getNum(row, item, value) { |
|
return value || 0 |
|
} |
|
} |
|
} |
|
</script> |
|
|
|
<style lang='less' scoped> |
|
.market_data_page { |
|
.data_list { |
|
box-shadow:0px 0px 10px 0px rgba(51,51,51,0.15); |
|
border-radius:4px; |
|
ul { |
|
height: 140px; |
|
overflow: hidden; |
|
list-style: none; |
|
li { |
|
float: left; |
|
width: 20%; |
|
text-align: center; |
|
p { |
|
margin: 0; |
|
padding: 0; |
|
i { |
|
color: red; |
|
} |
|
&:nth-child(1) { |
|
font-size:40px; |
|
color:rgba(255,173,17,1); |
|
font-weight: 600; |
|
line-height: 100px; |
|
} |
|
&:nth-child(2) { |
|
font-size:18px; |
|
color:rgba(51,51,51,1); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
.visit_data { |
|
overflow: hidden; |
|
.item_box { |
|
position: relative; |
|
height: 520px; |
|
width: calc(50% - 10px); |
|
margin: 10px 0; |
|
float: left; |
|
box-sizing: border-box; |
|
border-radius:4px; |
|
&:nth-child(1) { |
|
margin-right: 20px; |
|
border-left: 1px solid rgba(51,51,51,0.15); |
|
box-shadow:0px 0px 10px 0px rgba(51,51,51,0.15); |
|
} |
|
&:nth-child(2) { |
|
.item_box-chart { |
|
overflow: hidden; |
|
position: relative; |
|
height: calc(50% - 10px); |
|
margin-bottom: 20px; |
|
box-shadow:0px 0px 10px 0px rgba(51,51,51,0.15); |
|
border-right: 1px solid rgba(51,51,51,0.15); |
|
.chart_box { |
|
width: 50%; |
|
height: 100%; |
|
float: left; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
.tendency_data, .sale_data { |
|
overflow: hidden; |
|
.item_box { |
|
position: relative; |
|
float: left; |
|
height: 520px; |
|
margin: 10px 0; |
|
box-shadow:0px 0px 10px 0px rgba(51,51,51,0.15); |
|
border-radius:4px; |
|
box-sizing: border-box; |
|
&:nth-child(1) { |
|
width: calc(60% - 20px); |
|
margin-right: 20px; |
|
border-left: 1px solid rgba(51,51,51,0.15); |
|
} |
|
&:nth-child(2) { |
|
width: 40%; |
|
border-right: 1px solid rgba(51,51,51,0.15); |
|
padding: 20px; |
|
p.title { |
|
font-size:18px; |
|
color: #333333; |
|
span { |
|
font-size:16px; |
|
float: right; |
|
} |
|
} |
|
ul { |
|
li { |
|
display: flex; |
|
p { |
|
flex: 2; |
|
margin: 0; |
|
margin-bottom: 20px; |
|
&:nth-child(1) { |
|
span { |
|
display: inline-block; |
|
width:26px; |
|
height:26px; |
|
line-height: 26px; |
|
text-align: center; |
|
background:rgba(221,221,221,1); |
|
border-radius:50%; |
|
} |
|
|
|
} |
|
&:nth-child(2) { |
|
flex: 7; |
|
} |
|
&:nth-child(3) { |
|
flex: 5; |
|
} |
|
} |
|
&:nth-child(-n + 3) { |
|
p { |
|
&:nth-child(1) { |
|
span { |
|
background:rgba(255,121,17,1); |
|
color: #fff; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
.tendency_data { |
|
.item_box { |
|
&:nth-child(1) { |
|
padding: 50px 80px 0; |
|
} |
|
} |
|
} |
|
|
|
.merchants_detail { |
|
margin: 10px 0; |
|
padding: 10px; |
|
box-shadow:0px 0px 10px 0px rgba(51,51,51,0.15); |
|
min-height: 100px; |
|
border-radius:4px; |
|
p { |
|
font-size:18px; |
|
color: #333333; |
|
line-height: 38px; |
|
height:38px; |
|
span { |
|
display: inline-block; |
|
float: right; |
|
color: #fff; |
|
text-align: center; |
|
width:60px; |
|
height:38px; |
|
font-size:14px; |
|
background:rgba(58,104,241,1); |
|
border-radius:4px; |
|
} |
|
} |
|
} |
|
|
|
.empty { |
|
// height: calc(100% - 50px); |
|
|
|
img { |
|
width:80px; |
|
height:80px; |
|
margin: 100px auto 10px; |
|
display: block; |
|
} |
|
p { |
|
text-align: center; |
|
color: #333333; |
|
} |
|
} |
|
|
|
/deep/ .el-table { |
|
th { |
|
background: #EEF3FF; |
|
color:#333333; |
|
font-size:16px; |
|
font-weight: 400; |
|
border-color: #E0E5EB; |
|
text-align: center; |
|
} |
|
td { |
|
font-size: 14px; |
|
text-align: center; |
|
color: #666666; |
|
} |
|
} |
|
|
|
.echart_title { |
|
font-size:18px; |
|
position: absolute; |
|
top: 30px; |
|
left: 20px; |
|
margin: 0; |
|
padding: 0; |
|
} |
|
} |
|
|
|
/deep/ .el-tabs { |
|
|
|
} |
|
</style>
|
|
|