Explorar o código

添加企业调查

lrf %!s(int64=3) %!d(string=hai) anos
pai
achega
c5b0db8fdf

+ 82 - 0
app/controller/.investigation.js

@@ -0,0 +1,82 @@
+module.exports = {
+  create: {
+    requestBody: [
+      '!name',
+      'address',
+      'field',
+      'funds',
+      'register_time',
+      'web_site',
+      'legal_person',
+      'register_type',
+      'person_number',
+      'bk_number',
+      'research_number',
+      'advanced_number',
+      'brief',
+      'products',
+      'requirement',
+      'postal',
+      'contact',
+      'contact_tel',
+      'email',
+    ],
+  },
+  destroy: {
+    params: ['!id'],
+    service: 'delete',
+  },
+  update: {
+    params: ['!id'],
+    requestBody: [
+      '!name',
+      'address',
+      'field',
+      'funds',
+      'register_time',
+      'web_site',
+      'legal_person',
+      'register_type',
+      'person_number',
+      'bk_number',
+      'research_number',
+      'advanced_number',
+      'brief',
+      'products',
+      'requirement',
+      'postal',
+      'contact',
+      'contact_tel',
+      'email',
+    ],
+  },
+  show: {
+    parameters: {
+      params: ['!id'],
+    },
+    service: 'fetch',
+  },
+  index: {
+    parameters: {
+      query: {
+        'meta.createdAt@start': 'meta.createdAt@start',
+        'meta.createdAt@end': 'meta.createdAt@end',
+        name: 'name',
+        field: 'field',
+        register_time: 'register_time',
+        register_type: 'register_type',
+        contact_tel: 'contact_tel',
+      },
+      // options: {
+      //   "meta.state": 0 // 默认条件
+      // },
+    },
+    service: 'query',
+    options: {
+      query: ['skip', 'limit'],
+      sort: ['meta.createdAt'],
+      desc: true,
+      count: true,
+    },
+  },
+};

+ 13 - 0
app/controller/investigation.js

@@ -0,0 +1,13 @@
+'use strict';
+const meta = require('./.investigation.js');
+const Controller = require('egg').Controller;
+const { CrudController } = require('naf-framework-mongoose/lib/controller');
+
+// 企业调查
+class InvestigationController extends Controller {
+  constructor(ctx) {
+    super(ctx);
+    this.service = this.ctx.service.investigation;
+  }
+}
+module.exports = CrudController(InvestigationController, meta);

+ 40 - 0
app/model/investigation.js

@@ -0,0 +1,40 @@
+'use strict';
+const Schema = require('mongoose').Schema;
+const metaPlugin = require('naf-framework-mongoose/lib/model/meta-plugin');
+
+// 企业调查
+const investigation = {
+  name: { type: String, required: true }, // 企业名称
+  address: { type: String, required: false }, // 通讯地址
+  postal: { type: String, required: false }, // 邮编
+  field: { type: Array, required: false }, // 所属领域
+  funds: { type: String, required: false }, // 注册资金
+  register_time: { type: String, required: false }, // 注册时间
+  web_site: { type: String, required: false }, // 网址
+  legal_person: { type: Object, required: false }, // 法人信息
+  register_type: { type: Array, required: false }, // 注册登记类型
+  contact: { type: String, required: false }, // 联系人
+  contact_tel: { type: String, required: false }, // 联系电话
+  email: { type: String, required: false }, // 电子邮箱
+  person_number: { type: String, required: false }, // 职工人数
+  bk_number: { type: String, required: false }, // 本科以上人数
+  research_number: { type: String, required: false }, // 研究开发人数
+  advanced_number: { type: String, required: false }, // 高级职称人数
+  brief: { type: String, required: false }, // 企业概况
+  products: { type: Array, required: false }, // 产品列表
+  requirement: { type: Object, required: false }, // 企业需求情况
+};
+const schema = new Schema(investigation, { toJSON: { virtuals: true } });
+schema.index({ id: 1 });
+schema.index({ 'meta.createdAt': 1 });
+schema.index({ name: 1 });
+schema.index({ field: 1 });
+schema.index({ register_time: 1 });
+schema.index({ register_type: 1 });
+schema.index({ contact_tel: 1 });
+
+schema.plugin(metaPlugin);
+module.exports = app => {
+  const { mongoose } = app;
+  return mongoose.model('Investigation', schema, 'investigation');
+};

