请添加图片描述

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

本文对应模块:Web 层的数据统计与分析实现,包括日周月统计、分类统计、优先级统计、与原生层的统计事件同步机制。

📌 概述

数据统计与分析是应用的重要功能,帮助用户了解任务完成情况和工作趋势。数据统计包括日统计、周统计、月统计、分类统计、优先级统计等功能。AnalyticsEngine 类是统计分析的核心,负责计算各类统计指标。通过数据统计与分析,用户可以更好地了解自己的工作效率和任务分布。

🔗 数据统计与分析的完整流程

数据统计与分析分为三层:Web 层的 AnalyticsEngine(统计分析引擎)负责统计算法的实现,TaskManager(任务管理器)提供任务数据,DatabaseModule(数据库模块)负责数据的查询。当用户查看日统计时,AnalyticsEngine 计算指定日期的任务完成情况。当用户查看周统计时,AnalyticsEngine 计算过去7天的任务统计。当用户查看月统计时,AnalyticsEngine 计算当前月份的任务统计。当用户查看分类统计时,AnalyticsEngine 按分类汇总任务数据。

数据统计与分析与任务管理不同,它关注的是数据的聚合和展示。用户可以通过不同的时间维度查看统计数据,例如按日、周、月查看任务完成情况。用户也可以按分类或优先级查看任务分布。统计数据可以帮助用户识别工作模式和改进空间。

数据统计与分析的实现需要考虑以下几个方面:首先是统计算法的准确性,需要正确计算各类统计指标。其次是统计性能的优化,需要支持快速的数据聚合。第三是统计数据的展示,需要用图表或表格清晰地展示统计结果。第四是统计数据的导出,需要支持将统计数据导出为报表。最后是与原生层的集成,需要通过 Cordova 插件将统计事件通知给原生层。

数据统计与分析在实际应用中非常有用。用户可以通过统计数据了解自己的工作效率。例如,用户可以查看周统计来了解过去一周的任务完成情况。用户也可以查看分类统计来了解不同类型任务的分布。通过长期的统计数据积累,用户可以识别自己的工作模式和改进方向。

🔧 统计分析引擎实现

统计分析引擎的核心实现包括日统计、周统计、月统计、分类统计、优先级统计等功能。日统计时需要计算指定日期的任务总数、完成数、待完成数和完成率。周统计时需要计算过去7天的统计数据。月统计时需要计算当前月份的统计数据。

// 统计分析引擎的关键方法
class AnalyticsEngine {
    static getDailyStats(date) {
        const dateStr = date.toISOString().split('T')[0];
        const tasks = taskManager.getAllTasks().filter(t => t.dueDate === dateStr);
        return {
            date: dateStr,
            total: tasks.length,
            completed: tasks.filter(t => t.status === 'completed').length,
            pending: tasks.filter(t => t.status === 'pending').length,
            completionRate: tasks.length > 0 
                ? Math.round((tasks.filter(t => t.status === 'completed').length / tasks.length) * 100)
                : 0
        };
    }

    static getWeeklyStats() {
        const stats = [];
        const today = new Date();
        for (let i = 6; i >= 0; i--) {
            const date = new Date(today);
            date.setDate(date.getDate() - i);
            stats.push(this.getDailyStats(date));
        }
        return stats;
    }

    static getMonthlyStats() {
        const stats = [];
        const today = new Date();
        const currentMonth = today.getMonth();
        const currentYear = today.getFullYear();
        for (let day = 1; day <= 31; day++) {
            const date = new Date(currentYear, currentMonth, day);
            if (date.getMonth() !== currentMonth) break;
            stats.push(this.getDailyStats(date));
        }
        return stats;
    }

    static getCategoryStats() {
        const stats = {};
        const categories = categoryManager.getAllCategories();
        categories.forEach(cat => {
            const tasks = taskManager.getTasksByCategory(cat.id);
            stats[cat.name] = {
                total: tasks.length,
                completed: tasks.filter(t => t.status === 'completed').length,
                pending: tasks.filter(t => t.status === 'pending').length
            };
        });
        return stats;
    }

    static getPriorityStats() {
        const tasks = taskManager.getAllTasks();
        return {
            high: tasks.filter(t => t.priority === 'high').length,
            medium: tasks.filter(t => t.priority === 'medium').length,
            low: tasks.filter(t => t.priority === 'low').length
        };
    }
}

