/** * @class EventLog 事件日志模型 */ const BaseMod = require('./base') const Platform = require('./platform') const Channel = require('./channel') const StatEvent = require('./event') const SessionLog = require('./sessionLog') const ShareLog = require('./shareLog') const { DateTime } = require('../lib') module.exports = class EventLog extends BaseMod { constructor() { super() this.tableName = 'event-logs' this.sessionLogInfo = [] } /** * 事件日志填充 * @param {Object} reportParams 上报参数 */ async fill(reportParams) { let params; let sessionKey, sessionLogKey; let sessionLogInfo; const sessionData = [] const fillParams = [] const shareParams = [] const sessionLog = new SessionLog() const event = new StatEvent() const platform = new Platform() const dateTime = new DateTime() const channel = new Channel() for (const rk in reportParams) { params = reportParams[rk] //暂存下会话数据,减少读库 sessionKey = params.ak + params.did + params.p if (!this.sessionLogInfo[sessionKey]) { // 会话日志 sessionLogInfo = await sessionLog.getSession(params) if (sessionLogInfo.code) { return sessionLogInfo } if (this.debug) { console.log('sessionLogInfo', JSON.stringify(sessionLogInfo)) } this.sessionLogInfo[sessionKey] = sessionLogInfo } else { sessionLogInfo = this.sessionLogInfo[sessionKey] } // 会话数据 sessionLogKey = sessionLogInfo.data.sessionLogId.toString() if (!sessionData[sessionLogKey]) { sessionData[sessionLogKey] = { eventCount: sessionLogInfo.data.eventCount + 1, addEventCount: 1, uid: sessionLogInfo.data.uid, createTime: sessionLogInfo.data.createTime } } else { sessionData[sessionLogKey].eventCount++ sessionData[sessionLogKey].addEventCount++ } // 事件 const eventInfo = await event.getEventAndCreate(params.ak, params.e_n) // 填充数据 fillParams.push({ appid: params.ak, version: params.v ? params.v : '', platform: platform.getPlatformCode(params.ut, params.p), channel: channel.getChannelCode(params), device_id: params.did, uid: params.uid ? params.uid : '', session_id: sessionLogInfo.data.sessionLogId, page_id: sessionLogInfo.data.pageId, event_key: eventInfo.event_key, param: params.e_v ? params.e_v : '', // 版本 sdk_version: params.mpsdk ? params.mpsdk : '', platform_version: params.mpv ? params.mpv : '', // 设备相关 device_os_name: params.on ? params.on : platform.getOsName(params.p), device_os_version: params.sv ? params.sv : '', device_vendor: params.brand ? params.brand : '', device_model: params.md ? params.md : '', device_language: params.lang ? params.lang : '', device_pixel_ratio: params.pr ? params.pr : '', device_window_width: params.ww ? params.ww : '', device_window_height: params.wh ? params.wh : '', device_screen_width: params.sw ? params.sw : '', device_screen_height: params.sh ? params.sh : '', create_time: dateTime.getTime() }) // 分享数据 if (eventInfo.event_key === 'share') { shareParams.push(params) } } if (fillParams.length === 0) { return { code: 200, msg: 'Invild param' } } if (shareParams.length > 0) { const shareLog = new ShareLog() await shareLog.fill(shareParams, this.sessionLogInfo) } const res = await this.insert(this.tableName, fillParams) if (res && res.inserted) { for (const sid in sessionData) { await sessionLog.updateSession(sid, sessionData[sid]) } return { code: 0, msg: 'success' } } else { return { code: 500, msg: 'Filled error' } } } /** * 事件日志清理 * @param {Number} days 保留天数 */ async clean(days) { days = Math.max(parseInt(days), 1) console.log('clean event logs - day:', days) const dateTime = new DateTime() //删除过期数据 const res = await this.delete(this.tableName, { create_time: { $lt: dateTime.getTimeBySetDays(0 - days) } }) if (!res.code) { console.log('clean event log:', res) } return res } }