lrf402788946 4 年之前
父節點
當前提交
5c27f1ca69
共有 3 個文件被更改,包括 1037 次插入1028 次删除
  1. 66 62
      app/controller/.bedroom.js
  2. 682 681
      app/router.js
  3. 289 285
      app/service/bedroom.js

+ 66 - 62
app/controller/.bedroom.js

@@ -1,62 +1,66 @@
-module.exports = {
-  create: {
-    requestBody: [
-      "code",
-      "number",
-      "batch",
-      "gender",
-      "floor",
-      "ibeacon",
-      "status",
-    ],
-  },
-  destroy: {
-    params: ["!id"],
-    service: "delete",
-  },
-  update: {
-    params: ["!id"],
-    requestBody: [
-      "code",
-      "number",
-      "batch",
-      "gender",
-      "floor",
-      "ibeacon",
-      "status",
-    ],
-  },
-  show: {
-    parameters: {
-      params: ["!id"],
-    },
-    service: "fetch",
-  },
-  index: {
-    parameters: {
-      query: {
-        code: "code",
-        number: "number",
-        batch: "batch",
-        gender: "gender",
-        floor: "floor",
-        status: "status",
-      },
-    },
-    service: "query",
-    options: {
-      query: ["skip", "limit"],
-      sort: ["meta.createdAt"],
-      desc: true,
-      count: true,
-    },
-  },
-  updateStudent: {
-    requestBody: ["code", "ids", "bedroomid", 'termid'],
-    service: "updateStudent",
-  },
-  getAssignRoom: {
-    parameters: { query: { termid: "termid" } },
-    service: "getAssignRoom",
-  },
-};
+module.exports = {
+  create: {
+    requestBody: [
+      "code",
+      "number",
+      "batch",
+      "gender",
+      "floor",
+      "ibeacon",
+      "status",
+    ],
+  },
+  destroy: {
+    params: ["!id"],
+    service: "delete",
+  },
+  update: {
+    params: ["!id"],
+    requestBody: [
+      "code",
+      "number",
+      "batch",
+      "gender",
+      "floor",
+      "ibeacon",
+      "status",
+    ],
+  },
+  show: {
+    parameters: {
+      params: ["!id"],
+    },
+    service: "fetch",
+  },
+  index: {
+    parameters: {
+      query: {
+        code: "code",
+        number: "number",
+        batch: "batch",
+        gender: "gender",
+        floor: "floor",
+        status: "status",
+      },
+    },
+    service: "query",
+    options: {
+      query: ["skip", "limit"],
+      sort: ["meta.createdAt"],
+      desc: true,
+      count: true,
+    },
+  },
+  updateStudent: {
+    requestBody: ["code", "ids", "bedroomid", 'termid'],
+    service: "updateStudent",
+  },
+  getAssignRoom: {
+    parameters: { query: { termid: "termid" } },
+    service: "getAssignRoom",
+  },
+  restore: {
+    params: ["!id"],
+    service: "restore",
+  },
+};

文件差異過大導致無法顯示
+ 682 - 681
app/router.js


+ 289 - 285
app/service/bedroom.js

