util.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. 'use strict';
  2. const { CrudService } = require('naf-framework-mongoose/lib/service');
  3. const moment = require('moment');
  4. const _ = require('lodash');
  5. // 工具
  6. class UtilService extends CrudService {
  7. constructor(ctx) {
  8. super(ctx);
  9. this.model = this.ctx.model.Card; // 卡
  10. this.place = this.ctx.model.Place;// 行政区划(原生数据)
  11. this.xzqh = this.ctx.model.Xzqh;// 行政区划
  12. this.set = this.ctx.model.Set;// 套餐
  13. }
  14. async utilMethod(query, body) {
  15. // this.initSetSeed();
  16. }
  17. async initSetSeed() {
  18. let xzqh = await this.xzqh.find({ pcode: { $exists: false } });
  19. xzqh = JSON.parse(JSON.stringify((xzqh)));
  20. const set169 = code => ({ title: '169套餐', has_group: true, contact: code });
  21. const set129 = code => ({ title: '129套餐', has_group: false, contact: code });
  22. const setList = [];
  23. const dirList = [ '110000', '120000', '310000', '500000', '150000', '450000', '640000', '650000', '540000', '810000', '820000' ];
  24. for (const i of xzqh) {
  25. const { code } = i;
  26. if (code !== '110000') {
  27. if (dirList.includes(code)) {
  28. setList.push(set169(code));
  29. setList.push(set129(code));
  30. } else {
  31. const citys = await this.xzqh.find({ pcode: code });
  32. for (const c of citys) {
  33. if (c.code !== '220100') {
  34. setList.push(set169(c.code));
  35. setList.push(set129(c.code));
  36. }
  37. }
  38. }
  39. }
  40. }
  41. this.set.insertMany(setList);
  42. }
  43. // 设置card表的初始数据
  44. async initCardSeed() {
  45. this.seed();
  46. }
  47. async seed() {
  48. // b梯队
  49. const b = [];
  50. for (let i = 1; i <= 5; i++) {
  51. const mobile = i < 10 ? `2222222220${i}` : `222222222${i}`;
  52. const data = {
  53. mobile,
  54. password: '111111',
  55. province: '220000',
  56. city: '220100',
  57. set: '169',
  58. name: `B梯队${i}`,
  59. id_card: '22010319950601161x',
  60. recommend: '刘睿峰',
  61. r_mobile: '13089419810',
  62. };
  63. b.push(data);
  64. await this.ctx.service.card.create(data);
  65. }
  66. // c梯队
  67. const c = [];
  68. let num = 1;
  69. for (const binfo of b) {
  70. const { name, mobile } = binfo;
  71. for (let i = num; i < num + 5; i++) {
  72. const m = i < 10 ? `3333333330${i}` : `333333333${i}`;
  73. const data = {
  74. mobile: m,
  75. password: '111111',
  76. province: '220000',
  77. city: '220100',
  78. set: '169',
  79. id_card: '22010319950601161x',
  80. name: `C梯队${i}`,
  81. recommend: name,
  82. r_mobile: mobile,
  83. };
  84. c.push(data);
  85. await this.ctx.service.card.create(data);
  86. }
  87. num = num + 5;
  88. }
  89. }
  90. // 整理查询条件,重写query时可以选择使用,框架方法改了下
  91. queryReset(filter, options = {}) {
  92. let { sort, desc } = options;
  93. if (sort && _.isString(sort)) {
  94. sort = { [sort]: desc ? -1 : 1 };
  95. } else if (sort && _.isArray(sort)) {
  96. sort = sort.map(f => ({ [f]: desc ? -1 : 1 }))
  97. .reduce((p, c) => ({ ...p, ...c }), {});
  98. }
  99. options.sort = sort;
  100. // 模糊查询
  101. filter = this.turnFilter(filter);
  102. // 日期范围查询
  103. filter = this.turnDateRangeQuery(filter);
  104. return { filter, options };
  105. }
  106. turnFilter(filter) {
  107. const str = /^%\w*%$/;
  108. const keys = Object.keys(filter);
  109. for (const key of keys) {
  110. const res = key.match(str);
  111. if (res) {
  112. const newKey = key.slice(1, key.length - 1);
  113. filter[newKey] = new RegExp(filter[key]);
  114. delete filter[key];
  115. }
  116. }
  117. return filter;
  118. }
  119. /**
  120. * 将时间转换成对应查询Object
  121. * @param {Object} filter 查询条件
  122. */
  123. turnDateRangeQuery(filter) {
  124. const keys = Object.keys(filter);
  125. for (const k of keys) {
  126. if (k.includes('@')) {
  127. const karr = k.split('@');
  128. // 因为是针对处理范围日期,所以必须只有,开始时间和结束时间
  129. if (karr.length === 2) {
  130. const type = karr[1];
  131. if (type === 'start') {
  132. filter[karr[0]] = {
  133. ..._.get(filter, karr[0], {}),
  134. $gte: filter[k],
  135. };
  136. } else {
  137. filter[karr[0]] = {
  138. ..._.get(filter, karr[0], {}),
  139. $lte: filter[k],
  140. };
  141. }
  142. delete filter[k];
  143. }
  144. }
  145. }
  146. return filter;
  147. }
  148. /**
  149. * 整理行政区划
  150. */
  151. resetXzqh() {
  152. // let res = await this.place.find();
  153. // res = JSON.parse(JSON.stringify(res));
  154. // const province = res.filter(f => f.code.endsWith('0000'));
  155. // let cList = [];
  156. // for (const p of province) {
  157. // const { code } = p;
  158. // const prefix = code.substr(0, 2);
  159. // let city = res.filter(f => f.code.startsWith(prefix) && !f.code.endsWith('0000') && f.code.endsWith('00'));
  160. // city = city.map(i => ({ ...i, pcode: code }));
  161. // cList = cList.concat(city);
  162. // }
  163. // await this.xzqh.insertMany([ ...province, ...cList ]);
  164. // return province;
  165. }
  166. }
  167. module.exports = UtilService;