智慧教务系统
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.
 
 
 
 
 
 

352 lines
15 KiB

<template>
<div class="main-container">
<!-- 实时概况 -->
<el-card shadow="never" class="!border-none">
<template #header>
<span class="text-lg font-extrabold mr-[10px]">{{t('realtimeOverview')}}</span>
<span class="text-sm text-[#a19f98]">{{t('updateTime')}}</span>
<span class="text-sm text-[#a19f98]">{{ time }}</span>
</template>
<el-row>
<el-col :span="6">
<div class="ml-[10px]">
<div class="text-sm text-[#a19f98] leading-8">
<el-statistic :value="statToday.order_num">
<template #title>
<div style="display: inline-flex; align-items: center">
<span class="mr-[5px]">{{t('todayOrderCount')}}</span>
<el-tooltip class="box-item" effect="light" :content="t('todayOrderCount')" placement="top">
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</div>
</template>
</el-statistic>
</div>
<div class="text-sm text-[#a19f98] leading-8">
<span>{{t('yesterday')}}</span>
<span>{{statYesterday.order_num}}</span>
</div>
<div class="text-sm text-[#a19f98] leading-8 mt-[15px]">
<el-statistic :title="t('orderCount')" :value="statTotal.order_num" />
</div>
</div>
</el-col>
<el-col :span="6">
<div class="ml-[10px]">
<div class="text-sm text-[#a19f98] leading-8">
<el-statistic :value="statToday.sale_money">
<template #title>
<div style="display: inline-flex; align-items: center">
<span class="mr-[5px]">{{t('todayOrderSale')}}</span>
<el-tooltip class="box-item" effect="light" :content="t('todayOrderSale')" placement="top">
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</div>
</template>
</el-statistic>
</div>
<div class="text-sm text-[#a19f98] leading-8">
<span>{{t('yesterday')}}</span>
<span>{{statYesterday.sale_money}}</span>
</div>
<div class="text-sm text-[#a19f98] leading-8 mt-[15px]">
<el-statistic :title="t('salesTotal')" :value="statTotal.sale_money" />
</div>
</div>
</el-col>
<el-col :span="6">
<div class="ml-[10px]">
<div class="text-sm text-[#a19f98] leading-8">
<el-statistic :value="statToday.refund_money">
<template #title>
<div style="display: inline-flex; align-items: center">
<span class="mr-[5px]">{{t('todayAddMemberCount')}}</span>
<el-tooltip class="box-item" effect="light" :content="t('todayAddMemberCount')" placement="top">
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</div>
</template>
</el-statistic>
</div>
<div class="text-sm text-[#a19f98] leading-8">
<span>{{t('yesterday')}}</span>
<span>{{statYesterday.refund_money}}</span>
</div>
<div class="text-sm text-[#a19f98] leading-8 mt-[15px]">
<el-statistic :title="t('memberTotal')" :value="statTotal.refund_money" />
</div>
</div>
</el-col>
<el-col :span="6">
<div class="ml-[10px]">
<div class="text-sm text-[#a19f98] leading-8">
<el-statistic :value="statToday.access_sum">
<template #title>
<div style="display: inline-flex; align-items: center">
<span class="mr-[5px]">{{t('todayBrowseCount')}}</span>
<el-tooltip class="box-item" effect="light" :content="t('todayBrowseCount')" placement="top">
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</div>
</template>
</el-statistic>
</div>
<div class="text-sm text-[#a19f98] leading-8">
<span>{{t('yesterday')}}</span>
<span>{{statYesterday.access_sum}}</span>
</div>
<div class="text-sm text-[#a19f98] leading-8 mt-[15px]">
<el-statistic :title="t('browseTotal')" :value="statTotal.access_sum" />
</div>
</div>
</el-col>
</el-row>
</el-card>
<!-- 实时概况 end -->
<!-- 代办事项 -->
<el-card shadow="never" class="mt-[15px] !border-none">
<template #header>
<span class="text-lg font-extrabold">{{t('agentMatters')}}</span>
</template>
<el-row>
<el-col :span="4" class="cursor-pointer" @click="router.push({ path: '/shop/order/index', query: {status: 1}})">
<div class="ml-[10px]">
<el-statistic :value="statOrder.wait_pay_order">
<template #title>
<div style="display: inline-flex; align-items: center">
<span class="mr-[5px]">{{t('waitPayOrder')}}</span>
<el-tooltip class="box-item" effect="light" :content="t('waitPayOrder')" placement="top">
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</div>
</template>
</el-statistic>
</div>
</el-col>
<el-col :span="4" class="cursor-pointer" @click="router.push({ path: '/shop/order/index', query: {status: 2}})">
<el-statistic :value="statOrder.wait_delivery_order">
<template #title>
<div style="display: inline-flex; align-items: center">{{t('waitDeliveryOrder')}}</div>
</template>
</el-statistic>
</el-col>
<el-col :span="4" class="cursor-pointer" @click="router.push({ path: '/shop/order/index', query: {status: 3}})">
<el-statistic :value="statOrder.wait_take_order">
<template #title>
<div style="display: inline-flex; align-items: center">{{t('waitTakeOrder')}}</div>
</template>
</el-statistic>
</el-col>
<el-col :span="4" class="cursor-pointer" @click="router.push({ path: '/shop/order/refund'})">
<el-statistic :value="statOrder.refund_order">
<template #title>
<div style="display: inline-flex; align-items: center">退款订单</div>
</template>
</el-statistic>
</el-col>
<el-col :span="4" class="cursor-pointer" @click="router.push({ path: '/shop/goods/list'})">
<el-statistic :value="statGoods.sale_goods_num">
<template #title>
<div style="display: inline-flex; align-items: center">{{t('saleGoodsNum')}}</div>
</template>
</el-statistic>
</el-col>
<el-col :span="4" class="cursor-pointer" @click="router.push({ path: '/shop/goods/list', query: {status: 0}})">
<el-statistic :value="statGoods.warehouse_goods_num">
<template #title>
<div style="display: inline-flex; align-items: center">{{t('warehouseGoodsNum')}}</div>
</template>
</el-statistic>
</el-col>
</el-row>
</el-card>
<!-- 代办事项 end -->
<!-- 订单趋势 -->
<el-row :gutter="15" class="mt-[15px]">
<el-col :span="12">
<el-card shadow="never" class="!border-none">
<template #header>
<span class="text-lg font-extrabold">订单量趋势</span>
</template>
<div ref="visitStat" :style="{ width: '100%', height: '300px' }"></div>
</el-card>
</el-col>
<el-col :span="12">
<el-card shadow="never" class="!border-none">
<template #header>
<span class="text-lg font-extrabold">销售额</span>
</template>
<div ref="hourStat" :style="{ width: '100%', height: '300px' }"></div>
</el-card>
</el-col>
</el-row>
<!-- 订单趋势 end -->
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
import { t } from '@/lang'
import {
getShopCountList,
getShopTodayCountList,
getShopYesterdayCountList,
getShopStat,
getShopOrderStat,
getShopGoodsStat
} from '@/addon/shop/api/shop'
import * as echarts from 'echarts'
import { useRouter } from 'vue-router'
const router = useRouter()
const visitStat = ref<any>(null)
const hourStat = ref<any>(null)
interface statTotalType{
order_num: number,
sale_money: number,
refund_money: number,
access_sum: number
}
interface statTodayType{
order_num: number,
sale_money: number,
refund_money: number,
access_sum: number
}
interface statYesterdayType{
order_num: number,
sale_money: number,
refund_money: number,
access_sum: number
}
interface statOrderType{
wait_pay_order: number,
wait_delivery_order: number,
wait_take_order: number,
refund_order: number
}
interface statGoodsType{
sale_goods_num: number,
warehouse_goods_num: number
}
interface statCountType{
order_num: number,
time: string,
sale_money: number
}
const statTotal = ref<statTotalType|any>([])
const statToday = ref<statTodayType|any>([])
const statYesterday = ref<statYesterdayType|any>([])
const statCount = ref<statCountType|any>([])
const statOrder = ref<statOrderType|any>([])
const statGoods = ref<statGoodsType|any>([])
const getStatInfoFn = async () => {
let statTotalData = await (await getShopCountList()).data
for( let i in statTotalData){
statTotalData[i] = Number(statTotalData[i])
}
statTotal.value = statTotalData
statToday.value = await (await getShopTodayCountList()).data
statYesterday.value = await (await getShopYesterdayCountList()).data
statOrder.value = await (await getShopOrderStat()).data
statGoods.value = await (await getShopGoodsStat()).data
statCount.value = await (await getShopStat()).data
setTimeout(() => {
drawChart('')
drawChartTo('')
}, 20)
}
getStatInfoFn()
const drawChart = (item:any) => {
let value = statCount.value.order_num
if (item) value = item
if (!visitStat.value) return
const visitStatChart = echarts.init(visitStat.value)
const visitStatOption = ref({
// title: {
// text: '订单量趋势'
// },
legend: {},
xAxis: {
data: []
},
yAxis: {},
tooltip: {
trigger: 'axis'
},
series: [
{
type: 'line',
data: []
}
]
})
visitStatOption.value.xAxis.data = statCount.value.time
visitStatOption.value.series[0].data = value
visitStatChart.setOption(visitStatOption.value)
}
const drawChartTo = (item:any) => {
let valueTo = statCount.value.sale_money
if (item) valueTo = item
if (!hourStat.value) return
const hourStatChart = echarts.init(hourStat.value)
const hourStatOption = ref({
// title: {
// text: '销售额(元)'
// },
legend: {},
xAxis: {
data: []
},
yAxis: {},
tooltip: {
trigger: 'axis'
},
series: [
{
type: 'line',
data: []
}
]
})
hourStatOption.value.xAxis.data = statCount.value.time
hourStatOption.value.series[0].data = valueTo
hourStatChart.setOption(hourStatOption.value)
}
const time = ref('')
const nowTime = () => {
const date = new Date()
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
const hh = checkTime(date.getHours())
const mm = checkTime(date.getMinutes())
const ss = checkTime(date.getSeconds())
function checkTime (i:any) {
if (i < 10) {
return '0' + i
}
return i
}
time.value = year + '-' + month + '-' + day + ' ' + hh + ':' + mm + ':' + ss
}
nowTime()
</script>
<style lang="scss" scoped></style>