train_live.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. 'use strict';
  2. const { CrudService } = require('naf-framework-mongoose/lib/service');
  3. const { BusinessError, ErrorCode } = require('naf-core').Error;
  4. const { ObjectId } = require('mongoose').Types;
  5. const assert = require('assert');
  6. const _ = require('lodash');
  7. const jwt = require('jsonwebtoken');
  8. // 培训问诊表
  9. class TrainliveService extends CrudService {
  10. constructor(ctx) {
  11. super(ctx, 'trainlive');
  12. this.model = this.ctx.model.TrainLive;
  13. }
  14. /**
  15. * 重写创建,room_id自动生成
  16. * @param {Object} body 数据
  17. */
  18. async create(body) {
  19. const last = await this.model.findOne().sort({ room_id: -1 });
  20. let room_id = '3001',
  21. password = '3001';
  22. if (last) {
  23. room_id = parseInt(_.get(last, 'room_id', '3000')) + 1;
  24. password = room_id;
  25. }
  26. body.room_id = room_id;
  27. body.password = password;
  28. return await this.model.create(body);
  29. }
  30. /**
  31. * 查询指定培训问诊的参会人员
  32. * @param {Object} {id} 培训问诊id
  33. */
  34. async userData({ id }) {
  35. const object = await this.model.findOne({ _id: ObjectId(id) }, 'user_data');
  36. if (!object) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到指定的培训问诊信息!');
  37. return _.get(object, 'user_data');
  38. }
  39. /**
  40. * 培训问诊管理登陆
  41. * @param {Object} {room_id,password} 房间号,密码
  42. */
  43. async login({ room_id, password }) {
  44. const object = await this.model.findOne({ room_id });
  45. if (!object) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到指定的培训问诊信息!');
  46. if (object.password !== password) throw new BusinessError(ErrorCode.BAD_PASSWORD, '密码错误!');
  47. const data = _.omit(JSON.parse(JSON.stringify(object)), [ 'meta', 'passwd', '__v' ]);
  48. const { secret: jwts } = this.config.jwt;
  49. const token = jwt.sign(data, jwts);
  50. return token;
  51. }
  52. /**
  53. * 为培训问诊添加参加用户
  54. * @param {Object} {id} 培训问诊的数据id
  55. * @param {Array} {users} 培训问诊的参加用户
  56. */
  57. async addUser({ id }, { users }) {
  58. const object = await this.model.findOne({ _id: ObjectId(id) }, '+ user_data');
  59. if (!object) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到指定的培训问诊信息!');
  60. object.user_data.push(...users);
  61. await object.save();
  62. }
  63. /**
  64. * 更改培训问诊下指定用户的数据
  65. * @param {Object} {id} 培训问诊的数据id
  66. * @param {Array} {users} 用户的数据
  67. */
  68. async updateUser({ id }, { users }) {
  69. const object = await this.model.findOne({ _id: ObjectId(id) }, '+ user_data');
  70. if (!object) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到指定的培训问诊信息!');
  71. for (const user of users) {
  72. const { _id, ...info } = user;
  73. if (_id) {
  74. // 存在_id,修改
  75. const oldData = object.user_data.id(ObjectId(_id));
  76. if (!oldData) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到培训问诊下指定的参会人员信息!');
  77. const keys = Object.keys(info);
  78. for (const key of keys) {
  79. oldData[key] = info[key];
  80. }
  81. }
  82. }
  83. await object.save();
  84. }
  85. /**
  86. *移除培训问诊下指定用户
  87. * @param {Object} {id} 培训问诊的数据id
  88. * @param {Object} {users} 用户的数据id集合
  89. */
  90. async deleteUser({ id }, { users }) {
  91. const object = await this.model.findOne({ _id: ObjectId(id) }, '+ user_data');
  92. if (!object) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到指定的培训问诊信息!');
  93. object.user_data = object.user_data.filter(f => !users.find(uf => ObjectId(uf).equals(f._id)));
  94. await object.save();
  95. }
  96. /**
  97. * 参会人员登陆
  98. * @param {Object} {id} 培训问诊的数据id
  99. * @param {Object} user 参会人员的信息,手机号和密码
  100. */
  101. async userLogin({ id }, { user_phone, user_password }) {
  102. assert(user_phone, '缺少登陆的参会人员 手机号');
  103. assert(user_password, '缺少登陆的参会人员 密码');
  104. const object = await this.model.findOne({ _id: ObjectId(id) }, '+ user_data');
  105. if (!object) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到指定的培训问诊信息!');
  106. const user = object.user_data.find(f => f.user_phone === user_phone);
  107. if (!user) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到培训问诊下该手机号的用户信息!');
  108. const is_login = this.ctx.session[`trainlive/${user._id}`];
  109. if (is_login) throw new BusinessError(ErrorCode.BUSINESS, '用户已登录');
  110. if (user.user_password !== user_password) throw new BusinessError(ErrorCode.BAD_PASSWORD, '用户密码错误!');
  111. this.ctx.session[`trainlive/${user._id}`] = user;
  112. const { secret: jwts } = this.config.jwt;
  113. const token = jwt.sign(JSON.parse(JSON.stringify(user)), jwts);
  114. return token;
  115. }
  116. /**
  117. * 延长用户登陆时效
  118. * @param {Object} {id} 用户id
  119. */
  120. async userLonger({ id }) {
  121. const is_login = this.ctx.session[`trainlive/${id}`];
  122. if (!is_login) throw new BusinessError(ErrorCode.BUSINESS, '用户登陆已失效,请重新登陆');
  123. }
  124. /**
  125. * 参会人员注销
  126. * @param {String} {id} 参会人员id
  127. */
  128. async userLogout({ id }) {
  129. this.ctx.session[`trainlive/${id}`] = null;
  130. }
  131. }
  132. module.exports = TrainliveService;