NGToolsAdmin/pages/uni-stat/pay-order/overview/components/statPanelToday.vue

233 lines
5.1 KiB
Vue
Raw Permalink Normal View History

2024-09-13 08:39:31 +00:00
<template>
<!-- 历史数据统计面板最近7天本月本季度本月总和 -->
<view class="uni-stat--x p-m">
<view class="uni-stat-card-header">今日数据</view>
<uni-table :loading="loading" border stripe emptyText="暂无更多数据" style="min-height: 100px;">
<!-- 表头行 -->
<uni-tr>
<uni-th align="center" class="th"></uni-th>
<uni-th align="center" class="th" v-for="(item,index) in panelData" :key="index">
<uni-tooltip>
<view class="uni-stat--sum-item-title">
{{ item.title }}
<uni-icons class="ml-s" type="help" color="#666" />
</view>
<template v-slot:content>
<view class="uni-stat-tooltip-s">
<view v-for="(item2,index2) in item.list" :key="index2">{{ item2.tooltip }}</view>
</view>
</template>
</uni-tooltip>
</uni-th>
</uni-tr>
<!-- 表格数据行 -->
<uni-tr>
<uni-td align="center" class="td">下单</uni-td>
<uni-td align="center" class="td" v-for="(item, index) in panelData" :key="index">{{ item.list[0].value }}</uni-td>
</uni-tr>
<uni-tr>
<uni-td align="center" class="td">收款</uni-td>
<uni-td align="center" class="td" v-for="(item, index) in panelData" :key="index">{{ item.list[1].value }}</uni-td>
</uni-tr>
<uni-tr>
<uni-td align="center" class="td">退款</uni-td>
<uni-td align="center" class="td" v-for="(item, index) in panelData" :key="index">{{ item.list[2].value }}</uni-td>
</uni-tr>
</uni-table>
</view>
</template>
<script>
import {
formatterData,
stringifyQuery,
stringifyField,
stringifyGroupField,
getTimeOfSomeDayAgo,
formatDate,
parseDateTime,
debounce,
} from '@/js_sdk/uni-stat/util.js'
import timeUtil from "@/js_sdk/uni-stat/timeUtil.js"
import {
fieldsMap,
fieldsGroupMap,
} from '../fieldsMap.js'
export default {
props: {
query: {
type: [Object],
default: function(){
return {}
}
},
},
data() {
return {
tableName: 'uni-stat-pay-result',
panelData: fieldsGroupMap,
loading: false
}
},
created() {
this.getCloudDataDebounce = debounce(() => {
this.getCloudData();
}, 300);
this.getCloudDataDebounce();
},
methods: {
// 获取云端数据
getCloudData() {
let query = this.query;
if (!query.appid) return;
this.loading = true;
const where = stringifyQuery({
...query,
start_time: [getTimeOfSomeDayAgo(0), Date.now()]
}, true, ['uni_platform']);
//console.log('where: ', where)
const db = uniCloud.database();
const subTable = db.collection(this.tableName)
.where(where)
.field(`${stringifyField(fieldsMap)}, dimension, stat_date.date_str as stat_time, start_time`)
.groupBy(`stat_time, dimension`)
.groupField(stringifyGroupField(fieldsMap))
.orderBy('stat_time', 'desc')
.get()
.then(res => {
let data = res.result.data;
// 数据格式化
data = formatterData({
fieldsMap,
data
});
//console.log('data: ', data)
// 获取今日数据
let today = data.find((item) => {
return item.dimension === 'day' && item.stat_time === parseDateTime(getTimeOfSomeDayAgo(0), '');
});
if (!today) {
today = data.find((item) => {
return item.dimension === 'hour' && item.stat_time === parseDateTime(getTimeOfSomeDayAgo(0), '');
}) || {};
}
this.loading = false;
this.panelData = this.setPanelData(today);
})
},
// 设置面板数据
setPanelData(data){
let panelData = this.panelData;
panelData.map((item1, index1) => {
item1.list.map((item2, index2) => {
item2.value = data[item2.field] || 0;
});
});
return panelData;
}
},
watch: {
query: {
deep: true,
handler(val) {
this.getCloudDataDebounce()
}
}
},
}
</script>
<style lang="scss" scoped>
.uni-stat-tooltip-s {
width: 350px;
white-space: normal;
}
.uni-stat--sum {
&-x {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
border-radius: 4px;
padding: 15px;
box-shadow: -1px -1px 5px 0 rgba(0, 0, 0, 0.1);
}
&-item {
white-space: nowrap;
text-align: center;
margin: 10px 18px;
&-width {
width: 100px
}
}
&-item-title {
display: flex;
align-items: center;
justify-content: center;
min-height: 17px;
font-size: 12px;
color: #666;
}
&-item-value {
font-size: 24px;
line-height: 48px;
font-weight: 700;
color: #333;
}
&-item-contrast {
font-size: 14px;
color: #666;
}
}
/* #ifndef APP-NVUE */
@media screen and (max-width: 500px) {
.uni-stat--sum-x {
padding: 15px 0;
align-items: center;
justify-content: center;
flex-wrap: unset;
overflow-x: auto !important;
}
::-webkit-scrollbar {
display: none;
}
}
/* #endif */
.uni-stat--sum-flex{
flex:1;
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
border-radius: 4px;
padding: 15px;
.uni-stat--sum-item{
min-width: 300rpx;
max-width: 500rpx;
flex:1;
}
}
.uni-stat-card-header {
justify-content: space-between;
color: #555;
font-size: 14px;
font-weight: 600;
padding: 10px 0;
margin-bottom: 15px;
}
.td.main{
color:#e43d33;
}
</style>