java-mall-admin/src/views/index/index.vue
2025-04-24 15:48:05 +08:00

1299 lines
38 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="dashboard-container">
<el-card class="order-card-todo" shadow="hover">
<template #header>
<vab-icon icon="todo-line" />
{{ __('待办事项') }}
</template>
<el-row
class="order-card-todo-content"
style="padding-left: 20px"
:gutter="24"
>
<el-col :lg="4" :md="4" :sm="8" :xl="4" :xs="12">
<el-row align="middle" type="flex">
<el-col class="xe-icon one1">
<vab-icon icon="file-list-2-line" />
</el-col>
<el-col class="xe-info">
<el-link
:underline="false"
@click="
goToPath('/order/onlineOrder', { order_state_id: 2030 })
"
>
<ms-count
class="xe-num"
:duration="form.duration"
:end-val="data.wait_shipping_num || 0"
:separator="form.separator"
:start-val="form.startVal"
/>
<div class="xe-name">{{ __('待发货') }}</div>
</el-link>
</el-col>
</el-row>
</el-col>
<el-col :lg="4" :md="4" :sm="8" :xl="4" :xs="12">
<el-row align="middle" type="flex">
<el-col class="xe-icon two1">
<vab-icon icon="refresh-line" />
</el-col>
<el-col class="xe-info">
<el-link
:underline="false"
@click="
goToPath('/order/productOrder', { return_state_id: 3105 })
"
>
<ms-count
class="xe-num"
:duration="form.duration"
:end-val="data.review_num"
:separator="form.separator"
:start-val="form.startVal"
/>
<div class="xe-name">{{ __('待审核退货') }}</div>
</el-link>
</el-col>
</el-row>
</el-col>
<el-col :lg="4" :md="4" :sm="8" :xl="4" :xs="12">
<el-row align="middle" type="flex">
<el-col class="xe-icon four1">
<vab-icon icon="product-hunt-line" />
</el-col>
<el-col class="xe-info">
<el-link
:underline="false"
@click="
goToPath('/product/productManagement/productList', {
product_state_id: 1000,
})
"
>
<ms-count
class="xe-num"
:duration="form.duration"
:end-val="data.off_num"
:separator="form.separator"
:start-val="form.startVal"
/>
<div class="xe-name">{{ __('违规商品') }}</div>
</el-link>
</el-col>
</el-row>
</el-col>
<el-col :lg="4" :md="4" :sm="8" :xl="4" :xs="12">
<el-row align="middle" type="flex">
<el-col class="xe-icon three1">
<vab-icon icon="product-hunt-line" />
</el-col>
<el-col class="xe-info">
<el-link
:underline="false"
@click="
goToPath('/product/productManagement/productList', {
product_state_id: 1002,
})
"
>
<ms-count
class="xe-num"
:duration="form.duration"
:end-val="data.product_warning_num"
:separator="form.separator"
:start-val="form.startVal"
/>
<div class="xe-name">{{ __('待补货') }}</div>
</el-link>
</el-col>
</el-row>
</el-col>
<el-col :lg="4" :md="4" :sm="8" :xl="4" :xs="12">
<el-row align="middle" type="flex">
<el-col class="xe-icon five1">
<vab-icon icon="reply-line" />
</el-col>
<el-col class="xe-info">
<el-link
:underline="false"
@click="goToPath('/SellerComment', { comment_is_reply: 0 })"
>
<ms-count
class="xe-num"
:duration="form.duration"
:end-val="data.wait_reply_num"
:separator="form.separator"
:start-val="form.startVal"
/>
<div class="xe-name">{{ __('待回复') }}</div>
</el-link>
</el-col>
</el-row>
</el-col>
<el-col :lg="4" :md="4" :sm="8" :xl="4" :xs="12">
<el-row align="middle" type="flex">
<el-col class="xe-icon one1">
<vab-icon icon="bill-line" />
</el-col>
<el-col class="xe-info">
<el-link
:underline="false"
@click="goToPath('/order/invoice', { invoice_status: 0 })"
>
<ms-count
class="xe-num"
:duration="form.duration"
:end-val="data.invoice_wait_num"
:separator="form.separator"
:start-val="form.startVal"
/>
<div class="xe-name">{{ __('待开票') }}</div>
</el-link>
</el-col>
</el-row>
</el-col>
</el-row>
</el-card>
<el-row :gutter="20">
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24">
<top-card
background="white"
:bottom-text="t('本月销售额')"
:count-config="saleConfig"
icon="money-cny-circle-line"
:title="t('销售额')"
:unit-text="t('元')"
/>
</el-col>
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24">
<top-card
background="white"
:bottom-text="t('本月订单量')"
:count-config="orderNumConfig"
icon="file-list-2-line"
:title="t('订单量')"
:unit-text="t('单')"
/>
</el-col>
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24">
<top-card
background="white"
:bottom-text="t('本月使用优惠券')"
:count-config="voucherNumConfig"
icon="file-paper-2-line"
:title="t('使用优惠券')"
:unit-text="t('张')"
/>
</el-col>
<el-col :lg="6" :md="12" :sm="24" :xl="6" :xs="24">
<top-card
background="white"
:bottom-text="t('本月退货单数')"
:count-config="refundNumConfig"
icon="refresh-line"
:title="t('退货单数')"
:unit-text="t('个')"
/>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="8">
<div class="grid-content bg-purple">
<el-card class="order-card1" shadow="hover">
<template #header>
<vab-icon icon="shopping-bag-2-line" />
店铺
</template>
<el-row class="order-card1-content">
<el-col :span="6">
<p>店铺状态</p>
<h1
style="font-size: 22px; margin: 1em 0"
:style="{
color:
pram.store_info.store_is_open === 0 ? 'red' : 'green',
}"
>
{{ formatOpen(pram.store_info.store_is_open) }}
</h1>
</el-col>
<el-col :span="6">
<p>商品总数</p>
<h1>
<ms-count
:decimals="countConfig.decimals"
:duration="countConfig.duration"
:end-val="pram.product.total_num"
:prefix="countConfig.prefix"
:separator="countConfig.separator"
:start-val="countConfig.startVal"
:suffix="countConfig.suffix"
/>
</h1>
</el-col>
<el-col :span="6">
<p>上架数量</p>
<h1>
<ms-count
:decimals="countConfig.decimals"
:duration="countConfig.duration"
:end-val="pram.product.normal_num"
:prefix="countConfig.prefix"
:separator="countConfig.separator"
:start-val="countConfig.startVal"
:suffix="countConfig.suffix"
/>
</h1>
</el-col>
<el-col :span="6">
<p>等待审核</p>
<h1>
<ms-count
:decimals="countConfig.decimals"
:duration="countConfig.duration"
:end-val="pram.product.verify_waiting_num"
:prefix="countConfig.prefix"
:separator="countConfig.separator"
:start-val="countConfig.startVal"
:suffix="countConfig.suffix"
/>
</h1>
</el-col>
</el-row>
</el-card>
</div>
</el-col>
<el-col :span="8">
<div class="grid-content bg-purple">
<el-card class="order-card1" shadow="hover">
<template #header>
<vab-icon icon="file-list-2-line" />
订单
</template>
<el-row class="order-card1-content">
<el-col :span="6">
<p>订单总数</p>
<h1>
<ms-count
:decimals="countConfig.decimals"
:duration="countConfig.duration"
:end-val="pram.order.total_num"
:prefix="countConfig.prefix"
:separator="countConfig.separator"
:start-val="countConfig.startVal"
:suffix="countConfig.suffix"
/>
</h1>
</el-col>
<el-col :span="6">
<p>等待付款</p>
<h1>
<ms-count
:decimals="countConfig.decimals"
:duration="countConfig.duration"
:end-val="pram.order.wait_pay_num"
:prefix="countConfig.prefix"
:separator="countConfig.separator"
:start-val="countConfig.startVal"
:suffix="countConfig.suffix"
/>
</h1>
</el-col>
<el-col :span="6">
<p>已完成</p>
<h1>
<ms-count
:decimals="countConfig.decimals"
:duration="countConfig.duration"
:end-val="pram.order.fin_num"
:prefix="countConfig.prefix"
:separator="countConfig.separator"
:start-val="countConfig.startVal"
:suffix="countConfig.suffix"
/>
</h1>
</el-col>
<el-col :span="6">
<p>待评价</p>
<h1>
<ms-count
:decimals="countConfig.decimals"
:duration="countConfig.duration"
:end-val="pram.order.eva_num"
:prefix="countConfig.prefix"
:separator="countConfig.separator"
:start-val="countConfig.startVal"
:suffix="countConfig.suffix"
/>
</h1>
</el-col>
</el-row>
</el-card>
</div>
</el-col>
<el-col :span="8">
<div class="grid-content bg-purple">
<el-card class="order-card1" shadow="hover">
<template #header>
<vab-icon icon="refund-line" />
售后
</template>
<el-row class="order-card1-content">
<el-col :span="8">
<p>已完成</p>
<h1>
<ms-count
:decimals="countConfig.decimals"
:duration="countConfig.duration"
:end-val="pram.return.fin_num"
:prefix="countConfig.prefix"
:separator="countConfig.separator"
:start-val="countConfig.startVal"
:suffix="countConfig.suffix"
/>
</h1>
</el-col>
<el-col :span="8">
<p>待审核</p>
<h1>
<ms-count
:decimals="countConfig.decimals"
:duration="countConfig.duration"
:end-val="pram.return.review_num"
:prefix="countConfig.prefix"
:separator="countConfig.separator"
:start-val="countConfig.startVal"
:suffix="countConfig.suffix"
/>
</h1>
</el-col>
<el-col :span="8">
<p>未完成</p>
<h1>
<ms-count
:decimals="countConfig.decimals"
:duration="countConfig.duration"
:end-val="pram.return.un_fin_num"
:prefix="countConfig.prefix"
:separator="countConfig.separator"
:start-val="countConfig.startVal"
:suffix="countConfig.suffix"
/>
</h1>
</el-col>
</el-row>
</el-card>
</div>
</el-col>
</el-row>
<el-row :gutter="24" v-if="false">
<el-col :span="12">
<div class="grid-content bg-purple">
<el-card v-loading="polylineLoading" class="box-card">
<el-row :gutter="24">
<el-col :span="24">
<div class="grid-content bg-purple">
<i class="el-icon-paperclip" style="font-size: 50px">
{{ pram.order.order_day_percentage_complete }}
</i>
<br />
<br />
<span>{{ __('今日订单完成率') }}</span>
</div>
</el-col>
</el-row>
</el-card>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content bg-purple">
<el-card v-loading="polylineLoading" class="box-card">
<el-row :gutter="24">
<el-col :span="24">
<div class="grid-content bg-purple">
<i class="el-icon-sell" style="font-size: 50px">
{{ pram.order.order_percentage_complete }}
</i>
<br />
<br />
<span>{{ __('订单完成率') }}:</span>
</div>
</el-col>
</el-row>
</el-card>
</div>
</el-col>
</el-row>
<el-row :gutter="24" v-if="false">
<el-col :span="8">
<div class="grid-content bg-purple">
<el-card
v-if="rid != 3"
v-loading="polylineLoading"
class="box-card"
style="height: 500px"
>
<el-row :gutter="20">
<el-col align="right" :span="12">
<div class="grid-content bg-purple">
<i class="el-icon-goods" style="font-size: 50px"></i>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content bg-purple">
<h2>{{ __('店铺及商品提示') }}</h2>
</div>
</el-col>
</el-row>
<el-divider />
<span>
<h4>
{{ __('店铺状态') }}:
{{ formatOpen(pram.store_info.store_is_open) }}
</h4>
</span>
<el-divider />
<span>{{ __('商品总数') }} {{ pram.product.total_num }}</span>
<el-divider />
<span>
{{ __('已审核商品') }}{{ pram.product.verify_passed_off_num }}
</span>
<el-divider />
<span>
{{ __('等待审核') }}{{ pram.product.verify_waiting_num }}
</span>
<el-divider />
<span>{{ __('已下架') }}{{ pram.product.illegal_num }}</span>
<el-divider />
<span>{{ __('售卖中') }}{{ pram.product.normal_num }}</span>
<el-divider />
<span>{{ __('违禁') }}{{ pram.product.off_num }}</span>
<el-divider />
</el-card>
</div>
</el-col>
<el-col :span="8">
<div class="grid-content bg-purple">
<el-card
v-loading="polylineLoading"
class="box-card"
style="height: 500px"
>
<el-row :gutter="20">
<el-col align="right" :span="12">
<div class="grid-content bg-purple">
<i class="el-icon-chat-dot-round" style="font-size: 50px"></i>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content bg-purple">
<h2 v-if="rid != 3">{{ __('订单') }}</h2>
<h2 v-else>{{ __('门店订单') }}</h2>
</div>
</el-col>
</el-row>
<el-divider />
<span>{{ __('今日订单总数') }}{{ pram.order.day_num }}</span>
<el-divider />
<span>{{ __('订单总数') }}{{ pram.order.total_num }}</span>
<el-divider />
<span>{{ __('已发货') }}{{ pram.order.ship_num }}</span>
<el-divider />
<span>{{ __('等待付款') }}{{ pram.order.wait_pay_num }}</span>
<el-divider />
<span>{{ __('待评价') }}{{ pram.order.eva_num }}</span>
<el-divider />
</el-card>
</div>
</el-col>
<el-col :span="8">
<div class="grid-content bg-purple">
<el-card
v-if="rid != 3"
v-loading="polylineLoading"
class="box-card"
style="height: 500px"
>
<el-row :gutter="20">
<el-col align="right" :span="12">
<div class="grid-content bg-purple">
<i class="el-icon-chat-dot-round" style="font-size: 50px"></i>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content bg-purple">
<h2>{{ __('退单') }}</h2>
</div>
</el-col>
</el-row>
<el-divider />
<span align="center">
{{ __('退单总数') }} {{ pram.return.total_num }}
</span>
<el-divider />
<span>{{ __('已完成') }} {{ pram.return.fin_num }}</span>
<el-divider />
<span>{{ __('待审核') }}{{ pram.return.review_num }}</span>
<el-divider />
<span>{{ __('未完成') }}{{ pram.return.un_fin_num }}</span>
<el-divider />
</el-card>
</div>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-card v-loading="polylineLoading" class="box-card">
<div slot="header">
<vab-icon icon="file-chart-line" />
{{ __('订单销售趋势图') }}
<el-radio-group
v-model="timeChoice"
class="radio-inline"
size="small"
style="float: right"
@change="statisticCountEvt"
>
<el-radio-button :label="7">{{ t('7天') }}</el-radio-button>
<el-radio-button :label="30">{{ t('30天') }}</el-radio-button>
<el-radio-button :label="90">{{ t('3个月') }}</el-radio-button>
<el-radio-button :label="180">{{ t('半年') }}</el-radio-button>
</el-radio-group>
</div>
<vab-chart
:init-options="initOptions"
:option="polylineOption"
style="width: 100%"
theme="vab-echarts-theme"
/>
</el-card>
</el-col>
<el-col :span="12">
<el-card v-if="rid != 3" v-loading="polylineLoading" class="box-card">
<div slot="header">
<vab-icon icon="refresh-line" />
{{ __('退单销售趋势图') }}
<el-radio-group
v-model="timeChoice"
class="radio-inline"
size="small"
style="float: right"
@change="statisticCountReturnReturnEvt"
>
<el-radio-button :label="7">{{ t('7天') }}</el-radio-button>
<el-radio-button :label="30">{{ t('30天') }}</el-radio-button>
<el-radio-button :label="90">{{ t('3个月') }}</el-radio-button>
<el-radio-button :label="180">{{ t('半年') }}</el-radio-button>
</el-radio-group>
</div>
<vab-chart
:init-options="initOptions"
:option="polylineOptionReturn"
style="width: 100%"
theme="vab-echarts-theme"
/>
</el-card>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<div class="grid-content bg-purple">
<el-card v-loading="loading" class="box-card">
<div slot="header">
<vab-icon icon="money-dollar-box-line" />
{{ __('订单销售金额对比图') }}
<el-radio-group
v-model="timeChoice"
class="radio-inline"
size="small"
style="float: right"
@change="statisticAmountEvt"
>
<el-radio-button :label="7">{{ t('7天') }}</el-radio-button>
<el-radio-button :label="30">{{ t('30天') }}</el-radio-button>
<el-radio-button :label="90">{{ t('3个月') }}</el-radio-button>
<el-radio-button :label="180">{{ t('半年') }}</el-radio-button>
</el-radio-group>
</div>
<vab-chart
:init-options="initOptions"
:option="polylineOptionMake"
style="width: 100%"
theme="vab-echarts-theme"
/>
</el-card>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content bg-purple">
<el-card v-loading="loading" class="box-card">
<div slot="header">
<vab-icon icon="user-6-line" />
{{ __('客户统计') }}
<el-radio-group
v-model="timeChoice"
class="radio-inline"
size="small"
style="float: right"
@change="getCustomerTimelineEvt"
>
<el-radio-button :label="7">{{ t('7天') }}</el-radio-button>
<el-radio-button :label="30">{{ t('30天') }}</el-radio-button>
<el-radio-button :label="90">{{ t('3个月') }}</el-radio-button>
<el-radio-button :label="180">{{ t('半年') }}</el-radio-button>
</el-radio-group>
</div>
<vab-chart
:init-options="initOptions"
:option="polylineOptionMakeLine"
style="width: 100%"
theme="vab-echarts-theme"
/>
</el-card>
</div>
</el-col>
</el-row>
</div>
</template>
<script>
import { translateTitle as __ } from '@/utils/i18n'
import {
getCustomerTimeline,
statisticAmount,
statisticCount,
statisticState,
} from '@/api/order/base'
import { dashboard } from '@/api/order/info'
import {
statisticCount as statisticCountReturn,
statisticState as statisticStateReturn,
} from '@/api/order/return'
import VabChart from '@/extra/VabChart'
import { mapGetters } from 'vuex'
import MsChart from '@/extra/VabChart'
import TopCard from '@/components/MsWidget/TopCard'
/*
import MsDateRangePicker from "@/components/MsDateRangePicker";
import NavList from "@/views/index/components/IconList";
*/
import MsCount from '@/components/MsCount'
import { getSalesAmount } from '@/api/analytics/trade'
import {
getOrderNumToday,
getVoucherActiveNumToday,
} from '@/api/analytics/order'
import { getReturnNumToday } from '@/api/analytics/return'
export default {
name: 'OverviewOrder',
components: {
VabChart,
MsChart,
TopCard,
/*MsDateRangePicker, NavList,*/ MsCount,
},
data() {
return {
data: {},
form: {
startVal: 0,
decimals: 0,
prefix: '',
suffix: '',
separator: ',',
duration: 5000,
},
timeChoice: 7,
saleConfig: {
startVal: 0,
endVal: 0,
/*decimals: 2,*/
prefix: '¥',
suffix: '',
separator: ',',
duration: 8000,
today: 0,
yestoday: 0,
daym2m: 0,
},
orderNumConfig: {
startVal: 0,
endVal: 0,
/*decimals: 0,*/
prefix: '',
suffix: '',
separator: ',',
duration: 8000,
today: 0,
yestoday: 0,
daym2m: 0,
},
refundNumConfig: {
startVal: 0,
endVal: 0,
/*decimals: 0,*/
prefix: '',
suffix: '',
separator: ',',
duration: 8000,
today: 0,
yestoday: 0,
daym2m: 0,
},
voucherNumConfig: {
startVal: 0,
endVal: 0,
/*decimals: 0,*/
prefix: '',
suffix: '',
separator: ',',
duration: 8000,
today: 0,
yestoday: 0,
daym2m: 0,
},
countConfig: {
startVal: 0,
endVal: _.random(1000, 6000),
decimals: 0,
prefix: '',
suffix: '',
separator: ',',
duration: 5000,
},
polylineOptionMakeLine: {
title: {
left: 'center',
text: this.__('最近7天的消费客户数量'),
},
tooltip: {
trigger: 'axis',
},
grid: {
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: [],
},
yAxis: {
type: 'value',
},
series: [
{
name: this.__('客户数量'),
type: 'line',
data: [],
},
],
},
polylineOptionMake: {
title: {
left: 'center',
text: this.__('最近7天的订单成交金额趋势图'),
},
tooltip: {
trigger: 'axis',
},
grid: {
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: [],
},
yAxis: {
type: 'value',
},
series: [
{
name: this.__('消费金额'),
type: 'line',
data: [],
},
],
},
columnOptionsReturn: {
tooltip: {
trigger: 'axis',
extraCssText: 'z-index:1',
},
grid: {
top: '5%',
left: '2%',
right: '4%',
bottom: '0%',
containLabel: true,
},
xAxis: [
{
type: 'category',
data: [],
axisTick: {
alignWithLabel: true,
},
},
],
yAxis: [
{
type: 'value',
},
],
series: [
{
type: 'bar',
barWidth: '60%',
data: [10, 52, 20, 33, 39, 33, 22],
itemStyle: {
borderRadius: [2, 2, 0, 0],
color: new VabChart.graphic.LinearGradient(
0,
0,
0,
1,
['#88D1FF', '#1890FF'].map((color, offset) => ({
color,
offset,
}))
),
},
},
],
},
polylineOptionReturn: {
tooltip: {
trigger: 'axis',
},
grid: {
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: [],
},
yAxis: {
type: 'value',
},
series: [
{
name: this.__('退单数'),
type: 'line',
data: [],
},
],
},
columnLoading: true,
polylineLoading: true,
loading: false,
initOptions: {
renderer: 'svg',
},
pram: {
order: {
order_day_percentage_complete: '0%',
order_percentage_complete: '0%',
day_num: 0,
total_num: 0,
ship_num: 0,
wait_pay_num: 0,
eva_num: 0,
},
return: {
total_num: 0,
fin_num: 0,
review_num: 0,
un_fin_num: 0,
},
data: {},
notice: [],
product: {
total_num: 0,
verify_refused_num: 0,
verify_passed_off_num: 0,
illegal_num: 0,
normal_num: 0,
off_num: 0,
},
store_info: {
store_is_open: undefined,
},
},
columnOptions: {
tooltip: {
trigger: 'axis',
extraCssText: 'z-index:1',
},
grid: {
top: '5%',
left: '2%',
right: '4%',
bottom: '0%',
containLabel: true,
},
xAxis: [
{
type: 'category',
data: [],
axisTick: {
alignWithLabel: true,
},
},
],
yAxis: [
{
type: 'value',
},
],
series: [
{
type: 'bar',
barWidth: '60%',
data: [10, 52, 20, 33, 39, 33, 22],
itemStyle: {
borderRadius: [2, 2, 0, 0],
color: new VabChart.graphic.LinearGradient(
0,
0,
0,
1,
['#88D1FF', '#1890FF'].map((color, offset) => ({
color,
offset,
}))
),
},
},
],
},
polylineOption: {
tooltip: {
trigger: 'axis',
},
legend: {
data: [],
},
grid: {
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: [],
},
yAxis: {
type: 'value',
},
series: [
{
name: this.__('有效订单'),
type: 'line',
data: [],
},
{
name: this.__('取消订单'),
type: 'line',
data: [],
},
],
},
}
},
computed: {
...mapGetters({
rid: 'user/rid',
}),
},
created() {
this.dashboard()
this.fetchData()
},
methods: {
__,
t: __,
goToPath(path, query) {
this.$router.push({ path: path, query: query })
},
// 商家端-销售额
async getSalesAmountFun() {
const { data } = await getSalesAmount()
this.topData = data
this.saleConfig = Object.assign(this.saleConfig, data)
},
// 商家端-订单量
async getOrderNumFun() {
const { data } = await getOrderNumToday()
this.topData = data
this.orderNumConfig = Object.assign(this.orderNumConfig, data)
},
// 商家端-退货单数
async getReturnNumFun() {
const { data } = await getReturnNumToday()
this.refundNumConfig = Object.assign(this.refundNumConfig, data)
},
// 商家端-使用优惠卷数量
async getVoucherNumFun() {
const { data } = await getVoucherActiveNumToday()
this.voucherNumConfig = Object.assign(this.voucherNumConfig, data)
},
formatOpen(row) {
return row === 0 ? this.__('关闭') : this.__('运营中')
},
async statisticStateReturn(days) {
this.columnLoading = true
await statisticStateReturn(days)
this.columnLoading = false
},
// 退单销售趋势图
async statisticCountReturnReturnEvt() {
this.statisticCountReturnReturn(parseInt(this.timeChoice))
},
async statisticCountReturnReturn(days) {
this.polylineLoading = true
const { data } = await statisticCountReturn({ days: days })
this.polylineOptionReturn.xAxis.data = data.map((item) => item.curr_date)
this.polylineOptionReturn.series[0].data = data.map(
(item) => item.record_count
)
this.polylineLoading = false
},
queryData() {
this.fetchData()
},
async fetchData() {
this.getSalesAmountFun()
this.getOrderNumFun()
this.getReturnNumFun()
this.getVoucherNumFun()
// 订单返回静止状态
await this.statisticStateReturn()
// 退单销售趋势图
await this.statisticCountReturnReturn(parseInt(this.timeChoice))
// 订单基础状态
await this.statisticState()
// 订单销售趋势图
await this.statisticCount(parseInt(this.timeChoice))
// 客户统计趋势图
await this.getCustomerTimeline(parseInt(this.timeChoice))
// 订单成交金额趋势图
await this.statisticAmount(parseInt(this.timeChoice))
},
async statisticState(days) {
this.columnLoading = true
await statisticState(days)
this.columnLoading = false
},
async dashboard() {
const { data } = await dashboard()
if (data != null) {
this.pram = data
// 代发货
this.data.wait_shipping_num = data.order.wait_shipping_num
// 待审核退货
this.data.review_num = data.return.review_num
// 违规商品
this.data.off_num = data.product.off_num
// 待补货 (缺少字段)
this.data.product_warning_num = data.product.product_warning_num
// 待回复
this.data.wait_reply_num = data.product.wait_reply_num
// 待开票
this.data.invoice_wait_num = data.order.invoice_wait_num
}
},
async statisticAmountEvt() {
this.statisticAmount(parseInt(this.timeChoice))
},
//订单成交金额趋势图
async statisticAmount(days) {
this.loading = true
const { data } = await statisticAmount({ days: days })
this.polylineOptionMake.title.text = this.sprintf(
this.__('最近 %s 天的订单成交金额趋势图'),
days
)
this.polylineOptionMake.xAxis.data = data.map((item) => item.curr_date)
this.polylineOptionMake.series[0].data = data.map((item) => item.amount)
this.loading = false
},
async getCustomerTimelineEvt() {
this.getCustomerTimeline(parseInt(this.timeChoice))
},
//客户统计趋势图
async getCustomerTimeline(days) {
const { data } = await getCustomerTimeline({ days: days })
this.polylineOptionMakeLine.title.text = this.sprintf(
this.__('最近 %s 天的消费客户数量'),
days
)
this.polylineOptionMakeLine.xAxis.data = data.map((item) => item.time)
this.polylineOptionMakeLine.series[0].data = data.map((item) => item.num)
},
async statisticCountEvt() {
this.statisticCount(parseInt(this.timeChoice))
},
// 订单销售趋势图
async statisticCount(days) {
this.polylineLoading = true
const { data } = await statisticCount({ days: days })
if (!data) return
this.polylineOption.xAxis.data = data.map((item) => item.curr_date)
this.polylineOption.series[0].data = data.map(
(item) => item.effective_count
)
this.polylineOption.series[1].data = data.map((item) => item.cancel_count)
this.polylineLoading = false
},
},
}
</script>
<style scoped lang="scss">
.dashboard-container {
padding: 0 !important;
background: $base-color-background !important;
:deep() {
.el-card {
[class*='-echart'] {
width: 100%;
height: 200px;
}
}
}
.is-align-middle {
padding: 10px 0;
}
.xe-icon {
width: 80px;
padding: 10px;
.i-wh-workbench {
display: block;
color: #fff;
text-align: center;
font-size: 25px;
line-height: 50px;
width: 50px;
height: 50px;
border-radius: 50%;
background-clip: padding-box;
}
}
.xe-icon {
width: 56px;
height: 56px;
color: #fff;
text-align: center;
border-radius: 50%;
}
.xe-icon i {
font-size: 36px;
line-height: 36px;
}
.xe-info {
padding-left: 10px;
text-align: left;
}
.xe-name {
font-size: 12px;
color: #98a9bc;
}
.xe-num {
display: block;
font-size: 24px;
text-align: left;
}
.xe-label {
text-align: left;
display: block;
font-style: normal;
font-size: 10px;
text-transform: uppercase;
color: #979898;
}
.xe-todo {
text-align: right;
display: block;
font-style: normal;
font-size: 10px;
text-transform: uppercase;
color: #979898;
margin-top: 5px;
}
}
.order {
&-card1 {
//background: linear-gradient(to right, #60b2fb, #6485f6);
//color: $base-color-white !important;
&-content {
text-align: center;
}
::v-deep {
.el-card {
&__header,
&__body {
//color: $base-color-white !important;
p {
display: block;
margin-block-start: 1em;
margin-block-end: 1em;
margin-inline-start: 0px;
margin-inline-end: 0px;
}
h1 {
margin: 0.67em 0;
font-size: 2em;
}
}
}
}
}
margin-bottom: $base-margin;
}
</style>