146 lines
4.1 KiB
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>
|