'use strict'; const Service = require('egg').Service; class CarService extends Service { // mode 分为4种 0代表0-60 1代表60-75 2代表75-90 3代表90-100 // modeKey 分为 driving_safety_score energyConservationScore async listWithDrive({ pageNumber = 1, pageSize = 10, startTime, endTime, mode, modeKey = 'driving_safety_score' }) { const { ctx } = this; let cond = {}; const driveCond = [{ $match: {} }]; if (mode) { driveCond[0].$match.score = ctx.helper.scoreDict[mode]; } let project = {}; if (modeKey == 'driving_safety_score') { cond = { driving_safety_score: { $exists: true } }; project = { ...ctx.helper.drivingSafetyScoreProject, vin: 1, series_code: '$car.series_code', series_name: '$car.series_name', model_code: '$car.model_code', model_name: '$car.model_name', user_real_name: '$user.user_real_name', }; } else if (modeKey == 'energyConservationScore') { cond = { energy_conservation_score: { $exists: true } }; project = { ...ctx.helper.energyConservationScoreProject, vin: 1, series_code: '$car.series_code', series_name: '$car.series_name', model_code: '$car.model_code', model_name: '$car.model_name', user_real_name: '$user.user_real_name', }; } const agg = [ { $match: { ...this.ctx.helper.getTimeRangMatch(startTime, endTime, 'start_time'), ...cond } }, { $addFields: { score: { $toDouble: `$${modeKey}` } } }, ...driveCond, ]; const lookups = [ { $lookup: { from: 't_vehicle_record', localField: 'vin', foreignField: 'vin', as: 'car' } }, { $unwind: { path: '$car', preserveNullAndEmptyArrays: true } }, { $lookup: { from: 't_rbac_user', localField: 'car.user_id', foreignField: 'user_id', as: 'user' } }, { $unwind: { path: '$user', preserveNullAndEmptyArrays: true } }, { $project: project }, ]; const list = await ctx.model.DrivingBehaviorInfoModel.aggregate( [ ...agg, ...ctx.helper.getPageMongo(pageNumber, pageSize), ...lookups, ]); const result = await ctx.model.DrivingBehaviorInfoModel.aggregateNGroup( [ ...agg, { $count: 'total' }]); const total = result.total || 0; return { list, total }; } async listWithTravel({ vin, startTime, endTime, pageNumber = 1, pageSize = 10 }) { const { ctx } = this; const agg = [ { $match: { start_time: { $gte: startTime, $lt: endTime }, vin } }, { $unwind: '$mileage_list' }, { $replaceRoot: { newRoot: '$mileage_list' } }, ]; const list = await ctx.model.DrivingBehaviorInfoModel.aggregate([ ...agg, ...ctx.helper.getPageMongo(pageNumber, pageSize) ]); const result = await ctx.model.DrivingBehaviorInfoModel.aggregateNGroup( [ ...agg, { $count: 'total' }]); const total = result.total || 0; return { list, total }; } async listWithCharging(param) { const { service } = this; return await service.otherService.chargingCycle(param); } async indexTrip({ vin, startTime, endTime }) { const { ctx } = this; const agg = [ { $match: { start_time: { $gte: startTime, $lt: endTime }, vin } }, { $unwind: '$mileage_list' }, { $group: { _id: { $hour: { $toDate: '$mileage_list.start_time' } }, dsmCount: { $sum: { $cond: [{ $eq: [ '$mileage_list.dsm_status', '1' ] }, 1, 0 ] } }, count: { $sum: 1 }, } }, ]; return await ctx.model.DrivingBehaviorInfoModel.aggregate(agg); } async indexSingle({ startTime, endTime, vin }) { const { ctx } = this; const agg = [ { $match: { start_time: { $gte: startTime, $lt: endTime }, vin } }, { $addFields: { week: { $dayOfWeek: { date: { $toDate: '$start_time' }, timezone: 'Asia/Shanghai' } }, } }, { $group: { _id: null, avg_speed: { $avg: { $toDouble: '$avg_speed' } }, mileage: { $sum: { $toDouble: '$mileage' } }, work_mileage: { $sum: { $cond: [{ $in: [ '$week', [ 2, 3, 4, 5, 6 ]] }, { $toDouble: '$mileage' }, 0 ], } }, week_mileage: { $sum: { $cond: [{ $in: [ '$week', [ 1, 7 ]] }, { $toDouble: '$mileage' }, 0 ], } }, drive_duration: { $sum: { $toDouble: '$drive_duration' } }, work_drive_duration: { $sum: { $cond: [{ $in: [ '$week', [ 2, 3, 4, 5, 6 ]] }, { $toDouble: '$drive_duration' }, 0 ], } }, week_drive_duration: { $sum: { $cond: [{ $in: [ '$week', [ 1, 7 ]] }, { $toDouble: '$drive_duration' }, 0 ], } }, mileage_cnt: { $sum: { $toDouble: '$mileage_cnt' } }, work_mileage_cnt: { $sum: { $cond: [{ $in: [ '$week', [ 2, 3, 4, 5, 6 ]] }, { $toDouble: '$mileage_cnt' }, 0 ], } }, week_mileage_cnt: { $sum: { $cond: [{ $in: [ '$week', [ 1, 7 ]] }, { $toDouble: '$mileage_cnt' }, 0 ], } }, } }, ]; const result = await ctx.model.DrivingBehaviorInfoModel.aggregateNGroup(agg); return Object.assign({ avg_speed: 0, mileage: 0, work_mileage: 0, week_mileage: 0, drive_duration: 0, work_drive_duration: 0, week_drive_duration: 0, mileage_cnt: 0, work_mileage_cnt: 0, week_mileage_cnt: 0 }, result); } async list({ pageNumber = 1, pageSize = 10, seriesCode, modelCode, vin }) { const { ctx } = this; const cond = { }; if (seriesCode) { cond.series_code = seriesCode; } if (modelCode) { cond.model_code = modelCode; } if (vin) { cond.vin = vin; } const agg = [ { $match: cond }, ...ctx.helper.getPageMongo(pageNumber, pageSize), ]; const list = await ctx.model.TVehicleRecordModel.aggregate(agg); const total = await ctx.model.TVehicleRecordModel.find(cond).countDocuments(); return { list, total }; } async tbox({ pageNumber = 1, pageSize = 10, startTime, endTime }) { const { ctx } = this; const agg = [ { $match: ctx.helper.getTimeRangMatch(startTime, endTime, 'online_time') }, ...ctx.helper.getPageMongo(pageNumber, pageSize), ]; const list = await ctx.model.TBoxOnlineModel.aggregate(agg); const total = await ctx.model.TBoxOnlineModel.find(ctx.helper.getTimeRangMatch(startTime, endTime, 'online_time')).countDocuments(); return { list, total }; } } module.exports = CarService;