QueryUtils.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { get } from 'lodash';
  2. const signMappings = {
  3. [`^[%](.*(?=))[%]$`]: { pos: 1, deal: val => new RegExp(val) },
  4. [`^[@]([^=].*)`]: { pos: 1, deal: val => ({ $gt: val }) },
  5. [`^([@][=])(.*)`]: { pos: 1, deal: val => ({ $gte: val }) },
  6. [`(.*[=])[@]$`]: { pos: 1, deal: val => ({ $lt: val }) },
  7. [`(.*)([=][@])$`]: { pos: 2, deal: val => ({ $gte: val }) },
  8. };
  9. /**
  10. * 整理参数为查询可用
  11. * 标识符号:
  12. * ${column}: 全等查询 eq =
  13. * %${column}%: 模糊查询 like 只有全模糊,开头/结尾自己写
  14. * @${column}: 大于查询
  15. * @=${column}: 大于等于
  16. * ${column}@: 小于查询
  17. * ${column}=@: 小于等于
  18. * 如果涉及字段映射,函数内自己处理
  19. * @param filter 前端传来的参数
  20. */
  21. export const QueryReset = (filter: object) => {
  22. const regList = Object.keys(signMappings);
  23. const nq = {};
  24. for (const key in filter) {
  25. const val = filter[key];
  26. let mappingOver = false;
  27. for (const regStr of regList) {
  28. const reg = new RegExp(regStr);
  29. const r = reg.test(key);
  30. if (!r) continue;
  31. const config = signMappings[regStr];
  32. const er = reg.exec(key);
  33. const pos = get(config, 'pos');
  34. const deal = get(config, 'deal');
  35. const propKey = get(er, pos);
  36. const propValue = deal(val);
  37. nq[propKey] = propValue;
  38. mappingOver = true;
  39. break;
  40. }
  41. if (!mappingOver) {
  42. nq[key] = val;
  43. }
  44. }
  45. return nq;
  46. };
  47. /**
  48. * 将查询的key根据映射换值
  49. * @param filter 查询数据对象
  50. * @param mapping 映射对象
  51. */
  52. export const QueryMapping = (filter: object, mapping: object = {}) => {
  53. const newFilter = {};
  54. for (const key in filter) {
  55. const mkey = get(mapping, key);
  56. const val = get(filter, key);
  57. if (!mkey) {
  58. newFilter[key] = val;
  59. continue;
  60. }
  61. newFilter[mkey] = val;
  62. }
  63. return newFilter;
  64. };