'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 TryLessonApplyService extends CrudService { constructor(ctx) { super(ctx, 'trylessonapply'); this.model = this.ctx.model.Apply.TryLessonApply; this.lessonStudentService = this.ctx.service.business.lessonStudent; } // 检查该学员是否可以报该节课 async checkCanUse({ school_id, lesson_id, student_id }) { // 先检查是否用过试听机会 let num = await this.model.count({ school_id, student_id, result: '1' }); if (num > 0) throw new BusinessError(ErrorCode.DATA_EXISTED, '您已试听过课程,无法再次申请'); // 该学校,该节课,这名学员. 申请试听的申请状态为 未审核或审核通过时 num = await this.model.count({ school_id, lesson_id, student_id, result: '0' }); if (num > 0) throw new BusinessError(ErrorCode.DATA_EXISTED, '本节课的试听申请在审核中,无法重复申请'); num = await this.model.count({ school_id, lesson_id, student_id, result: '1' }); if (num > 0) throw new BusinessError(ErrorCode.DATA_EXISTED, '本节课的试听申请已通过,无法重复申请'); return true; } async beforeCreate(body) { const { school_id, lesson_id, student_id } = body; await this.checkCanUse({ school_id, lesson_id, student_id }); return body; } async beforeUpdate(filter, update) { // 不是 审核通过的情况就不需要继续检查是否使用过试听名额了 if (update.result !== '1') return { filter, update }; const data = await this.model.findById(filter.id); if (!data) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到数据'); const { school_id, student_id } = data; const num = await this.model.count({ school_id, student_id, result: '1' }); if (num > 0) throw new BusinessError(ErrorCode.DATA_EXISTED, '该学员已经在本校试听过课程,无法重复申请'); return { filter, update }; } // 处理审核成功的情况 async afterUpdate(filter, body, data) { const { result } = data; // 审核不通过, 不处理 if (result !== '1') return data; // 通过,则需要在 lessonStudent中添加数据 const obj = _.pick(data, [ 'school_id', 'lesson_id', 'student_id' ]); obj.is_try = '1'; obj.is_pay = '1'; await this.lessonStudentService.create(obj); return data; } } module.exports = TryLessonApplyService;