123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- 'use strict';
- const Service = require('egg').Service;
- class StatsBaseInfoService2 extends Service {
- // 计算匹配的时间段下 过滤车型车系和驾驶模式后 两个维度分布下 数据之和 [x,y,z]
- async dece({ type, startTime, endTime, seriesCode, modelCode, mode }) {
- const { ctx } = this;
- const cond = [{ $match: {} }];
- if (seriesCode) {
- cond[0].$match['data._id.series_code'] = seriesCode;
- }
- if (modelCode) {
- cond[0].$match['data._id.model_code'] = modelCode;
- }
- const dict = ctx.helper.statusInfoDict.statsSpDeceCnt;
- const obj = {};
- const project = { data: [] };
- if (mode) {
- for (let j = 1; j < dict.superNum + 1; j++) {
- for (let i = 1; i < dict.num + 1; i++) {
- const key = dict.v.replace('=', j).replace('=', i);
- obj[`${j}${i}`] = { $sum: `$data.${dict.k}.${mode}.${key}` };
- project.data.push([ j - 1, i - 1, `$${j}${i}` ]);
- }
- }
- } else {
- for (let j = 1; j < dict.superNum + 1; j++) {
- for (let i = 1; i < dict.num + 1; i++) {
- const key = dict.v.replace('=', j).replace('=', i);
- const sumArr = dict.mode.map(item => {
- return `$data.${dict.k}.${item}.${key}`;
- });
- const sum = { $add: sumArr };
- obj[`${j}${i}`] = { $sum: sum };
- project.data.push([ j - 1, i - 1, `$${j}${i}` ]);
- }
- }
- }
- const agg = [
- { $match: ctx.helper.getTimeRangMatch(startTime, endTime) },
- { $unwind: '$data' },
- ...cond,
- { $group: { _id: null, ...obj } },
- { $project: project },
- ];
- const result = await ctx.model.Local.StatsBaseInfoModel2.aggregateNGroup(agg);
- return result.data || [];
- }
- // 基本方法 计算匹配的时间段下 过滤车型车系和驾驶模式 后时间分组下 维度分布分组数据之和
- async statsWithMode({ type, startTime, endTime, seriesCode, modelCode, mode }, vString) {
- const { ctx } = this;
- const cond = [{ $match: {} }];
- if (seriesCode) {
- cond[0].$match['data._id.series_code'] = seriesCode;
- }
- if (modelCode) {
- cond[0].$match['data._id.model_code'] = modelCode;
- }
- const dict = ctx.helper.statusInfoDict[vString];
- const obj = {};
- const project = { data: [] };
- if (mode) {
- for (let i = 1; i < dict.num + 1; i++) {
- const key = dict.v.replace('=', i);
- obj[i] = { $sum: `$data.${dict.k}.${mode}.${key}` };
- project.data.push({ _id: i + '', count: `$${i}` });
- }
- } else {
- for (let i = 1; i < dict.num + 1; i++) {
- const key = dict.v.replace('=', i);
- const sumArr = dict.mode.map(item => {
- return `$data.${dict.k}.${item}.${key}`;
- });
- const sum = { $add: sumArr };
- obj[i] = { $sum: sum };
- project.data.push({ _id: i + '', count: `$${i}` });
- }
- }
- const agg = [
- { $match: ctx.helper.getTimeRangMatch(startTime, endTime) },
- { $unwind: '$data' },
- ...cond,
- { $group: ctx.helper.getTimeGroup(type, obj) },
- { $project: project },
- ];
- return await ctx.model.Local.StatsBaseInfoModel2.aggregateFix(agg);
- }
- // 计算匹配的时间段下 过滤车型车系后 两个维度分布下 数据之和 [x,y,z]
- async acceAndAs({ type, startTime, endTime, seriesCode, modelCode }, vString) {
- const { ctx } = this;
- const cond = [{ $match: {} }];
- if (seriesCode) {
- cond[0].$match['data._id.series_code'] = seriesCode;
- }
- if (modelCode) {
- cond[0].$match['data._id.model_code'] = modelCode;
- }
- const dict = ctx.helper.statusInfoDict.statsSpAcceCnt.multi[vString];
- const obj = {};
- const project = { data: [] };
- for (let j = 1; j < dict.superNum + 1; j++) {
- for (let i = 1; i < dict.num + 1; i++) {
- const key = dict.v.replace('=', j).replace('=', i);
- obj[`${j}${i}`] = { $sum: `$data.${dict.k}.${key}` };
- project.data.push([ j - 1, i - 1, `$${j}${i}` ]);
- }
- }
- const agg = [
- { $match: ctx.helper.getTimeRangMatch(startTime, endTime) },
- { $unwind: '$data' },
- ...cond,
- { $group: { _id: null, ...obj } },
- { $project: project },
- ];
- const result = await ctx.model.Local.StatsBaseInfoModel2.aggregateNGroup(agg);
- return result.data || [];
- }
- // 基本方法 计算匹配的时间段下 过滤车型车系后时间分组下 维度分布分组数据之和
- async stats({ type, startTime, endTime, seriesCode, modelCode }, vString) {
- const { ctx } = this;
- const cond = [{ $match: {} }];
- if (seriesCode) {
- cond[0].$match['data._id.series_code'] = seriesCode;
- }
- if (modelCode) {
- cond[0].$match['data._id.model_code'] = modelCode;
- }
- const dict = ctx.helper.statusInfoDict[vString];
- const obj = {};
- const project = { data: [] };
- for (let i = 1; i < dict.num + 1; i++) {
- const key = dict.v.replace('=', i);
- obj[i] = { $sum: `$data.${dict.k}.${key}` };
- project.data.push({ _id: i + '', count: `$${i}` });
- }
- const agg = [
- { $match: ctx.helper.getTimeRangMatch(startTime, endTime) },
- { $unwind: '$data' },
- ...cond,
- { $group: ctx.helper.getTimeGroup(type, obj) },
- { $project: project },
- ];
- return await ctx.model.Local.StatsBaseInfoModel2.aggregateFix(agg);
- }
- // 统计清洗
- async statistics({ timeRangData, initData, isForceUpdate }) {
- const { ctx } = this;
- const hasData = await ctx.service.statisticsService.saveBefore(ctx.model.Local.StatsBaseInfoModel2,
- { ...initData });
- if (hasData && !isForceUpdate) {
- return;
- }
- initData.start_time = new Date();
- const data = await this.group(timeRangData);
- ctx.logger.info('任务进行group');
- await this.ctx.service.statisticsService.save(this.ctx.model.Local.StatsBaseInfoModel2,
- { ...initData, data }, isForceUpdate);
- }
- async group({ startTime, endTime }) {
- const { ctx } = this;
- const result = this.getCond(ctx.helper.getStatusInfoArr());
- const agg = [
- { $match: ctx.helper.getTimeRangMatch(startTime, endTime, 'start_time') },
- { $lookup: { from: 't_vehicle_record', localField: 'vin', foreignField: 'vin', as: 'car' } },
- { $unwind: { path: '$car', preserveNullAndEmptyArrays: true } },
- { $group: {
- _id: { series_code: '$car.series_code', model_code: '$car.model_code' },
- ...result.cond,
- } },
- { $project: result.projcet },
- ];
- return await ctx.model.StatsBaseInfoModel.aggregateFix(agg);
- }
- // dbStr数据库字段名称 //localStr本地形成字段名称 //分几段 //是否存在驾驶模式那一层
- getCond(arr) {
- // dbStr = 'stats_acce_cnt.dr_mode_auto.ar=', num = 10
- const cond = {};
- const projcet = {};
- arr.forEach(item => {
- if (item.superNum) {
- for (let j = 1; j < item.superNum + 1; j++) {
- for (let i = 1; i < item.num + 1; i++) {
- const str = item.dbStr.replace('=', j).replace('=', i);
- const key = str.replace(/\./g, '');
- cond[key] = { $sum: `$${str}` };
- projcet[str] = `$${key}`;
- }
- }
- } else {
- for (let i = 1; i < item.num + 1; i++) {
- const str = item.dbStr.replace('=', i);
- const key = str.replace(/\./g, '');
- cond[key] = { $sum: `$${str}` };
- projcet[str] = `$${key}`;
- }
- }
- });
- return { cond, projcet };
- }
- }
- module.exports = StatsBaseInfoService2;
|