export class BaseAnalytics { /** * @param {Object} param0 * @param {Object} param0.logger - 日誌實例 * @param {AbstractStatisticStorage} param0.statisticStorage - 統計資料儲存實例 * @param {AbstractRawStorage} param0.rawStorage - 原始資料儲存實例 * @param {STATISTIC_GRANULARITY} param0.granularity - 統計粒度 * @param {Object} param0.baseEvent - 基礎事件資訊,trackEvent function 中會以此為基礎再覆寫傳入的 eventData * @param {Object} param0.extraFields - 告知需要特別額外儲存分析的 key,例如 { 'event_params.product_id':1, 'device_info.browser':1 } 代表需要額外儲存 event_params.product_id 和 device_info.browser 的值 */ constructor({ logger, statisticStorage, rawStorage, granularity, baseEvent, extraFields, cipherOptions, }?: { logger: any; statisticStorage: AbstractStatisticStorage; rawStorage: AbstractRawStorage; granularity: { total: number; daily: number; }; baseEvent: any; extraFields: any; }); logger: any; granularity: { total: number; daily: number; }; extraFields: any; statisticStorage: AbstractStatisticStorage | MongoStatisticStorage; rawStorage: AbstractRawStorage | LogRawStorage; baseEvent: any; cipherOptions: { algorithm: any; key: any; iv: any; }; _validateCipherOptions(cipherOptions: any): { algorithm: any; key: any; iv: any; }; /** * 驗證和標準化事件資料 */ _validateAndNormalizeEvent(eventData: any): any; _parseJSON(jsonParam: any, paramName: any): any; /** * 記錄 AI Agent 事件 * @param {Object} eventData - 事件資料 * @param {string} eventData.org_id - 組織 ID * @param {string} eventData.product_id - 產品 ID, Ex. MessageHero * @param {string} eventData.service_id - 服務 ID, Ex. ai_agent * @param {string} eventData.module_id - 模組 ID, Ex. cs_agent, sales_agent, ... * @param {string} eventData.instance_id - 實例 ID * @param {string} eventData.event_name - 事件名稱, Ex. agent_trigger, agent_response, product_query, product_view, ... * @param {string} eventData.event_params - 跟事件相關的參數 (JSON) [optional] * @param {string} eventData.customer_id - 終端用戶 ID (for customer action) [optional for copilot] * @param {string} eventData.user_id - 客戶 ID (for copilot) [optional] * @param {string} eventData.session_id - 會話 ID [optional] * @param {string} eventData.device_info - 設備資訊 (JSON) [optional] [optional] * @param {string} eventData.timestamp - 事件時間 (BSON Date) [optional] * @returns {Promise} - 返回事件 ID */ trackEvent(eventData: { org_id: string; product_id: string; service_id: string; module_id: string; instance_id: string; event_name: string; event_params: string; customer_id: string; user_id: string; session_id: string; device_info: string; timestamp: string; }, { granularity, extraFields }?: { granularity?: { total: number; daily: number; }; extraFields?: any; }): Promise; /** * 取得單一統計資料 * @param {string} org_id - 組織 ID * @param {string} instance_id - 實例 ID * @param {Object} [options] - 選項 * @param {string} [options.date] - 日期 * @param {Object} [options.extraFields] - 額外欄位 * @returns {Promise} - 統計資料 */ getStats(org_id: string, instance_id: string, { date, extraFields }?: { date?: string; extraFields?: any; }): Promise; /** * 取得一筆或多筆統計資料聚合後的結果 * @param {string} org_id - 組織 ID * @param {string} instance_id - 實例 ID * @param {Object} [options] - 選項 * @param {string} [options.date] - 日期 * @param {Object} [options.extraFields] - 額外欄位,主要透過此欄位來選擇要聚合的資料,例如 { 'event_params.product_id': {$in: ['product_1', 'product_2']} } 代表要聚合 product_1 和 product_2 的資料 * @returns {Promise} - 統計資料 */ getAggregatedStats(org_id: string, instance_id: string, { date, extraFields }?: { date?: string; extraFields?: any; }): Promise; /** * 取得每日的統計資料陣列,所有符合篩選條件的資料都會被取出 * @param {string} org_id - 組織 ID * @param {string} instance_id - 實例 ID * @param {string} startDateYYYYMMDD - 開始日期 * @param {string} endDateYYYYMMDD - 結束日期 * @param {Object} [options] - 選項 * @param {Object} [options.extraFields] - 額外欄位 * @returns {Promise>} - 每日統計資料陣列 */ getDailyStats(org_id: string, instance_id: string, startDateYYYYMMDD: string, endDateYYYYMMDD: string, { extraFields }?: { extraFields?: any; }): Promise>; /** * 取得每日統計資料聚合後的結果,跟 getAggregatedStats 的差別在於,getAggregatedStats 是聚合不同 extraFields 的多筆統計資料,而 getAggregatedDailyStats 是聚合每日的結果 * @param {string} org_id - 組織 ID * @param {string} instance_id - 實例 ID * @param {string} startDateYYYYMMDD - 開始日期 * @param {string} endDateYYYYMMDD - 結束日期 * @param {Object} [options] - 選項 * @param {Object} [options.extraFields] - 額外欄位 * @returns {Promise>} - 每日統計資料聚合後的結果 */ getAggregatedDailyStats(org_id: string, instance_id: string, startDateYYYYMMDD: string, endDateYYYYMMDD: string, { extraFields }?: { extraFields?: any; }): Promise>; /** * 查詢出指定時間區間內,符合條件的不重複客戶。 * 只有 InfluxRawStorage 有實作此 function,LogRawStorage 會 throw error * @param {string} rangeStart - 開始日期,包含該時間 (ISO 8601 格式,如: 2024-01-01T00:00:00Z) * @param {string} rangeStop - 結束日期,不包含該時間 (ISO 8601 格式,如: 2024-02-01T00:00:00Z) * @param {string} org_id - 組織 ID * @param {string} instance_id - 實例 ID * @param {string} event_name - 事件名稱 * @param {Object} event_params - 事件參數(選填) * @returns {Promise>} - 不重複客戶 ID 陣列 */ getUniqueCustomerIds(rangeStart: string, rangeStop: string, org_id: string, instance_id: string, event_name: string, event_params?: any): Promise>; /** * 解碼事件資料 * @param {string} code - 編碼後的事件資料 * @returns {Promise} - 解碼後的事件資料 */ decodeEventData(code: string): Promise; /** * 編碼事件資料 * @param {Object} eventData - 事件資料 * @returns {string} - 編碼後的事件資料 */ encodeEventData(eventData: any, granularity?: { total: number; daily: number; }): string; } /** * 存放支援的事件名稱 * @type {Object} */ export const ANALYTICS_EVENTS: any; import { AbstractStatisticStorage } from "../storage"; import { MongoStatisticStorage } from "../storage"; import { AbstractRawStorage } from "../storage"; import { LogRawStorage } from "../storage";