Files
aiot-platform-ui/apps/web-antd/src/views/mp/statistics/index.vue

146 lines
4.1 KiB
Vue

<script lang="ts" setup>
import type { EchartsUIType } from '@vben/plugins/echarts';
import { ref } from 'vue';
import { ContentWrap, Page } from '@vben/common-ui';
import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
import { addTime, betweenDay, formatDate } from '@vben/utils';
import { Card, message } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
import {
getInterfaceSummary,
getUpstreamMessage,
getUserCumulate,
getUserSummary,
} from '#/api/mp/statistics';
import { WxAccountSelect } from '#/views/mp/components';
import {
interfaceSummaryOption,
upstreamMessageOption,
userCumulateOption,
userSummaryOption,
} from './chart-options';
import { useGridFormSchema } from './data';
const userSummaryRef = ref<EchartsUIType>();
const { renderEcharts: renderUserSummaryEcharts } = useEcharts(userSummaryRef);
const userCumulateRef = ref<EchartsUIType>();
const { renderEcharts: renderUserCumulateEcharts } =
useEcharts(userCumulateRef);
const upstreamMessageRef = ref<EchartsUIType>();
const { renderEcharts: renderUpstreamMessageEcharts } =
useEcharts(upstreamMessageRef);
const interfaceSummaryRef = ref<EchartsUIType>();
const { renderEcharts: renderInterfaceSummaryEcharts } =
useEcharts(interfaceSummaryRef);
/** 加载数据 */
async function getSummary(values: Record<string, any>) {
const accountId = values.accountId;
if (!accountId) {
message.warning('请先选择公众号');
return;
}
const dateRange = values.dateRange;
if (!dateRange) {
message.warning('请先选择时间范围');
return;
}
// 必须选择 7 天内,因为公众号有时间跨度限制为 7
if (betweenDay(dateRange[0], dateRange[1]) >= 7) {
message.error('时间间隔 7 天以内,请重新选择');
return;
}
// 处理日期
const days = betweenDay(dateRange[0], dateRange[1]);
const dates = Array.from(
{ length: days },
(_, index) =>
formatDate(addTime(dateRange[0], index), 'YYYY-MM-DD') as string,
);
// 用户增减数据
const userSummaryData = await getUserSummary({
accountId,
date: dateRange,
});
await renderUserSummaryEcharts(userSummaryOption(userSummaryData, dates));
// 累计用户数据
const userCumulateData = await getUserCumulate({
accountId,
date: dateRange,
});
await renderUserCumulateEcharts(userCumulateOption(userCumulateData, dates));
// 消息发送概况数据
const upstreamMessageData = await getUpstreamMessage({
accountId,
date: dateRange,
});
await renderUpstreamMessageEcharts(
upstreamMessageOption(upstreamMessageData, dates),
);
// 接口分析数据
const interfaceSummaryData = await getInterfaceSummary({
accountId,
date: dateRange,
});
await renderInterfaceSummaryEcharts(
interfaceSummaryOption(interfaceSummaryData, dates),
);
}
/** 公众号变化时查询数据 */
function handleAccountChange(accountId: number) {
queryFormApi.setValues({ accountId });
queryFormApi.submitForm();
}
const [QueryForm, queryFormApi] = useVbenForm({
commonConfig: {
componentProps: {
class: 'w-full',
},
},
layout: 'horizontal',
schema: useGridFormSchema(),
wrapperClass: 'grid-cols-1 md:grid-cols-2',
handleSubmit: getSummary,
});
</script>
<template>
<Page auto-content-height>
<ContentWrap class="h-full w-full">
<QueryForm>
<template #accountId>
<WxAccountSelect @change="handleAccountChange" />
</template>
</QueryForm>
<div class="flex h-1/3 w-full gap-4">
<Card class="h-full w-1/2" title="用户增减数据">
<EchartsUI ref="userSummaryRef" />
</Card>
<Card class="h-full w-1/2" title="累计用户数据">
<EchartsUI ref="userCumulateRef" />
</Card>
</div>
<div class="mt-4 flex h-1/3 w-full gap-4">
<Card class="h-full w-1/2" title="消息发送概况数据">
<EchartsUI ref="upstreamMessageRef" />
</Card>
<Card class="h-full w-1/2" title="接口分析数据">
<EchartsUI ref="interfaceSummaryRef" />
</Card>
</div>
</ContentWrap>
</Page>
</template>