123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- '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;
|