'use strict'; const { CrudService } = require('naf-framework-mongoose-free/lib/service'); const { BusinessError, ErrorCode } = require('naf-core').Error; const _ = require('lodash'); const assert = require('assert'); // class LessonStudentService extends CrudService { constructor(ctx) { super(ctx, 'lessonstudent'); this.model = this.ctx.model.Business.LessonStudent; this.rscModel = this.ctx.model.Relation.RelationStudentCoach; this.lessonCoachModel = this.ctx.model.Business.LessonCoach; this.lessonModel = this.ctx.model.Business.Lesson; } async checkCanUse({ school_id, student_id, lesson_id }) { const num = await this.model.count({ school_id, student_id, lesson_id, $or: [{ is_try: '0', is_pay: { $ne: '-3' } }, { is_try: '1' }] }); if (num > 0) throw new BusinessError(ErrorCode.DATA_EXISTED, '已存在有效的报名信息'); return true; } async beforeCreate(body) { const { lesson_id, school_id, student_id } = body; // 检查是否已经有数据 const data = await this.model.findOne({ lesson_id, school_id, student_id }); // 数据已存在 if (data) throw new BusinessError(ErrorCode.DATA_EXISTED, '您已报名'); // 数据不存在 const { is_try } = body; // 检查是否使用试听名额 if (is_try === '1') { const num = await this.model.count({ student_id, is_try: '1' }); if (num > 0) throw new BusinessError(ErrorCode.SERVICE_FAULT, '您已使用过免费试听的机会'); } return body; } // 计算价格 async toComputed({ lesson_id, student_id }) { // 通过课程id找到该课的所有教练 const lesson = await this.lessonModel.findById(lesson_id); if (!lesson) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到数据'); const data = JSON.parse(JSON.stringify(lesson)); const lessonMoney = _.get(data, 'money'); const lessonType = _.get(data, 'type'); if (!lessonMoney) throw new BusinessError(ErrorCode.DATA_INVALID, '课程设置错误,缺少教练费'); // lesson中的money: 是学生应缴费用; // lessonStudent中的money:是学生应缴费用(公开课不计算,私教课需要查下有没有教师的优惠); // lessonCoach中的money: 是教师公开课每人应收的费用 // 学生应缴计算方式: 公开课:lesson中的money; 私教课 lesson中的money - 和该教练的优惠 (可以没有) // 教练应收计算方式: 公开课: lessonCoach中设置的单价*人数; 私教课: (lesson的money - 对该学生的优惠) 之和 if (lessonType === '0') { // 公开课 data.real_money = lessonMoney; } else { // 找教练和学生的设置 // 虽然用find,但实际上只有一个教练,但凡有2个,就应该不是私教课了 const lessonCoachs = await this.lessonCoachModel.find({ lesson_id }); if (lessonCoachs.length <= 0) return data; const coach_ids = lessonCoachs.map(i => i.coach_id); const rsc = await this.rscModel.findOne({ coach_id: coach_ids, student_id }); if (rsc) { const discountType = _.get(rsc, 'config.discount_type'); // fixed;subtract;discount const number = _.get(rsc, 'config.number'); if (discountType && number) { // 优惠目前设置3种: 固定金额; ${num}(num>1):减num元; x折; 打x折(money * (x/100)) if (discountType === 'fixed') { // 固定金额 data.real_money = number >= 0 ? number : 0; } else if (discountType === 'subtract') { data.real_money = lessonMoney - number >= 0 ? lessonMoney - number : 0; } else if (discountType === 'discount') { data.real_money = _.round(_.multiply(lessonMoney, _.divide(number, 10)), 2); } data.config = _.get(rsc, 'config'); } } } return data; } } module.exports = LessonStudentService;