feat(报表分析): 新增签署总览等四个报表菜单并拆分演示数据开关

This commit is contained in:
yelan
2026-09-24 21:03:39 +08:00
parent abe7e17582
commit 78402859fd
26 changed files with 3618 additions and 193 deletions
@@ -0,0 +1,91 @@
/**
* 报表分析的数据装载与筛选:四个菜单共用同一个数据集与同一份筛选条件。
*
* 数据集放在模块级而不是每个页面各取一次:四个菜单的数据源完全一样,
* 各取一次会生成四份互不相干的演示数据 —— 从「签署总览」切到「签署量分析」,
* 累计发起数会变,看起来像统计口径不同,其实只是随机数不同。
*/
import { computed, ref } from 'vue'
import {
getReportAnalyticsDataset,
type ReportAnalyticsDataset,
type ReportTaskRow,
} from '@/api/workbench/report-analytics'
import { filterReportTasks, resolveDateWindow } from './aggregate'
import { reportFilter } from './filter-store'
const dataset = ref<ReportAnalyticsDataset | null>(null)
const loading = ref(false)
const errorMessage = ref('')
let pending: Promise<void> | null = null
/**
* 装载数据集。
*
* 并发去重:页面挂载与筛选条刷新可能同时触发,重复请求没有意义。
* 只取一次成功后就不再重取 —— 演示数据是确定性的,重取只会换掉「数据截至」的时刻。
*/
export function loadReportDataset(): Promise<void> {
if (dataset.value) {
return Promise.resolve()
}
pending ??= (async () => {
loading.value = true
errorMessage.value = ''
try {
dataset.value = await getReportAnalyticsDataset()
} catch {
errorMessage.value = '报表数据加载失败,请稍后重试'
} finally {
loading.value = false
pending = null
}
})()
return pending
}
/** 仅供演示 / 验证脚本:清掉缓存后重新装载 */
export function resetReportDataset(): void {
dataset.value = null
pending = null
}
export function useReportDataset() {
/** 当前筛选对应的时间窗口;null 表示自定义区间还没填完 */
const window = computed(() => resolveDateWindow(reportFilter))
const allTasks = computed<ReportTaskRow[]>(() => dataset.value?.tasks ?? [])
/** 当前筛选下的任务明细:四个页面的所有数字都从这里算 */
const tasks = computed<ReportTaskRow[]>(() => filterReportTasks(allTasks.value, reportFilter))
const available = computed(() => dataset.value?.available ?? false)
const generatedAt = computed(() => dataset.value?.generatedAt ?? '')
/**
* 自定义区间只填了一头时为 true。
* 这种半截条件既不该按半截筛,也不该悄悄套默认窗口,页面据此提示用户补全。
*/
const customRangeIncomplete = computed(
() =>
reportFilter.dateRange === 'custom' && (!reportFilter.customFrom || !reportFilter.customTo),
)
return {
allTasks,
tasks,
window,
available,
generatedAt,
loading,
errorMessage,
customRangeIncomplete,
}
}