代码解释:

AnalyticsEngine 类提供了数据统计和分析的核心功能。getDailyStats() 方法计算指定日期的任务统计,包括总数、完成数、待完成数和完成率。getWeeklyStats() 方法计算过去7天的统计数据,返回一个数组,每个元素是一天的统计数据。getMonthlyStats() 方法计算当前月份的统计数据,返回一个数组,每个元素是一天的统计数据。getCategoryStats() 方法按分类汇总任务数据,返回一个对象,键是分类名称,值是该分类的统计数据。getPriorityStats() 方法统计不同优先级的任务数量。

🔌 原生层的统计事件同步

HarmonyOS 原生层也需要与 Web 层的统计功能进行集成。原生层可以通过 Cordova 插件来接收来自 Web 层的统计事件。

// ArkTS 代码示例 - 统计同步插件
import { CordovaPlugin, CallbackContext } from '@magongshou/harmony-cordova/Index';
import { PluginResult, MessageStatus } from '@magongshou/harmony-cordova/Index';

export class AnalyticsSyncPlugin extends CordovaPlugin {
    // 监听 Web 层的统计查询事件
    async onStatsQueried(callbackContext: CallbackContext, args: string[]): Promise<void> {
        try {
            const statsData = JSON.parse(args[0]);
            console.log('[AnalyticsSyncPlugin] 统计已查询:', statsData.statsType);
            console.log('[AnalyticsSyncPlugin] 完成率:', statsData.completionRate, '%');
            
            const result = PluginResult.createByString(MessageStatus.OK, '统计已同步');
            callbackContext.sendPluginResult(result);
        } catch (error) {
            const result = PluginResult.createByString(MessageStatus.ERROR, (error as Error).message);
            callbackContext.sendPluginResult(result);
        }
    }

    // 监听 Web 层的统计导出事件
    async onStatsExported(callbackContext: CallbackContext, args: string[]): Promise<void> {
        try {
            const exportData = JSON.parse(args[0]);
            console.log('[AnalyticsSyncPlugin] 统计已导出:', exportData.format);
            
            const result = PluginResult.createByString(MessageStatus.OK, '导出已同步');
            callbackContext.sendPluginResult(result);
        } catch (error) {
            const result = PluginResult.createByString(MessageStatus.ERROR, (error as Error).message);
            callbackContext.sendPluginResult(result);
        }
    }
}

原生代码解释:

AnalyticsSyncPlugin 是一个 Cordova 插件,提供了原生层与 Web 层统计功能的交互接口。onStatsQueried 方法监听 Web 层的统计查询事件,接收统计类型和完成率等数据。原生层可以根据这个事件更新原生层的统计显示或保存统计历史。onStatsExported 方法监听 Web 层的统计导出事件,接收导出格式。原生层可以根据这个事件在原生层也导出相应的统计数据。

Web 层通知原生统计事件

Web 层可以调用原生插件来通知原生层统计相关的事件:

// JavaScript 代码 - 通知原生统计事件
function notifyStatsQueried(statsType, completionRate) {
    cordova.exec(
        function() { console.log('原生层已收到统计查询通知'); },
        function(error) { console.error('通知失败:', error); },
        'AnalyticsSyncPlugin',
        'onStatsQueried',
        [JSON.stringify({ statsType, completionRate })]
    );
}

function notifyStatsExported(format, fileName) {
    cordova.exec(
        function() { console.log('原生层已收到统计导出通知'); },
        function(error) { console.error('通知失败:', error); },
        'AnalyticsSyncPlugin',
        'onStatsExported',
        [JSON.stringify({ format, fileName })]
    );
}

Web 层代码解释:

notifyStatsQueried 函数使用 cordova.exec() 调用原生插件的 onStatsQueried 方法,传递统计类型和完成率。这样可以从 Web 层通知原生层统计已查询。notifyStatsExported 函数调用原生插件的 onStatsExported 方法,传递导出格式和文件名。这样可以从 Web 层通知原生层统计已导出。通过这些函数,Web 层可以将统计事件同步给原生层,使原生层能够保持与 Web 层的统计数据一致。

总结

数据统计与分析是应用的重要功能,通过日周月统计和分类统计,用户可以全面了解任务完成情况和工作趋势。通过与原生层的集成,可以实现统计事件的完整同步,使用户在不同层级都能看到最新的统计数据。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