carService.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. 'use strict';
  2. const Service = require('egg').Service;
  3. class CarService extends Service {
  4. // mode 分为4种 0代表0-60 1代表60-75 2代表75-90 3代表90-100
  5. // modeKey 分为 driving_safety_score energyConservationScore
  6. async listWithDrive({ pageNumber = 1, pageSize = 10, startTime, endTime, mode, modeKey = 'driving_safety_score' }) {
  7. const { ctx } = this;
  8. let cond = {};
  9. const driveCond = [{ $match: {} }];
  10. if (mode) {
  11. driveCond[0].$match.score = ctx.helper.scoreDict[mode];
  12. }
  13. let project = {};
  14. if (modeKey == 'driving_safety_score') {
  15. cond = { driving_safety_score: { $exists: true } };
  16. project = { ...ctx.helper.drivingSafetyScoreProject,
  17. vin: 1, series_code: '$car.series_code', series_name: '$car.series_name',
  18. model_code: '$car.model_code', model_name: '$car.model_name',
  19. user_real_name: '$user.user_real_name',
  20. };
  21. } else if (modeKey == 'energyConservationScore') {
  22. cond = { energy_conservation_score: { $exists: true } };
  23. project = { ...ctx.helper.energyConservationScoreProject,
  24. vin: 1, series_code: '$car.series_code', series_name: '$car.series_name',
  25. model_code: '$car.model_code', model_name: '$car.model_name',
  26. user_real_name: '$user.user_real_name',
  27. };
  28. }
  29. const agg = [
  30. { $match: { ...this.ctx.helper.getTimeRangMatch(startTime, endTime, 'start_time'), ...cond } },
  31. { $addFields: { score: { $toDouble: `$${modeKey}` } } },
  32. ...driveCond,
  33. ];
  34. const lookups = [
  35. { $lookup: { from: 't_vehicle_record', localField: 'vin', foreignField: 'vin', as: 'car' } },
  36. { $unwind: { path: '$car', preserveNullAndEmptyArrays: true } },
  37. { $lookup: { from: 't_rbac_user', localField: 'car.user_id', foreignField: 'user_id', as: 'user' } },
  38. { $unwind: { path: '$user', preserveNullAndEmptyArrays: true } },
  39. { $project: project },
  40. ];
  41. const list = await ctx.model.DrivingBehaviorInfoModel.aggregate(
  42. [ ...agg, ...ctx.helper.getPageMongo(pageNumber, pageSize), ...lookups,
  43. ]);
  44. const result = await ctx.model.DrivingBehaviorInfoModel.aggregateNGroup(
  45. [ ...agg, { $count: 'total' }]);
  46. const total = result.total || 0;
  47. return { list, total };
  48. }
  49. async listWithTravel({ vin, startTime, endTime, pageNumber = 1, pageSize = 10 }) {
  50. const { ctx } = this;
  51. const agg = [
  52. { $match: { start_time: { $gte: startTime, $lt: endTime }, vin } },
  53. { $unwind: '$mileage_list' },
  54. { $replaceRoot: { newRoot: '$mileage_list' } },
  55. ];
  56. const list = await ctx.model.DrivingBehaviorInfoModel.aggregate([ ...agg, ...ctx.helper.getPageMongo(pageNumber, pageSize) ]);
  57. const result = await ctx.model.DrivingBehaviorInfoModel.aggregateNGroup(
  58. [ ...agg, { $count: 'total' }]);
  59. const total = result.total || 0;
  60. return { list, total };
  61. }
  62. async listWithCharging(param) {
  63. const { service } = this;
  64. return await service.otherService.chargingCycle(param);
  65. }
  66. async indexTrip({ vin, startTime, endTime }) {
  67. const { ctx } = this;
  68. const agg = [
  69. { $match: { start_time: { $gte: startTime, $lt: endTime }, vin } },
  70. { $unwind: '$mileage_list' },
  71. { $group: { _id: { $hour: { $toDate: '$mileage_list.start_time' } },
  72. dsmCount: { $sum: { $cond: [{ $eq: [ '$mileage_list.dsm_status', '1' ] }, 1, 0 ] } },
  73. count: { $sum: 1 },
  74. } },
  75. ];
  76. return await ctx.model.DrivingBehaviorInfoModel.aggregate(agg);
  77. }
  78. async indexSingle({ startTime, endTime, vin }) {
  79. const { ctx } = this;
  80. const agg = [
  81. { $match: { start_time: { $gte: startTime, $lt: endTime }, vin } },
  82. { $addFields: {
  83. week: { $dayOfWeek: { date: { $toDate: '$start_time' }, timezone: 'Asia/Shanghai' } },
  84. } },
  85. { $group: { _id: null,
  86. avg_speed: { $avg: { $toDouble: '$avg_speed' } },
  87. mileage: { $sum: { $toDouble: '$mileage' } },
  88. work_mileage: { $sum: {
  89. $cond: [{ $in: [ '$week', [ 2, 3, 4, 5, 6 ]] }, { $toDouble: '$mileage' }, 0 ],
  90. } },
  91. week_mileage: { $sum: {
  92. $cond: [{ $in: [ '$week', [ 1, 7 ]] }, { $toDouble: '$mileage' }, 0 ],
  93. } },
  94. drive_duration: { $sum: { $toDouble: '$drive_duration' } },
  95. work_drive_duration: { $sum: {
  96. $cond: [{ $in: [ '$week', [ 2, 3, 4, 5, 6 ]] }, { $toDouble: '$drive_duration' }, 0 ],
  97. } },
  98. week_drive_duration: { $sum: {
  99. $cond: [{ $in: [ '$week', [ 1, 7 ]] }, { $toDouble: '$drive_duration' }, 0 ],
  100. } },
  101. mileage_cnt: { $sum: { $toDouble: '$mileage_cnt' } },
  102. work_mileage_cnt: { $sum: {
  103. $cond: [{ $in: [ '$week', [ 2, 3, 4, 5, 6 ]] }, { $toDouble: '$mileage_cnt' }, 0 ],
  104. } },
  105. week_mileage_cnt: { $sum: {
  106. $cond: [{ $in: [ '$week', [ 1, 7 ]] }, { $toDouble: '$mileage_cnt' }, 0 ],
  107. } },
  108. } },
  109. ];
  110. const result = await ctx.model.DrivingBehaviorInfoModel.aggregateNGroup(agg);
  111. return Object.assign({ avg_speed: 0, mileage: 0, work_mileage: 0, week_mileage: 0,
  112. drive_duration: 0, work_drive_duration: 0, week_drive_duration: 0,
  113. mileage_cnt: 0, work_mileage_cnt: 0, week_mileage_cnt: 0 }, result);
  114. }
  115. async list({ pageNumber = 1, pageSize = 10, seriesCode, modelCode, vin }) {
  116. const { ctx } = this;
  117. const cond = { };
  118. if (seriesCode) {
  119. cond.series_code = seriesCode;
  120. }
  121. if (modelCode) {
  122. cond.model_code = modelCode;
  123. }
  124. if (vin) {
  125. cond.vin = vin;
  126. }
  127. const agg = [
  128. { $match: cond },
  129. ...ctx.helper.getPageMongo(pageNumber, pageSize),
  130. ];
  131. const list = await ctx.model.TVehicleRecordModel.aggregate(agg);
  132. const total = await ctx.model.TVehicleRecordModel.find(cond).countDocuments();
  133. return { list, total };
  134. }
  135. async tbox({ pageNumber = 1, pageSize = 10, startTime, endTime }) {
  136. const { ctx } = this;
  137. const agg = [
  138. { $match: ctx.helper.getTimeRangMatch(startTime, endTime, 'online_time') },
  139. ...ctx.helper.getPageMongo(pageNumber, pageSize),
  140. ];
  141. const list = await ctx.model.TBoxOnlineModel.aggregate(agg);
  142. const total = await ctx.model.TBoxOnlineModel.find(ctx.helper.getTimeRangMatch(startTime, endTime, 'online_time')).countDocuments();
  143. return { list, total };
  144. }
  145. }
  146. module.exports = CarService;