+ 1 - 0
app/router.js

@@ -10,4 +10,5 @@ module.exports = app => {
   require('./router/question')(app); // 问题
   require('./router/questionnaire')(app); // 问卷
   require('./router/answer')(app); // 回答
+  require('./router/investigation')(app); // 企业调查
 };

+ 10 - 0
app/router/investigation.js

@@ -0,0 +1,10 @@
+'use strict';
+
+
+module.exports = app => {
+  const { router, controller } = app;
+  const profix = '/api/question/';
+  const target = 'investigation';
+  router.resources(target, `${profix}${target}`, controller[target]); // index、create、show、destroy
+  router.post(target, `${profix}${target}/update/:id`, controller[target].update);
+};

+ 28 - 0
app/service/investigation.js

@@ -0,0 +1,28 @@
+'use strict';
+const { CrudService } = require('naf-framework-mongoose/lib/service');
+const { BusinessError, ErrorCode } = require('naf-core').Error;
+const _ = require('lodash');
+const assert = require('assert');
+
+// 企业需求
+class InvestigationService extends CrudService {
+  constructor(ctx) {
+    super(ctx, 'investigation');
+    this.model = this.ctx.model.Investigation;
+  }
+
+  async query(filter, options = {}) {
+    const { filter: nf, options: no } = this.ctx.service.util.util.dealQuery(_.cloneDeep(filter), _.cloneDeep(options));
+    const { skip, limit, sort, projection } = no;
+    const rs = await this.model.find(nf, projection, { skip, limit, sort }).exec();
+    return rs;
+  }
+
+  async count(filter) {
+    const nf = this.ctx.service.util.util.dealFilter(_.cloneDeep(filter));
+    const res = await this.model.countDocuments(nf).exec();
+    return res;
+  }
+}
+
+module.exports = InvestigationService;

+ 82 - 0
app/service/util/util.js

@@ -0,0 +1,82 @@
+'use strict';
+const _ = require('lodash');
+const moment = require('moment');
+const { CrudService } = require('naf-framework-mongoose/lib/service');
+const { ObjectId } = require('mongoose').Types;
+const fs = require('fs');
+class UtilService extends CrudService {
+  constructor(ctx) {
+    super(ctx);
+    this.mq = this.ctx.mq;
+  }
+  async utilMethod(query, body) {
+    this.ctx.service.patent.patentearly.needWarning();
+  }
+
+  dealQuery(filter, { skip, 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 }), {});
+    }
+    const options = { skip, limit, sort, desc, projection };
+    filter = this.turnFilter(this.turnDateRangeQuery(filter));
+    return { filter, options };
+  }
+
+  dealFilter(filter) {
+    return this.turnFilter(this.turnDateRangeQuery(filter));
+  }
+
+  /**
+   * 将查询条件中模糊查询的标识转换成对应object
+   * @param {Object} filter 查询条件
+   */
+  turnFilter(filter) {
+    const str = /^%\S*%$/;
+    const keys = Object.keys(filter);
+    for (const key of keys) {
+      const res = key.match(str);
+      if (res) {
+        const newKey = key.slice(1, key.length - 1);
+        filter[newKey] = new RegExp(filter[key]);
+        delete filter[key];
+      }
+    }
+    return filter;
+  }
+  /**
+   * 将时间转换成对应查询Object
+   * @param {Object} filter 查询条件
+   */
+  turnDateRangeQuery(filter) {
+    const keys = Object.keys(filter);
+    for (const k of keys) {
+      if (k.includes('@')) {
+        const karr = k.split('@');
+        if (karr.length === 2) {
+          const type = karr[1];
+          if (type === 'start') {
+            if (filter[k] && filter[k] !== '') {
+              filter[karr[0]] = {
+                ..._.get(filter, karr[0], {}),
+                $gte: filter[k],
+              };
+            }
+          } else {
+            if (filter[k] && filter[k] !== '') {
+              filter[karr[0]] = {
+                ..._.get(filter, karr[0], {}),
+                $lte: filter[k],
+              };
+            }
+          }
+          delete filter[k];
+        }
+      }
+    }
+    return filter;
+  }
+}
+module.exports = UtilService;