123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- '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 TeamApplyService extends CrudService {
- constructor(ctx) {
- super(ctx, 'teamapply');
- this.model = this.ctx.model.Race.TeamApply;
- this.matchSignModel = this.ctx.model.Race.MatchSign;
- }
- /**
- * 查询项目下可以组队的人
- * @param {Object} query 地址栏查询条件
- * @property {String} project_id 项目地址
- * @property {String} user_id 项目地址
- */
- async findPartner({ project_id, user_id }) {
- // 多层嵌套populate
- const conn = this.app.mongooseDB.get('base');
- const schema = _.get(this.ctx.model, 'Base.User.schema');
- const m = conn.model('User', schema);
- let list = await this.matchSignModel.find({ user_id: { $ne: user_id }, pay_status: '1', project_id }).populate({
- path: 'user_id',
- select: 'user_id',
- populate: { path: 'user_id', model: m, select: 'name' },
- });
- if (list.length > 0) {
- list = JSON.parse(JSON.stringify(list));
- const arr = [];
- for (const i of list) {
- const { user_id } = i;
- const num = await this.model.count({ $or: [{ one_member_id: user_id }, { two_member_id: user_id }] });
- if (num > 0) continue;
- i.user_name = _.get(i, 'user_id.user_id.name');
- i.user_id = _.get(i, 'user_id._id');
- arr.push(i);
- }
- list = arr;
- }
- return list;
- }
- async query(filter, { skip = 0, limit, sort, desc, projection } = {}) {
- // 处理排序
- if (sort && _.isString(sort)) {
- sort = { [sort]: desc ? -1 : 1 };
- } else if (sort && _.isArray(sort)) {
- sort = sort.map(f => ({ [f]: desc ? -1 : 1 })).reduce((p, c) => ({ ...p, ...c }), {});
- }
- let condition = _.cloneDeep(filter);
- condition = await this.beforeQuery(condition);
- condition = this.dealFilter(condition);
- condition = this.selfQueryDeal(condition);
- // 过滤出ref字段
- const { refMods, populate } = await this.getRefMods();
- // 带ref查询
- let rs = await this.model.find(condition, projection, { skip, limit, sort }).populate(populate).exec();
- rs = JSON.parse(JSON.stringify(rs));
- // 整理ref数据
- rs = rs.map(i => {
- for (const obj of refMods) {
- const { col, prop, type } = obj;
- if (!prop) continue;
- if (_.isArray(prop)) {
- for (const p of prop) {
- if (type === 'String') i[`${col}_${p}`] = _.get(i, `${col}.${p}`);
- if (type === 'Array') {
- const list = [];
- const oList = _.get(i, `${col}`);
- for (const d of oList) {
- const obj = { _id: d._id };
- obj[p] = _.get(d, p);
- list.push(obj);
- }
- i[`${col}_${p}`] = list;
- }
- }
- i[col] = _.get(i, `${col}._id`);
- }
- }
- return i;
- });
- rs = await this.afterQuery(filter, rs);
- return rs;
- }
- async count(filter) {
- let condition = _.cloneDeep(filter);
- condition = await this.beforeQuery(condition);
- condition = this.dealFilter(condition);
- condition = this.selfQueryDeal(condition);
- const count = await this.model.count(condition);
- return count;
- }
- selfQueryDeal(condition) {
- if (_.get(condition, 'user_id')) {
- const user_id = _.get(condition, 'user_id');
- condition.$or = [{ one_member_id: user_id }, { two_member_id: user_id }];
- delete condition.user_id;
- }
- return condition;
- }
- }
- module.exports = TeamApplyService;
|