2 Commits 506c51ef24 ... 0d30089e2d

Autor SHA1 Mensaje Fecha
  cheny 0d30089e2d Merge branch 'master' of http://git.cc-lotus.info/new_train/service-center hace 4 años
  cheny 664eb9549a 导出初成 hace 4 años
Se han modificado 3 ficheros con 493 adiciones y 87 borrados
  1. 4 1
      app/controller/school.js
  2. 344 79
      app/router.js
  3. 145 7
      app/service/school.js

+ 4 - 1
app/controller/school.js

@@ -18,7 +18,10 @@ class SchoolController extends Controller {
     const res = await this.service.stuimport(this.ctx.request.body);
     this.ctx.ok({ msg: 'created', data: res });
   }
-
+  async exportSchool() {
+    const data = await this.service.exportSchool(this.ctx.request.body);
+    this.ctx.ok({ data });
+  }
 
 }
 

+ 344 - 79
app/router.js

@@ -9,24 +9,43 @@ module.exports = app => {
   // 共通查询单条记录方法
   router.get('/api/train/common/findone/:modelname', controller.common.findone);
   // 共通批量查询方法
-  router.post('/api/train/common/findbyids/:modelname', controller.common.findbyids);
+  router.post(
+    '/api/train/common/findbyids/:modelname',
+    controller.common.findbyids
+  );
   // 共通查询表
   router.get('/api/train/common/findbymodel', controller.common.findbymodel);
   router.get('/api/train/common/findyear', controller.common.findyear);
   // 基础设置表路由
   router.get('/api/train/setting/findone', controller.setting.findone);
   router.resources('setting', '/api/train/setting', controller.setting); // index、create、show、destroy
-  router.post('setting', '/api/train/setting/update/:id', controller.setting.update);
+  router.post(
+    'setting',
+    '/api/train/setting/update/:id',
+    controller.setting.update
+  );
 
   // 科目表设置路由
   router.resources('subject', '/api/train/subject', controller.subject); // index、create、show、destroy
-  router.post('subject', '/api/train/subject/update/:id', controller.subject.update);
+  router.post(
+    'subject',
+    '/api/train/subject/update/:id',
+    controller.subject.update
+  );
 
   // 教师表设置路由
   router.get('teacher', '/api/train/teacher/show/:id', controller.teacher.show);
   router.resources('teacher', '/api/train/teacher', controller.teacher); // index、create、show、destroy
-  router.post('teacher', '/api/train/teacher/update/:id', controller.teacher.update);
-  router.post('teacher', '/api/train/teacher/status', controller.teacher.status);
+  router.post(
+    'teacher',
+    '/api/train/teacher/update/:id',
+    controller.teacher.update
+  );
+  router.post(
+    'teacher',
+    '/api/train/teacher/status',
+    controller.teacher.status
+  );
 
   // 作业表配置路由
   router.resources('task', '/api/train/task', controller.task); // index、create、show、destroy
@@ -34,93 +53,241 @@ module.exports = app => {
 
   // 问卷题库表配置路由
   router.resources('question', '/api/train/question', controller.question); // index、create、show、destroy
-  router.post('question', '/api/train/question/update/:id', controller.question.update);
+  router.post(
+    'question',
+    '/api/train/question/update/:id',
+    controller.question.update
+  );
 
   // 问卷表配置路由
-  router.post('questionnaire', '/api/train/questionnaire', controller.questionnaire.create);
-  router.delete('questionnaire', '/api/train/questionnaire/:id', controller.questionnaire.delete);
-  router.post('questionnaire', '/api/train/questionnaire/update/:id', controller.questionnaire.update);
-  router.get('questionnaire', '/api/train/questionnaire', controller.questionnaire.query);
-  router.get('questionnaire', '/api/train/questionnaire/show/:id', controller.questionnaire.show);
+  router.post(
+    'questionnaire',
+    '/api/train/questionnaire',
+    controller.questionnaire.create
+  );
+  router.delete(
+    'questionnaire',
+    '/api/train/questionnaire/:id',
+    controller.questionnaire.delete
+  );
+  router.post(
+    'questionnaire',
+    '/api/train/questionnaire/update/:id',
+    controller.questionnaire.update
+  );
+  router.get(
+    'questionnaire',
+    '/api/train/questionnaire',
+    controller.questionnaire.query
+  );
+  router.get(
+    'questionnaire',
+    '/api/train/questionnaire/show/:id',
+    controller.questionnaire.show
+  );
 
   // 学生表设置路由
-  router.get('sutdent', '/api/train/student/findscore', controller.student.findscore);
-  router.get('sutdent', '/api/train/student/findbedroom', controller.student.findbedroom);
+  router.get(
+    'sutdent',
+    '/api/train/student/findscore',
+    controller.student.findscore
+  );
+  router.get(
+    'sutdent',
+    '/api/train/student/findbedroom',
+    controller.student.findbedroom
+  );
   router.get('sutdent', '/api/train/student/seek', controller.student.seek);
   router.resources('student', '/api/train/student', controller.student); // index、create、show、destroy
-  router.post('student', '/api/train/student/update/:id', controller.student.update);
+  router.post(
+    'student',
+    '/api/train/student/update/:id',
+    controller.student.update
+  );
   router.post('student', '/api/train/student/upjob', controller.student.upjob);
-  router.post('student', '/api/train/student/deleteclass', controller.student.deleteclass); // 删除学生班级
-  router.post('student', '/api/train/student/findbystuids', controller.student.findbystuids);
-  router.post('student', '/api/train/student/deletestus', controller.student.deletestus); // 删除学生多条
-  router.post('student', '/api/train/student/updatabedroom', controller.student.updatabedroom); // 批量学生寝室号
-
+  router.post(
+    'student',
+    '/api/train/student/deleteclass',
+    controller.student.deleteclass
+  ); // 删除学生班级
+  router.post(
+    'student',
+    '/api/train/student/findbystuids',
+    controller.student.findbystuids
+  );
+  router.post(
+    'student',
+    '/api/train/student/deletestus',
+    controller.student.deletestus
+  ); // 删除学生多条
+  router.post(
+    'student',
+    '/api/train/student/updatabedroom',
+    controller.student.updatabedroom
+  ); // 批量学生寝室号
 
   // 班主任表设置路由
-  router.resources('headteacher', '/api/train/headteacher', controller.headteacher); // index、create、show、destroy
-  router.post('headteacher', '/api/train/headteacher/update/:id', controller.headteacher.update);
+  router.resources(
+    'headteacher',
+    '/api/train/headteacher',
+    controller.headteacher
+  ); // index、create、show、destroy
+  router.post(
+    'headteacher',
+    '/api/train/headteacher/update/:id',
+    controller.headteacher.update
+  );
 
   // 寝室表设置路由
   router.get('/api/train/bedroom/student/:id', controller.bedroom.roomstu); // 根据班级id查询寝室信息
   router.resources('bedroom', '/api/train/bedroom', controller.bedroom); // index、create、show、destroy
-  router.post('bedroom', '/api/train/bedroom/update/:id', controller.bedroom.update);
+  router.post(
+    'bedroom',
+    '/api/train/bedroom/update/:id',
+    controller.bedroom.update
+  );
   router.post('bedroom', '/api/train/bedroom/apart', controller.bedroom.apart);
-  router.post('bedroom', '/api/train/bedroom/ibeacon', controller.bedroom.ibeacon);
+  router.post(
+    'bedroom',
+    '/api/train/bedroom/ibeacon',
+    controller.bedroom.ibeacon
+  );
 
   // 班级表设置路由
-  router.get('class', '/api/train/class/classinfo/:id', controller.class.classinfo);
-  router.post('class', '/api/train/class/upclasses', controller.class.upclasses);
+  router.get(
+    'class',
+    '/api/train/class/classinfo/:id',
+    controller.class.classinfo
+  );
+  router.post(
+    'class',
+    '/api/train/class/upclasses',
+    controller.class.upclasses
+  );
   router.post('class', '/api/train/class/notice', controller.class.notice);
   router.resources('class', '/api/train/class', controller.class); // index、create、show、destroy
   router.post('class', '/api/train/class/update/:id', controller.class.update);
   router.post('class', '/api/train/class/divide', controller.class.divide);
   router.post('class', '/api/train/class/uptea', controller.class.uptea);
-  router.post('class', '/api/train/class/upstuclass/:id', controller.class.studentupclass); // 学生修改班级
+  router.post(
+    'class',
+    '/api/train/class/upstuclass/:id',
+    controller.class.studentupclass
+  ); // 学生修改班级
 
   // 部门表设置路由
-  router.resources('department', '/api/train/department', controller.department); // index、create、show、destroy
-  router.post('department', '/api/train/department/update/:id', controller.department.update);
+  router.resources(
+    'department',
+    '/api/train/department',
+    controller.department
+  ); // index、create、show、destroy
+  router.post(
+    'department',
+    '/api/train/department/update/:id',
+    controller.department.update
+  );
 
   // 位置表设置路由
   router.resources('location', '/api/train/location', controller.location); // index、create、show、destroy
-  router.post('location', '/api/train/location/update/:id', controller.location.update);
+  router.post(
+    'location',
+    '/api/train/location/update/:id',
+    controller.location.update
+  );
 
   // 培训计划表设置路由
   router.resources('trainplan', '/api/train/trainplan', controller.trainplan); // index、create、show、destroy
-  router.post('trainplan', '/api/train/trainplan/update/:id', controller.trainplan.update);
-  router.post('/api/train/trainplan/exportExcel', controller.trainplan.exportExcel);// 导出
-  router.post('/api/train/trainplan/updateclass', controller.trainplan.updateclass);
-  router.post('/api/train/trainplan/updatereteacher', controller.trainplan.updatereteacher);
+  router.post(
+    'trainplan',
+    '/api/train/trainplan/update/:id',
+    controller.trainplan.update
+  );
+  router.post(
+    '/api/train/trainplan/exportExcel',
+    controller.trainplan.exportExcel
+  ); // 导出
+  router.post(
+    '/api/train/trainplan/updateclass',
+    controller.trainplan.updateclass
+  );
+  router.post(
+    '/api/train/trainplan/updatereteacher',
+    controller.trainplan.updatereteacher
+  );
 
   // 培训计划年度批次表设置路由
-  router.resources('trainplanyear', '/api/train/trainplanyear', controller.trainplanyear); // index、create、show、destroy
-  router.post('trainplanyear', '/api/train/trainplanyear/update/:id', controller.trainplanyear.update);
+  router.resources(
+    'trainplanyear',
+    '/api/train/trainplanyear',
+    controller.trainplanyear
+  ); // index、create、show、destroy
+  router.post(
+    'trainplanyear',
+    '/api/train/trainplanyear/update/:id',
+    controller.trainplanyear.update
+  );
 
   // 节假日表设置路由
   router.resources('festival', '/api/train/festival', controller.festival); // index、create、show、destroy
-  router.post('festival', '/api/train/festival/update/:id', controller.festival.update);
+  router.post(
+    'festival',
+    '/api/train/festival/update/:id',
+    controller.festival.update
+  );
 
   // 课程表设置路由
   router.get('/api/train/lesson/teaclass', controller.lesson.teaclass);
-  router.post('lesson', '/api/train/lesson/uplessones', controller.lesson.uplessones);
+  router.post(
+    'lesson',
+    '/api/train/lesson/uplessones',
+    controller.lesson.uplessones
+  );
   router.get('/api/train/lesson/classbyteaid', controller.lesson.classbyteaid); // 根据计划id与教师id查询班级信息
   router.resources('lesson', '/api/train/lesson', controller.lesson); // index、create、show、destroy
-  router.post('lesson', '/api/train/lesson/update/:id', controller.lesson.update);
-  router.post('lesson', '/api/train/lesson/autolesson/:id', controller.lesson.autolesson);// 自动排课
+  router.post(
+    'lesson',
+    '/api/train/lesson/update/:id',
+    controller.lesson.update
+  );
+  router.post(
+    'lesson',
+    '/api/train/lesson/autolesson/:id',
+    controller.lesson.autolesson
+  ); // 自动排课
 
   // 培训计划学校上报时间表设置路由
   router.resources('schtime', '/api/train/schtime', controller.schtime); // index、create、show、destroy
-  router.post('schtime', '/api/train/schtime/update/:id', controller.schtime.update);
-  router.post('schtime', '/api/train/schtime/updateschtimes', controller.schtime.updateschtimes);
+  router.post(
+    'schtime',
+    '/api/train/schtime/update/:id',
+    controller.schtime.update
+  );
+  router.post(
+    'schtime',
+    '/api/train/schtime/updateschtimes',
+    controller.schtime.updateschtimes
+  );
 
   // 班主任全年计划表设置路由
   router.get('teaplan', '/api/train/teaplan/divide', controller.teaplan.divide);
-  router.get('teaplan', '/api/train/teaplan/findteacher', controller.teaplan.findteacher);
+  router.get(
+    'teaplan',
+    '/api/train/teaplan/findteacher',
+    controller.teaplan.findteacher
+  );
   router.resources('teaplan', '/api/train/teaplan', controller.teaplan); // index、create、show、destroy
-  router.post('teaplan', '/api/train/teaplan/update/:id', controller.teaplan.update);
+  router.post(
+    'teaplan',
+    '/api/train/teaplan/update/:id',
+    controller.teaplan.update
+  );
 
   // 教师申请讲课表设置路由
-  router.get('apply', '/api/train/apply/queryteacher', controller.apply.queryteacher);
+  router.get(
+    'apply',
+    '/api/train/apply/queryteacher',
+    controller.apply.queryteacher
+  );
   router.resources('apply', '/api/train/apply', controller.apply); // index、create、show、destroy
   router.post('apply', '/api/train/apply/update/:id', controller.apply.update);
 
@@ -134,51 +301,106 @@ module.exports = app => {
   router.post('group', '/api/train/group/insert', controller.group.insert);
   router.post('group', '/api/train/group/exit', controller.group.exit);
   router.post('group', '/api/train/group/sethead', controller.group.sethead);
-  router.post('group', '/api/train/group/findbystuid', controller.group.findbystuid);
+  router.post(
+    'group',
+    '/api/train/group/findbystuid',
+    controller.group.findbystuid
+  );
 
   // 职责说明表设置路由
   router.resources('duty', '/api/train/duty', controller.duty); // index、create、show、destroy
   router.post('duty', '/api/train/duty/update/:id', controller.duty.update);
 
   // 学生上传作业表设置路由
-  router.resources('uploadtask', '/api/train/uploadtask', controller.uploadtask); // index、create、show、destroy
-  router.post('uploadtask', '/api/train/uploadtask/update/:id', controller.uploadtask.update);
+  router.resources(
+    'uploadtask',
+    '/api/train/uploadtask',
+    controller.uploadtask
+  ); // index、create、show、destroy
+  router.post(
+    'uploadtask',
+    '/api/train/uploadtask/update/:id',
+    controller.uploadtask.update
+  );
 
   // 学生上传问卷表设置路由
-  router.get('/api/train/uploadquestion/completion', controller.uploadquestion.completion); // 统计完成度
-  router.resources('uploadquestion', '/api/train/uploadquestion', controller.uploadquestion); // index、create、show、destroy
-  router.post('uploadquestion', '/api/train/uploadquestion/update/:id', controller.uploadquestion.update);
+  router.get(
+    '/api/train/uploadquestion/completion',
+    controller.uploadquestion.completion
+  ); // 统计完成度
+  router.resources(
+    'uploadquestion',
+    '/api/train/uploadquestion',
+    controller.uploadquestion
+  ); // index、create、show、destroy
+  router.post(
+    'uploadquestion',
+    '/api/train/uploadquestion/update/:id',
+    controller.uploadquestion.update
+  );
 
   // 考勤表设置路由
   router.get('/api/train/attendance/wxauth', controller.attendance.wxauth); // 统计完成度
-  router.resources('attendance', '/api/train/attendance', controller.attendance); // index、create、show、destroy
-  router.post('attendance', '/api/train/attendance/update/:id', controller.attendance.update);
-  router.post('attendance', '/api/train/attendance/attendancecreate', controller.attendance.attendancecreate);
-  router.post('attendance', '/api/train/attendance/attendancecreateList', controller.attendance.attendancecreateList);
+  router.resources(
+    'attendance',
+    '/api/train/attendance',
+    controller.attendance
+  ); // index、create、show、destroy
+  router.post(
+    'attendance',
+    '/api/train/attendance/update/:id',
+    controller.attendance.update
+  );
+  router.post(
+    'attendance',
+    '/api/train/attendance/attendancecreate',
+    controller.attendance.attendancecreate
+  );
+  router.post(
+    'attendance',
+    '/api/train/attendance/attendancecreateList',
+    controller.attendance.attendancecreateList
+  );
   // 学校上传学生名单
   router.resources('school', '/api/train/school', controller.school); // index、create、show、destroy
-  router.post('school', '/api/train/school/update/:id', controller.school.update);
+  router.post(
+    'school',
+    '/api/train/school/update/:id',
+    controller.school.update
+  );
   router.post('/api/train/school/import', controller.school.stuimport); // 名单上传
-
+  router.post('/api/train/school/exportSchool', controller.school.exportSchool); // 导出学校
   // 民族表设置路由
   router.resources('nation', '/api/train/nation', controller.nation); // index、create、show、destroy
-  router.post('nation', '/api/train/nation/update/:id', controller.nation.update);
+  router.post(
+    'nation',
+    '/api/train/nation/update/:id',
+    controller.nation.update
+  );
 
   // 行政区划表设置路由
   router.resources('region', '/api/train/region', controller.region); // index、create、show、destroy
-  router.post('region', '/api/train/region/update/:id', controller.region.update);
+  router.post(
+    'region',
+    '/api/train/region/update/:id',
+    controller.region.update
+  );
 
   // 用户表设置路由
-  router.get('/api/train/user/schoolregister', controller.user.schoolregister);// 学校账号一键生成
+  router.get('/api/train/user/schoolregister', controller.user.schoolregister); // 学校账号一键生成
   router.resources('user', '/api/train/user', controller.user); // index、create、show、destroy
   router.post('user', '/api/train/user/update/:id', controller.user.update);
-  router.post('user', '/api/train/user/register', controller.user.register);// 学校注册
-  router.post('user', '/api/train/user/bind', controller.user.bind);// 学生微信绑定
-  router.post('user', '/api/train/user/userbind', controller.user.userbind);// 其他用户微信绑定
+  router.post('user', '/api/train/user/register', controller.user.register); // 学校注册
+  router.post('user', '/api/train/user/bind', controller.user.bind); // 学生微信绑定
+  router.post('user', '/api/train/user/userbind', controller.user.userbind); // 其他用户微信绑定
 
   // 行政区划表设置路由
   router.resources('termquest', '/api/train/termquest', controller.termquest); // index、create、show、destroy
-  router.post('termquest', '/api/train/termquest/update/:id', controller.termquest.update);
+  router.post(
+    'termquest',
+    '/api/train/termquest/update/:id',
+    controller.termquest.update
+  );
 
   // 微信端访问地址
   router.get('/api/train/auth', controller.weixin.auth); // 微信登录
@@ -186,11 +408,11 @@ module.exports = app => {
   router.get('/api/train/authtest', controller.weixin.authTest); // 微信登录测试
 
   // pc端登录
-  router.post('/api/train/login', controller.login.login);// 登录
+  router.post('/api/train/login', controller.login.login); // 登录
   // 微信端登录
-  router.get('/api/train/qrcode', controller.login.qrcode);// 登录
-  router.post('/api/train/wxcheck', controller.login.wxcheck);// 微信检查登录
-  router.post('/api/train/wxlogin', controller.login.wxlogin);// 登录
+  router.get('/api/train/qrcode', controller.login.qrcode); // 登录
+  router.post('/api/train/wxcheck', controller.login.wxcheck); // 微信检查登录
+  router.post('/api/train/wxlogin', controller.login.wxlogin); // 登录
 
   // 评分表设置路由
   router.resources('score', '/api/train/score', controller.score); // index、create、show、destroy
@@ -198,15 +420,31 @@ module.exports = app => {
 
   // 上传资料表设置路由
   router.resources('material', '/api/train/material', controller.material); // index、create、show、destroy
-  router.post('material', '/api/train/material/update/:id', controller.material.update);
+  router.post(
+    'material',
+    '/api/train/material/update/:id',
+    controller.material.update
+  );
 
   // 资料评分表设置路由
-  router.resources('materialscore', '/api/train/materialscore', controller.materialscore); // index、create、show、destroy
-  router.post('materialscore', '/api/train/materialscore/update/:id', controller.materialscore.update);
+  router.resources(
+    'materialscore',
+    '/api/train/materialscore',
+    controller.materialscore
+  ); // index、create、show、destroy
+  router.post(
+    'materialscore',
+    '/api/train/materialscore/update/:id',
+    controller.materialscore.update
+  );
 
   // 教师在线表设置路由
   router.resources('online', '/api/train/online', controller.online); // index、create、show、destroy
-  router.post('online', '/api/train/online/update/:id', controller.online.update);
+  router.post(
+    'online',
+    '/api/train/online/update/:id',
+    controller.online.update
+  );
 
   // 聊天房间表设置路由
   router.resources('room', '/api/train/room', controller.room); // index、create、show、destroy
@@ -214,20 +452,44 @@ module.exports = app => {
 
   // 聊天记录表设置路由
   router.resources('record', '/api/train/record', controller.record); // index、create、show、destroy
-  router.post('record', '/api/train/record/update/:id', controller.record.update);
+  router.post(
+    'record',
+    '/api/train/record/update/:id',
+    controller.record.update
+  );
 
   // 通知表设置路由
   router.resources('notice', '/api/train/notice', controller.notice); // index、create、show、destroy
-  router.post('notice', '/api/train/notice/update/:id', controller.notice.update);
+  router.post(
+    'notice',
+    '/api/train/notice/update/:id',
+    controller.notice.update
+  );
   router.post('notice', '/api/train/notice/look', controller.notice.look);
 
   // 课程模板表设置路由
-  router.resources('lessonmode', '/api/train/lessonmode', controller.lessonmode); // index、create、show、destroy
-  router.post('lessonmode', '/api/train/lessonmode/update/:id', controller.lessonmode.update);
+  router.resources(
+    'lessonmode',
+    '/api/train/lessonmode',
+    controller.lessonmode
+  ); // index、create、show、destroy
+  router.post(
+    'lessonmode',
+    '/api/train/lessonmode/update/:id',
+    controller.lessonmode.update
+  );
 
   // 全年计划模板表设置路由
-  router.resources('trainmodel', '/api/train/trainmodel', controller.trainmodel); // index、create、show、destroy
-  router.post('trainmodel', '/api/train/trainmodel/update/:id', controller.trainmodel.update);
+  router.resources(
+    'trainmodel',
+    '/api/train/trainmodel',
+    controller.trainmodel
+  ); // index、create、show、destroy
+  router.post(
+    'trainmodel',
+    '/api/train/trainmodel/update/:id',
+    controller.trainmodel.update
+  );
 
   // 统计查询设置路由
   router.get('/api/train/count/countstudent', controller.count.countstudent);
@@ -236,10 +498,13 @@ module.exports = app => {
 
   // 班级类型表配置路由
   router.resources('classtype', '/api/train/classtype', controller.classtype); // index、create、show、destroy
-  router.post('classtype', '/api/train/classtype/update/:id', controller.classtype.update);
+  router.post(
+    'classtype',
+    '/api/train/classtype/update/:id',
+    controller.classtype.update
+  );
 
   // 学校上传任务表设置路由
   router.resources('job', '/api/train/job', controller.job); // index、create、show、destroy
   router.post('job', '/api/train/job/update/:id', controller.job.update);
-
 };

+ 145 - 7
app/service/school.js

@@ -40,7 +40,14 @@ class SchoolService extends CrudService {
     // 取得excle中数据
     const _filepath = this.ctx.app.config.baseUrl + filepath;
     console.log(_filepath);
-    const studatas = await this.getImportXLSXData(_filepath, termid, schid, planid, planyearid, type);
+    const studatas = await this.getImportXLSXData(
+      _filepath,
+      termid,
+      schid,
+      planid,
+      planyearid,
+      type
+    );
     // 将得到的数据校验
     const datacheck = await this.datacheck(studatas);
     if (datacheck.errorcode === '1') {
@@ -57,13 +64,47 @@ class SchoolService extends CrudService {
     }
     const nowtime = moment().locale('zh-cn').format('YYYY-MM-DD HH:mm:ss');
     if (studatas.length > num_) {
-      const jobdata = { code: schid, name: schname, planid: plan.id, termid, term: trem_.term, filepath, studs: JSON.stringify(studatas), plannum: num_, schnum: studatas.length, isstore: '0', createtime: nowtime, type, reason: '学校上传人数超过预期人数,请联系中心管理员' };
+      const jobdata = {
+        code: schid,
+        name: schname,
+        planid: plan.id,
+        termid,
+        term: trem_.term,
+        filepath,
+        studs: JSON.stringify(studatas),
+        plannum: num_,
+        schnum: studatas.length,
+        isstore: '0',
+        createtime: nowtime,
+        type,
+        reason: '学校上传人数超过预期人数,请联系中心管理员',
+      };
       await this.jmodel.create(jobdata);
-      throw new BusinessError(ErrorCode.SERVICE_FAULT, '学校上传人数超过预期人数,请联系中心管理员');
+      throw new BusinessError(
+        ErrorCode.SERVICE_FAULT,
+        '学校上传人数超过预期人数,请联系中心管理员'
+      );
     } else if (studatas.length < num_) {
-      const jobdata = { code: schid, name: schname, planid: plan.id, termid, term: trem_.term, filepath, studs: JSON.stringify(studatas), plannum: num_, schnum: studatas.length, isstore: '0', createtime: nowtime, type, reason: '学校上传人数少于预期人数,请联系中心管理员' };
+      const jobdata = {
+        code: schid,
+        name: schname,
+        planid: plan.id,
+        termid,
+        term: trem_.term,
+        filepath,
+        studs: JSON.stringify(studatas),
+        plannum: num_,
+        schnum: studatas.length,
+        isstore: '0',
+        createtime: nowtime,
+        type,
+        reason: '学校上传人数少于预期人数,请联系中心管理员',
+      };
       await this.jmodel.create(jobdata);
-      throw new BusinessError(ErrorCode.SERVICE_FAULT, '学校上传人数少于预期人数,请联系中心管理员');
+      throw new BusinessError(
+        ErrorCode.SERVICE_FAULT,
+        '学校上传人数少于预期人数,请联系中心管理员'
+      );
     }
     // 将数据存入数据库中
     for (const stu of studatas) {
@@ -141,7 +182,10 @@ class SchoolService extends CrudService {
       const diy_ = [];
       if (theadRule.length > 18) {
         for (let j = 18; j < theadRule.length; j++) {
-          const newdata = { itemname: theadRule[j], itemvalue: data[theadRule[j]] };
+          const newdata = {
+            itemname: theadRule[j],
+            itemvalue: data[theadRule[j]],
+          };
           diy_.push(newdata);
         }
       }
@@ -204,7 +248,6 @@ class SchoolService extends CrudService {
       if (!/^\d{11}$/i.test(data.phone)) {
         errorcode = '1';
         data.msg = data.msg + '手机号不正确,';
-
       }
       const res = await this.smodel.findOne({ id_number: data.id_number });
       if (res) {
@@ -217,6 +260,101 @@ class SchoolService extends CrudService {
     }
     return { errorcode, errormsg };
   }
+
+  // 导出学校名单
+  async exportSchool({ trainplanId }) {
+    // 批次期次都在这里面
+    const trainplan = await this.tmodel.find({ _id: trainplanId });
+    console.log(trainplan);
+    const _headers = [
+      { key: 'title', title: '计划标题' },
+    ];
+    // 需要打出的列表
+    const _data = trainplan;
+    const headers = _headers
+      .map(({ title }) => title)
+      .map((v, i) =>
+        Object.assign({}, { v, position: String.fromCharCode(65 + i) + 1 })
+      )
+      .reduce(
+        (prev, next) =>
+          Object.assign({}, prev, { [next.position]: { v: next.v } }),
+        {}
+      );
+
+    const data = _data
+      .map((v, i) =>
+        _headers.map(({ key }, j) =>
+          Object.assign(
+            {},
+            { v: v[key], position: String.fromCharCode(65 + j) + (i + 2) }
+          )
+        )
+      )
+      .reduce((prev, next) => prev.concat(next))
+      .reduce(
+        (prev, next) =>
+          Object.assign({}, prev, { [next.position]: { v: next.v } }),
+        {}
+      );
+
+    // 合并 headers 和 data
+    const output = Object.assign({}, headers, data);
+
+    // 获取所有单元格的位置
+    const outputPos = Object.keys(output);
+
+    // 计算出范围
+    const ref = outputPos[0] + ':' + outputPos[outputPos.length - 1];
+
+    // 构建 workbook 对象
+    const nowDate = new Date().getTime();
+    const path =
+       'D:\\wwwroot\\service\\service-file\\upload\\train\\' +
+       nowDate +
+       '.xlsx';
+    const respath =
+       'http://free.liaoningdoupo.com:80/files/train/' + nowDate + '.xlsx';
+    const wb = {
+      SheetNames: [ 'sheet0' ],
+      Sheets: { sheet0: Object.assign({}, output, { '!ref': ref }) },
+    };
+    // 导出 Excel
+    XLSX.writeFile(wb, path);
+    return respath;
+  }
+
+  async updateclass({ trainplanid, classid, rightHeader }) {
+    assert(trainplanid && classid && rightHeader, '缺少参数项');
+    // 根据全年计划表id查出对应的全年计划详细信息
+    const trainplan = await this.model.findById(trainplanid);
+    if (!trainplan) {
+      throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '全年计划信息不存在');
+    }
+    for (const term of trainplan.termnum) {
+      for (const batch of term.batchnum) {
+        const class_ = await batch.class.id(classid);
+        if (class_) {
+          class_.headteacherid = rightHeader;
+        }
+      }
+    }
+    return await trainplan.save();
+  }
+
+  async updatereteacher({ trainplanid, termid, reteacher }) {
+    assert(trainplanid && termid && reteacher, '缺少参数项');
+    // 根据全年计划表id查出对应的全年计划详细信息
+    const trainplan = await this.model.findById(trainplanid);
+    if (!trainplan) {
+      throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '全年计划信息不存在');
+    }
+    const term = await trainplan.termnum.id(termid);
+    if (term) {
+      term.reteacher = reteacher;
+    }
+    return await trainplan.save();
+  }
 }
 
 module.exports = SchoolService;