浏览代码

增加行政区划

liuyu 5 年之前
父节点
当前提交
6f1617cd44
共有 4 个文件被更改,包括 99 次插入0 次删除
  1. 20 0
      app/controller/.api.js
  2. 14 0
      app/controller/api.js
  3. 6 0
      app/router.js
  4. 59 0
      app/service/api.js

+ 20 - 0
app/controller/.api.js

@@ -0,0 +1,20 @@
+module.exports = {
+  list: {
+    params: ['!category'],
+    service: 'list',
+    options: {
+      sort: { order: -1, code: 1 }
+    }
+  },
+  fetch: {
+    params: ['!category', '!code'],
+  },
+  xzqh: {
+    query: ['parent', 'level']
+  },
+  findOne: {
+    params: ['!category'],
+    query: ['!name'],
+    service: 'fetch',
+  },
+};

+ 14 - 0
app/controller/api.js

@@ -0,0 +1,14 @@
+'use strict';
+
+const Controller = require('egg').Controller;
+const meta = require('./.api.js');
+const { CrudController } = require('naf-framework-mongoose/lib/controller');
+
+class ApiController extends Controller {
+  constructor(ctx) {
+    super(ctx);
+    this.service = this.ctx.service.api;
+  }
+}
+
+module.exports = CrudController(ApiController, meta);

+ 6 - 0
app/router.js

@@ -25,4 +25,10 @@ module.exports = app => {
   router.post('codecategory', '/api/setting/codecategory/:id', controller.codecategory.update);
   router.resources('codeitem', '/api/setting/codeitem', controller.codeitem); // index、create、show、destroy
   router.post('codeitem', '/api/setting/codeitem/:id', controller.codeitem.update);
+
+  // 开放接口
+  router.get('/api/setting/xzqh/items', controller.api.xzqh);
+  router.get('/api/setting/:category/items', controller.api.list);
+  router.get('/api/setting/:category/findOne', controller.api.findOne);
+  router.get('/api/setting/:category/:code', controller.api.fetch);
 };

+ 59 - 0
app/service/api.js

@@ -0,0 +1,59 @@
+'use strict';
+
+const assert = require('assert');
+const { CrudService } = require('naf-framework-mongoose/lib/service');
+const { isNullOrUndefined, trimData } = require('naf-core').Util;
+const { BusinessError, ErrorCode } = require('naf-core').Error;
+const _ = require('lodash');
+
+class ApiService extends CrudService {
+  constructor(ctx) {
+    super(ctx, 'code_items');
+    this.mItems = this.ctx.model.Codeitem;
+    this.mCategory = this.ctx.model.Codecategory;
+    this.model = this.mItems;
+  }
+
+  async list({ category } = {}) {
+    assert(category, '类别不能为空');
+    // const rs = await this.model.find(trimData(data), null, trimData({ skip, limit, sort: order && { [order]: 1 } })).exec();
+    const c = await this.mCategory.findOne({ $or: [{ code: category }, { key: category }] }).exec();
+    if (isNullOrUndefined(c)) {
+      throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '字典类别不存在');
+    }
+    const rs = await this.mItems.find(trimData({ category: c.code }), { code: 1, name: 1, _id: -1 }, { sort: { order: -1, code: 1 } }).exec();
+    return rs.map(p => ({ code: p.code, name: p.name }));
+  }
+
+  async xzqh({ parent, level } = {}) {
+    assert(isNullOrUndefined(parent) || /^\d{6}$/.test(parent), 'parent必须为有效的行政区划代码');
+    assert(level, 'level不能为空');
+    if (!_.isNumber(level)) level = Number(level);
+    assert(level >= 0 && level <= 3, 'level只能为0~3的数字');
+
+    const filter = { category: '31' };
+    if (level > 0) {
+      const suffix = '000000'.substr(0, (3 - level) * 2);
+      let prefix = '';
+      if (!isNullOrUndefined(parent) && level > 1) prefix = parent.substr(0, (level - 1) * 2);
+      filter.code = { $regex: `${prefix}\\d{2}(?<!00)${suffix}` };
+    }
+    const rs = await this.mItems.find(filter, { code: 1, name: 1, _id: -1 }, { sort: { order: -1, code: 1 } }).exec();
+    return rs.map(p => ({ code: p.code, name: p.name }));
+  }
+
+  async fetch({ category, code, name } = {}) {
+    assert(category, 'category不能为空');
+    assert(code || name, 'code不能为空');
+    console.log('code:', code);
+    // const rs = await this.model.find(trimData(data), null, trimData({ skip, limit, sort: order && { [order]: 1 } })).exec();
+    const c = await this.mCategory.findOne({ $or: [{ code: category }, { key: category }] }).exec();
+    if (isNullOrUndefined(c)) {
+      throw new BusinessError(ErrorCode.DATA_NOT_EXIST, '字典类别不存在');
+    }
+    const res = await this.mItems.findOne(trimData({ category: c.code, code, name }), { code: 1, name: 1, _id: -1 }).exec();
+    return res && _.pick(res, [ 'code', 'name' ]);
+  }
+}
+
+module.exports = ApiService;