123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- 'use strict';
- const { CrudService } = require('naf-framework-mongoose-free/lib/service');
- const { BusinessError, ErrorCode } = require('naf-core').Error;
- const _ = require('lodash');
- const jwt = require('jsonwebtoken');
- // 专家
- class ExpertService extends CrudService {
- constructor(ctx) {
- super(ctx, 'expert');
- this.personal = this.ctx.model.User.Personal;
- this.model = this.ctx.model.User.Expert;
- this.adminModel = this.ctx.model.User.Admin;
- this.util = this.ctx.service.util.util;
- }
- async query({ skip = 0, limit, ...condition } = {}) {
- condition = this.util.dealQuery(condition);
- const { code, status, company, name, phone } = condition;
- let query = {};
- if (code) query.code = code;
- if (status) query.status = status;
- if (name) query.name = name;
- if (phone) query.phone = phone;
- if (company) {
- if (company === '中科系') {
- query.company = { $in: [ '中科院长春分院', '中国科学院东北地理与农业生态研究所', '中国科学院长春应用化学研究所', '中科院长春光学精密机械与物理研究所' ] };
- } else if (company === '其他') {
- query.company = {
- $nin: [ '中科院长春分院', '中国科学院东北地理与农业生态研究所', '中国科学院长春应用化学研究所', '中科院长春光学精密机械与物理研究所', '吉林大学', '长春工业大学' ],
- };
- } else query.company = company;
- }
- query = await this.dealQueryCondition(query);
- const data = await this.model.find(query).skip(parseInt(skip)).limit(parseInt(limit));
- const total = await this.model.count(query);
- // // 因为聚合管道要兼容使用limit,所以当不传limit时,可能需要所有数据,要手动查出limit
- // if (!limit) limit = await this.model.count();
- // const aggArr = [
- // { $match: { is_expert: true } },
- // { $project: { name: 1, phone: 1, email: 1, code: 1, expert: 1 } },
- // {
- // $lookup: {
- // from: 'expert',
- // localField: '_id',
- // foreignField: 'user_id',
- // as: 'expert',
- // },
- // },
- // { $unwind: '$expert' },
- // { $match: query },
- // ];
- // const dataAggArr = _.cloneDeep(aggArr);
- // if (skip) dataAggArr.push({ $skip: parseInt(skip) });
- // if (limit > 0) dataAggArr.push({ $limit: parseInt(limit) });
- // let data = await this.personal.aggregate(dataAggArr);
- // data = data.map(i => {
- // const { expert, ...info } = _.omit(i, [ '_id' ]);
- // const object = { ...expert, ...info };
- // return object;
- // });
- // const totalSearch = await this.personal.aggregate(aggArr);
- // const total = _.get(_.head(totalSearch), 'total', 0);
- return { data, total };
- }
- async dealQueryCondition({ role, code, ...condition } = {}) {
- condition = this.util.dealQuery(condition);
- // 查询业务管理
- const busFind = async query => await this.adminModel.find({ ...query, role: '3' }, { code: 1 });
- // 查询机构管理
- const orgFind = async query => await this.adminModel.find({ ...query, role: '2' }, { code: 1 });
- // 查询管理员
- const aFind = async query => await this.adminModel.find({ ...query, role: '1' }, { code: 1 });
- if (role === '1' && code) {
- // 管理员查询
- // =>获取该code下的机构管理员列表 => 用机构管理员id 获取业务管理员列表 => 将code都整理出来作为查询条件
- const a = await aFind({ code });
- if (a.length <= 0) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到该管理员');
- const aid = _.get(_.head(a), '_id');
- const orgList = await orgFind({ pid: aid });
- const busList = await busFind({ pid: orgList.map(i => i._id) });
- const codes = [ ...orgList.map(i => i.code), ...busList.map(i => i.code), code ];
- condition.code = codes;
- } else if (role === '2' && code) {
- // 机构查询
- // =>获取该code下的业务管理员列表 => 将code都整理出来作为查询条件
- const o = await orgFind({ code });
- if (o.length <= 0) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到该机构');
- const oid = _.get(_.head(o), '_id');
- const busList = await busFind({ pid: oid });
- const codes = [ ...busList.map(i => i.code), code ];
- condition.code = codes;
- } else if (code) {
- // 业务查询
- // code直接查询用户返回即可
- condition.code = code;
- }
- // 没有code,超级管理员,说明不限制
- return condition;
- }
- // async fetch({ user_id }) {
- // const personal = await this.personal.findById(user_id, 'name phone email code');
- // if (!personal) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到个人用户部分信息');
- // let expert = await this.model.findOne({ user_id });
- // if (!expert) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到专家部分信息');
- // expert = JSON.parse(JSON.stringify(expert));
- // const pinfo = _.omit(JSON.parse(JSON.stringify(personal)), [ '_id' ]);
- // expert = { ...pinfo, ...expert };
- // return expert;
- // }
- /**
- * 创建用户
- * @param {Object} params 用户信息
- */
- async create({ password, ...data }) {
- if (!password) password = "123456";
- data.password = { secret: password };
- const { phone } = data;
- // 检查手机号
- const num = await this.model.count({ phone, isdel: '0' });
- if (num > 0) throw new BusinessError(ErrorCode.DATA_EXISTED, '已有专家用户使用该手机号');
- return await this.model.create(data);
- }
- // async delete({ id }) {
- // const object = await this.model.findById(id);
- // if (!object) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到用户的信息');
- // object.isdel = '1';
- // await object.save();
- // }
- /**
- * 修改密码
- * @param {Object} {id,password} 用户id和密码
- */
- async password({ id, password }) {
- const object = await this.model.findById(id);
- if (!object) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到用户的信息');
- object.password = { secret: password };
- await object.save();
- }
- /**
- * 登陆
- * @param {Object} params 登陆信息
- * @property phone 手机号
- * @property password 密码
- */
- async login({ phone, password, code }) {
- const object = await this.model.findOne({ phone, isdel: '0' }, '+password');
- if (!object) throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '未找到用户的信息');
- const { password: op, status } = object;
- const { secret } = op;
- if (status !== '1') throw new BusinessError(ErrorCode.ACCESS_DENIED, '拒绝访问!');
- if (secret !== password) throw new BusinessError(ErrorCode.BAD_PASSWORD, '密码错误');
- const data = _.omit(JSON.parse(JSON.stringify(object)), [ 'meta', 'password', '__v' ]);
- const { secret: secrets } = this.config.jwt;
- const token = jwt.sign(data, secrets);
- // 记录登陆
- // let number = await this.redis.get('login_number') || 0;
- // number++;
- // await this.redis.set('login_number', number);
- return token;
- }
- }
- module.exports = ExpertService;
|