score.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. 'use strict';
  2. const assert = require('assert');
  3. const _ = require('lodash');
  4. const { ObjectId } = require('mongoose').Types;
  5. const { CrudService } = require('naf-framework-mongoose/lib/service');
  6. const { BusinessError, ErrorCode } = require('naf-core').Error;
  7. class ScoreService extends CrudService {
  8. constructor(ctx) {
  9. super(ctx, 'score');
  10. this.model = this.ctx.model.Score;
  11. this.tmodel = this.ctx.model.Teacher;
  12. }
  13. async create(data) {
  14. const { teacherid, score } = data;
  15. const res = await this.model.create(data);
  16. this.computedScore({ teacherid });
  17. return res;
  18. }
  19. async update({ id, score }) {
  20. const r = await this.model.findById(id);
  21. if (r) {
  22. // 修改分数,重置状态,下面重新计算
  23. r.score = score;
  24. await r.save();
  25. }
  26. this.computedScore({ teacherid: r.teacherid });
  27. }
  28. // 根据教师id计算教师分数
  29. async computedScore({ teacherid }) {
  30. assert(teacherid, '没有教师信息,无法计算分数');
  31. const teacher = await this.tmodel.findById(teacherid);
  32. if (!teacher) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '没有找到教师信息');
  33. const { beforescore } = teacher;
  34. let teaScoreList = await this.model.find({ teacherid });
  35. // 判断有没有学生给评分
  36. if (teaScoreList.length <= 0) return;
  37. teaScoreList = teaScoreList.map(i => {
  38. i.score = i.score * 1;
  39. return i;
  40. });
  41. teaScoreList = _.uniqBy(teaScoreList, 'studentid');
  42. teaScoreList = _.orderBy(teaScoreList, [ 'score' ], [ 'desc' ]);
  43. teaScoreList = _.drop(teaScoreList);
  44. teaScoreList = _.dropRight(teaScoreList);
  45. const stuScoreTotal = teaScoreList.reduce((p, n) => p + (n.score * 1 || 0), 0);
  46. let score = 0;
  47. if (beforescore) {
  48. score = _.round(_.divide(beforescore * 1 + stuScoreTotal * 1, (teaScoreList.length || 0) + 1), 2);
  49. } else {
  50. score = _.round(_.divide(stuScoreTotal * 1, teaScoreList.length), 2);
  51. }
  52. teacher.xsscore = score;
  53. await teacher.save();
  54. }
  55. }
  56. module.exports = ScoreService;