@@ -1,285 +1,289 @@
-'use strict';
-
-
-const assert = require('assert');
-const _ = require('lodash');
-const { ObjectId } = require('mongoose').Types;
-const { CrudService } = require('naf-framework-mongoose/lib/service');
-const { BusinessError, ErrorCode } = require('naf-core').Error;
-
-class BedroomService extends CrudService {
-  constructor(ctx) {
-    super(ctx, 'bedroom');
-    this.model = this.ctx.model.Bedroom;
-    this.smodel = this.ctx.model.Student;
-    this.tmodel = this.ctx.model.Trainplan;
-    this.cmodel = this.ctx.model.Class;
-    this.umodel = this.ctx.model.User;
-    this.ctmodel = this.ctx.model.Classtype;
-    this.nmodel = this.ctx.model.Notice;
-  }
-
-  async query({ code, ...data } = {}, { skip = 0, limit = 0 } = {}) {
-    const query = { ...data };
-    if (code) {
-      query.code = { $regex: code };
-    }
-    const res = await this.model.find(query).skip(parseInt(skip)).limit(parseInt(limit));
-    return res;
-  }
-  async count({ code, ...data } = {}) {
-    const query = { ...data };
-    if (code) {
-      query.code = { $regex: code };
-    }
-    const res = await this.model.count(query);
-    return res;
-  }
-
-  // 根据班级id查找班级下所有寝室列表并查询出寝室下学生信息
-  async roomstu({ id }) {
-    // 通过班级id查询学生表信息
-    const students = await this.smodel.find({ classid: id });
-    const _bedrooms = _.map(students, 'bedroom');
-    // 取得无重复的寝室号
-    const bedrooms = _.uniq(_bedrooms);
-    const data = [];
-    // 根据寝室号 取得相应的学生信息
-    for (const elm of bedrooms) {
-      const stus = students.filter(item => item.bedroom === elm);
-      const newdata = { bedroom: elm, stus };
-      data.push(newdata);
-    }
-    return data;
-  }
-
-  async ibeacon(data) {
-    assert(data.openid, '用户信息不能为空');
-    // 通过openid取得学生信息
-    const user = await this.ctx.service.user.findByOpenid(data.openid);
-    if (!user) {
-      throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '用户不存在');
-    }
-    const student = await this.smodel.findById(user.uid);
-    if (!student) {
-      throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '学生信息不存在');
-    }
-    const beedroom = await this.model.findOne({ code: student.bedroom });
-    if (!beedroom) {
-      throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '寝室信息不存在');
-    }
-    return { data: { ibeacon: beedroom.ibeacon } };
-  }
-
-  // 一键分寝
-  async apart(data) {
-    const { trainplanid, termid, batchid } = data;
-    assert(trainplanid, 'trainplanid不能为空');
-    assert(termid, 'termid不能为空');
-    assert(batchid, 'batchid不能为空');
-    // 根据计划id取得当前计划
-    const trainplan = await this.tmodel.findById(trainplanid);
-    // 根据期id取得当前期信息
-    const term = trainplan.termnum.find(p => p.id === termid);
-    // 根据批次id查询批次信息
-    const _batch = term.batchnum.find(p => p.id === batchid);
-    // 查询所有寝室列表
-    const bedroomList = await this.model
-      .find({ batch: _batch.batch, status: '0' })
-      .sort({ floor: -1 });
-    // 循环所有当前批次下的寝室列表进行分寝处理
-    const studentList = await this.getstudents(termid, batchid);
-    for (const bedroom of bedroomList) {
-      // 判断当前寝室号是否已有
-      // 根据期id查找所有当期学生列表
-      const _stu = _.filter(studentList, { bedroom: bedroom.code });
-      if (bedroom.number !== _stu.length) {
-        let i = 0;
-        let _gender = '';
-        for (const stud of studentList) {
-          if (stud.bedroom) {
-            if (stud.bedroom === bedroom.code) {
-              i = i + 1;
-            }
-            continue;
-          }
-          if (i === 0) {
-            if (!bedroom.gender) {
-              stud.bedroomid = bedroom.id;
-              stud.bedroom = bedroom.code;
-              await stud.save();
-              i = i + 1;
-              _gender = stud.gender;
-            } else {
-              if (bedroom.gender === stud.gender) {
-                stud.bedroomid = bedroom.id;
-                stud.bedroom = bedroom.code;
-                await stud.save();
-                i = i + 1;
-                _gender = stud.gender;
-              }
-            }
-          } else if (i < bedroom.number) {
-            if (_gender === stud.gender) {
-              stud.bedroomid = bedroom.id;
-              stud.bedroom = bedroom.code;
-              await stud.save();
-              i = i + 1;
-            }
-          } else if (i === bedroom.number) {
-            i = 0;
-            break;
-          }
-        }
-      }
-    }
-    // 取得当前批次的所有班级
-    const classes = await this.cmodel.find({ batchid });
-    const detail = '班级学生名单与寝室安排已确认,请及时查收';
-    const nres = await this.nmodel.create({
-      planyearid: trainplan.planyearid,
-      planid: trainplanid,
-      termid,
-      noticeid: 'system',
-      content: detail,
-      type: '5',
-    });
-
-    for (const _class of classes) {
-      // 取得每个班级的班主任id
-      const headteacherid = _class.headteacherid;
-      const headteacher = await this.umodel.findOne({
-        uid: headteacherid,
-        type: '1',
-      });
-      if (headteacher && headteacher.openid) {
-        const openid = headteacher.openid;
-        const remark = '感谢您的使用';
-        const date = await this.ctx.service.util.updatedate();
-        this.ctx.service.weixin.sendTemplateMsg(
-          this.ctx.app.config.REVIEW_TEMPLATE_ID,
-          openid,
-          '您有一个新的通知',
-          detail,
-          date,
-          remark,
-          _class.id
-        );
-        nres.notified.push({
-          notifiedid: headteacher.uid,
-          username: headteacher.name,
-        });
-      }
-      await nres.save();
-    }
-  }
-
-  // 取得符合条件的学生列表
-  async getstudents(termid, batchid) {
-    // 根据期id查找所有当期学生列表
-    const cltype = await this.ctmodel.find({ bedroom: '0' });
-    const types = _.map(cltype, 'code');
-    const studentList = await this.smodel
-      .find({ termid, batchid, type: { $in: types } })
-      .sort({ gender: -1 });
-    return studentList;
-  }
-
-  // 取得符合条件的学生列表
-  async getbedroomstudents(termid, batchid, bedroom) {
-    // 根据期id查找所有当期学生列表
-    const studentList = await this.smodel.find({ termid, batchid, bedroom });
-    return studentList;
-  }
-
-  // 新 分配寝室查询可以的列表
-  async getAssignRoom({ termid }) {
-    const bedroomList = await this.model.find();
-    const stuList = await this.smodel.find({ termid });
-    const stuBedIdGroup = _.groupBy(stuList, 'bedroomid');
-    const keys = Object.keys(stuBedIdGroup);
-    // 过滤出没有人的寝室
-    let noperson = bedroomList.filter(f => !(keys.find(k => {
-      if (k === undefined || k === 'undefined' || k === null || k === 'null') return false;
-      return ObjectId(k).equals(f._id);
-    })));
-    noperson = JSON.parse(JSON.stringify(noperson));
-    const nopersonList = [];
-    for (const i of noperson) {
-      const n = `${i.code}(${i.number}人)`;
-      const obj = { ...i, name: n };
-      nopersonList.push(obj);
-    }
-    const havepersonList = [];
-    for (const key of keys) {
-      if (key === undefined || key === 'undefined' || key === null || key === 'null') continue;
-      // 取出分组后,以寝室id为key的学生列表
-      const list = stuBedIdGroup[key];
-      // 找到寝室obj
-      const bedroom = bedroomList.find(f => ObjectId(key).equals(f._id));
-      // 找不到寝室就算了,下一个吧
-      if (!bedroom) continue;
-      // 找到这个寝室人数限制
-      const { number } = bedroom;
-      // 超出,等于限制人数,继续下个寝室
-      if (list.length >= number * 1) continue;
-      // 这个寝室人没满,需要组织数据了
-      const { _id, code, floor } = bedroom;
-      const elsenum = number * 1 - list.length;
-      const stu = _.head(list);
-      const { gender } = stu;
-      let ncode = `${code}(`;
-      if (elsenum) ncode = `${ncode} 剩余${elsenum}人`;
-      if (gender) ncode = `${ncode} ${gender}性`;
-      if (floor)ncode = `${ncode} ${floor}楼`;
-      ncode = `${ncode})`;
-      const obj = { _id, code, name: ncode };
-      havepersonList.push(obj);
-    }
-    return [ ...nopersonList, ...havepersonList ];
-  }
-
-  // 批量修改学生寝室(新) TODO,需要添加期id,然后找这个寝室,这期同学是否占满/性别错误的问题
-  async updateStudent(data, body) {
-    const { code, ids, bedroomid, termid } = body;
-    const bedroom = await this.model.findById(bedroomid);
-    if (!bedroom) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '不存在该寝室');
-    let { number, gender } = bedroom;
-    // 找到多少人在这个寝室
-    const inRoom = await this.ctx.model.Student.find({ termid, bedroomid });
-    const ifTotal = inRoom.length * 1 + ids.length;
-    if (ifTotal > number * 1) throw new BusinessError(ErrorCode.BUSINESS, `超出人数,该寝室人最多为${number}人`);
-    if (!gender) {
-      // 寝室没设置性别,从这个寝室的学生中取出性别
-      const stu = _.head(inRoom);
-      gender = _.trim(_.get(stu, 'gender'));
-    }
-    const selectStuList = await this.ctx.model.Student.find({ _id: ids.map(i => ObjectId(i)) });
-    for (const id of ids) {
-      const r = await this.ctx.model.Student.findById(id);
-      // 性别查询,是否有误
-      const { gender: sg, name } = r;
-      // 寝室或有已入住学生,产生的性别结果,
-      if (!gender) {
-        r.bedroom = code;
-        r.bedroomid = bedroomid;
-        await r.save();
-      } else {
-        if (sg && sg.includes(gender)) {
-          // 有性别判断
-          r.bedroom = code;
-          r.bedroomid = bedroomid;
-          await r.save();
-        } else {
-          throw new BusinessError(
-            ErrorCode.BusinessError,
-            `${name} 与该寝室已分配的学生性别不符!`
-          );
-        }
-      }
-
-    }
-  }
-}
-
-module.exports = BedroomService;
+'use strict';
+
+
+const assert = require('assert');
+const _ = require('lodash');
+const { ObjectId } = require('mongoose').Types;
+const { CrudService } = require('naf-framework-mongoose/lib/service');
+const { BusinessError, ErrorCode } = require('naf-core').Error;
+
+class BedroomService extends CrudService {
+  constructor(ctx) {
+    super(ctx, 'bedroom');
+    this.model = this.ctx.model.Bedroom;
+    this.smodel = this.ctx.model.Student;
+    this.tmodel = this.ctx.model.Trainplan;
+    this.cmodel = this.ctx.model.Class;
+    this.umodel = this.ctx.model.User;
+    this.ctmodel = this.ctx.model.Classtype;
+    this.nmodel = this.ctx.model.Notice;
+  }
+
+  async query({ code, ...data } = {}, { skip = 0, limit = 0 } = {}) {
+    const query = { ...data };
+    if (code) {
+      query.code = { $regex: code };
+    }
+    const res = await this.model.find(query).skip(parseInt(skip)).limit(parseInt(limit));
+    return res;
+  }
+  async count({ code, ...data } = {}) {
+    const query = { ...data };
+    if (code) {
+      query.code = { $regex: code };
+    }
+    const res = await this.model.count(query);
+    return res;
+  }
+
+  // 根据班级id查找班级下所有寝室列表并查询出寝室下学生信息
+  async roomstu({ id }) {
+    // 通过班级id查询学生表信息
+    const students = await this.smodel.find({ classid: id });
+    const _bedrooms = _.map(students, 'bedroom');
+    // 取得无重复的寝室号
+    const bedrooms = _.uniq(_bedrooms);
+    const data = [];
+    // 根据寝室号 取得相应的学生信息
+    for (const elm of bedrooms) {
+      const stus = students.filter(item => item.bedroom === elm);
+      const newdata = { bedroom: elm, stus };
+      data.push(newdata);
+    }
+    return data;
+  }
+
+  async ibeacon(data) {
+    assert(data.openid, '用户信息不能为空');
+    // 通过openid取得学生信息
+    const user = await this.ctx.service.user.findByOpenid(data.openid);
+    if (!user) {
+      throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '用户不存在');
+    }
+    const student = await this.smodel.findById(user.uid);
+    if (!student) {
+      throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '学生信息不存在');
+    }
+    const beedroom = await this.model.findOne({ code: student.bedroom });
+    if (!beedroom) {
+      throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '寝室信息不存在');
+    }
+    return { data: { ibeacon: beedroom.ibeacon } };
+  }
+
+  // 一键分寝
+  async apart(data) {
+    const { trainplanid, termid, batchid } = data;
+    assert(trainplanid, 'trainplanid不能为空');
+    assert(termid, 'termid不能为空');
+    assert(batchid, 'batchid不能为空');
+    // 根据计划id取得当前计划
+    const trainplan = await this.tmodel.findById(trainplanid);
+    // 根据期id取得当前期信息
+    const term = trainplan.termnum.find(p => p.id === termid);
+    // 根据批次id查询批次信息
+    const _batch = term.batchnum.find(p => p.id === batchid);
+    // 查询所有寝室列表
+    const bedroomList = await this.model
+      .find({ batch: _batch.batch, status: '0' })
+      .sort({ floor: -1 });
+    // 循环所有当前批次下的寝室列表进行分寝处理
+    const studentList = await this.getstudents(termid, batchid);
+    for (const bedroom of bedroomList) {
+      // 判断当前寝室号是否已有
+      // 根据期id查找所有当期学生列表
+      const _stu = _.filter(studentList, { bedroom: bedroom.code });
+      if (bedroom.number !== _stu.length) {
+        let i = 0;
+        let _gender = '';
+        for (const stud of studentList) {
+          if (stud.bedroom) {
+            if (stud.bedroom === bedroom.code) {
+              i = i + 1;
+            }
+            continue;
+          }
+          if (i === 0) {
+            if (!bedroom.gender) {
+              stud.bedroomid = bedroom.id;
+              stud.bedroom = bedroom.code;
+              await stud.save();
+              i = i + 1;
+              _gender = stud.gender;
+            } else {
+              if (bedroom.gender === stud.gender) {
+                stud.bedroomid = bedroom.id;
+                stud.bedroom = bedroom.code;
+                await stud.save();
+                i = i + 1;
+                _gender = stud.gender;
+              }
+            }
+          } else if (i < bedroom.number) {
+            if (_gender === stud.gender) {
+              stud.bedroomid = bedroom.id;
+              stud.bedroom = bedroom.code;
+              await stud.save();
+              i = i + 1;
+            }
+          } else if (i === bedroom.number) {
+            i = 0;
+            break;
+          }
+        }
+      }
+    }
+    // 取得当前批次的所有班级
+    const classes = await this.cmodel.find({ batchid });
+    const detail = '班级学生名单与寝室安排已确认,请及时查收';
+    const nres = await this.nmodel.create({
+      planyearid: trainplan.planyearid,
+      planid: trainplanid,
+      termid,
+      noticeid: 'system',
+      content: detail,
+      type: '5',
+    });
+
+    for (const _class of classes) {
+      // 取得每个班级的班主任id
+      const headteacherid = _class.headteacherid;
+      const headteacher = await this.umodel.findOne({
+        uid: headteacherid,
+        type: '1',
+      });
+      if (headteacher && headteacher.openid) {
+        const openid = headteacher.openid;
+        const remark = '感谢您的使用';
+        const date = await this.ctx.service.util.updatedate();
+        this.ctx.service.weixin.sendTemplateMsg(
+          this.ctx.app.config.REVIEW_TEMPLATE_ID,
+          openid,
+          '您有一个新的通知',
+          detail,
+          date,
+          remark,
+          _class.id
+        );
+        nres.notified.push({
+          notifiedid: headteacher.uid,
+          username: headteacher.name,
+        });
+      }
+      await nres.save();
+    }
+  }
+
+  // 取得符合条件的学生列表
+  async getstudents(termid, batchid) {
+    // 根据期id查找所有当期学生列表
+    const cltype = await this.ctmodel.find({ bedroom: '0' });
+    const types = _.map(cltype, 'code');
+    const studentList = await this.smodel
+      .find({ termid, batchid, type: { $in: types } })
+      .sort({ gender: -1 });
+    return studentList;
+  }
+
+  // 取得符合条件的学生列表
+  async getbedroomstudents(termid, batchid, bedroom) {
+    // 根据期id查找所有当期学生列表
+    const studentList = await this.smodel.find({ termid, batchid, bedroom });
+    return studentList;
+  }
+
+  // 新 分配寝室查询可以的列表
+  async getAssignRoom({ termid }) {
+    const bedroomList = await this.model.find();
+    const stuList = await this.smodel.find({ termid });
+    const stuBedIdGroup = _.groupBy(stuList, 'bedroomid');
+    const keys = Object.keys(stuBedIdGroup);
+    // 过滤出没有人的寝室
+    let noperson = bedroomList.filter(f => !(keys.find(k => {
+      if (k === undefined || k === 'undefined' || k === null || k === 'null') return false;
+      return ObjectId(k).equals(f._id);
+    })));
+    noperson = JSON.parse(JSON.stringify(noperson));
+    const nopersonList = [];
+    for (const i of noperson) {
+      const n = `${i.code}(${i.number}人)`;
+      const obj = { ...i, name: n };
+      nopersonList.push(obj);
+    }
+    const havepersonList = [];
+    for (const key of keys) {
+      if (key === undefined || key === 'undefined' || key === null || key === 'null') continue;
+      // 取出分组后,以寝室id为key的学生列表
+      const list = stuBedIdGroup[key];
+      // 找到寝室obj
+      const bedroom = bedroomList.find(f => ObjectId(key).equals(f._id));
+      // 找不到寝室就算了,下一个吧
+      if (!bedroom) continue;
+      // 找到这个寝室人数限制
+      const { number } = bedroom;
+      // 超出,等于限制人数,继续下个寝室
+      if (list.length >= number * 1) continue;
+      // 这个寝室人没满,需要组织数据了
+      const { _id, code, floor } = bedroom;
+      const elsenum = number * 1 - list.length;
+      const stu = _.head(list);
+      const { gender } = stu;
+      let ncode = `${code}(`;
+      if (elsenum) ncode = `${ncode} 剩余${elsenum}人`;
+      if (gender) ncode = `${ncode} ${gender}性`;
+      if (floor)ncode = `${ncode} ${floor}楼`;
+      ncode = `${ncode})`;
+      const obj = { _id, code, name: ncode };
+      havepersonList.push(obj);
+    }
+    return [ ...nopersonList, ...havepersonList ];
+  }
+
+  // 批量修改学生寝室(新) TODO,需要添加期id,然后找这个寝室,这期同学是否占满/性别错误的问题
+  async updateStudent(data, body) {
+    const { code, ids, bedroomid, termid } = body;
+    const bedroom = await this.model.findById(bedroomid);
+    if (!bedroom) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '不存在该寝室');
+    let { number, gender } = bedroom;
+    // 找到多少人在这个寝室
+    const inRoom = await this.ctx.model.Student.find({ termid, bedroomid });
+    const ifTotal = inRoom.length * 1 + ids.length;
+    if (ifTotal > number * 1) throw new BusinessError(ErrorCode.BUSINESS, `超出人数,该寝室人最多为${number}人`);
+    if (!gender) {
+      // 寝室没设置性别,从这个寝室的学生中取出性别
+      const stu = _.head(inRoom);
+      gender = _.trim(_.get(stu, 'gender'));
+    }
+    const selectStuList = await this.ctx.model.Student.find({ _id: ids.map(i => ObjectId(i)) });
+    for (const id of ids) {
+      const r = await this.ctx.model.Student.findById(id);
+      // 性别查询,是否有误
+      const { gender: sg, name } = r;
+      // 寝室或有已入住学生,产生的性别结果,
+      if (!gender) {
+        r.bedroom = code;
+        r.bedroomid = bedroomid;
+        await r.save();
+      } else {
+        if (sg && sg.includes(gender)) {
+          // 有性别判断
+          r.bedroom = code;
+          r.bedroomid = bedroomid;
+          await r.save();
+        } else {
+          throw new BusinessError(
+            ErrorCode.BusinessError,
+            `${name} 与该寝室已分配的学生性别不符!`
+          );
+        }
+      }
+
+    }
+  }
+
+  async restore({ id }) {
+    await this.smodel.updateMany({ classid: id }, { bedroomid: undefined, bedroom: undefined });
+  }
+}
+
+module.exports = BedroomService;