lessonStudent.js 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. 'use strict';
  2. const { CrudService } = require('naf-framework-mongoose-free/lib/service');
  3. const { BusinessError, ErrorCode } = require('naf-core').Error;
  4. const _ = require('lodash');
  5. const assert = require('assert');
  6. //
  7. class LessonStudentService extends CrudService {
  8. constructor(ctx) {
  9. super(ctx, 'lessonstudent');
  10. this.model = this.ctx.model.Business.LessonStudent;
  11. this.rscModel = this.ctx.model.Relation.RelationStudentCoach;
  12. this.lessonCoachModel = this.ctx.model.Business.LessonCoach;
  13. this.lessonModel = this.ctx.model.Business.Lesson;
  14. }
  15. async beforeCreate(body) {
  16. const { lesson_id, school_id, student_id } = body;
  17. // 检查是否已经有数据
  18. const data = await this.model.findOne({ lesson_id, school_id, student_id });
  19. // 数据已存在
  20. if (data) throw new BusinessError(ErrorCode.DATA_EXISTED, '您已报名');
  21. // 数据不存在
  22. const { is_try } = body;
  23. // 检查是否使用试听名额
  24. if (is_try === '1') {
  25. const num = await this.model.count({ student_id, is_try: '1' });
  26. if (num > 0) throw new BusinessError(ErrorCode.SERVICE_FAULT, '您已使用过免费试听的机会');
  27. }
  28. return body;
  29. }
  30. // 计算价格
  31. async toComputed({ lesson_id, student_id }) {
  32. // 通过课程id找到该课的所有教练
  33. const lesson = await this.lessonModel.findById(lesson_id);
  34. if (!lesson) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到数据');
  35. const data = JSON.parse(JSON.stringify(lesson));
  36. const lessonMoney = _.get(data, 'money');
  37. const lessonType = _.get(data, 'type');
  38. if (!lessonMoney) throw new BusinessError(ErrorCode.DATA_INVALID, '课程设置错误,缺少教练费');
  39. // lesson中的money: 是学生应缴费用;
  40. // lessonStudent中的money:是学生应缴费用(公开课不计算,私教课需要查下有没有教师的优惠);
  41. // lessonCoach中的money: 是教师公开课每人应收的费用
  42. // 学生应缴计算方式: 公开课:lesson中的money; 私教课 lesson中的money - 和该教练的优惠 (可以没有)
  43. // 教练应收计算方式: 公开课: lessonCoach中设置的单价*人数; 私教课: (lesson的money - 对该学生的优惠) 之和
  44. if (lessonType === '0') {
  45. // 公开课
  46. data.real_money = lessonMoney;
  47. } else {
  48. // 找教练和学生的设置
  49. // 虽然用find,但实际上只有一个教练,但凡有2个,就应该不是私教课了
  50. const lessonCoachs = await this.lessonCoachModel.find({ lesson_id });
  51. if (lessonCoachs.length <= 0) return data;
  52. const coach_ids = lessonCoachs.map(i => i.coach_id);
  53. const rsc = await this.rscModel.findOne({ coach_id: coach_ids, student_id });
  54. if (rsc) {
  55. const discountType = _.get(rsc, 'config.discount_type'); // fixed;subtract;discount
  56. const number = _.get(rsc, 'config.number');
  57. if (discountType && number) {
  58. // 优惠目前设置3种: 固定金额; ${num}(num>1):减num元; x折; 打x折(money * (x/100))
  59. if (discountType === 'fixed') {
  60. // 固定金额
  61. data.real_money = number >= 0 ? number : 0;
  62. } else if (discountType === 'subtract') {
  63. data.real_money = lessonMoney - number >= 0 ? lessonMoney - number : 0;
  64. } else if (discountType === 'discount') {
  65. data.real_money = _.round(_.multiply(lessonMoney, _.divide(number, 10)), 2);
  66. }
  67. data.config = _.get(rsc, 'config');
  68. }
  69. }
  70. }
  71. return data;
  72. }
  73. }
  74. module.exports = LessonStudentService;