import { get } from 'lodash'; const signMappings = { [`^[%](.*(?=))[%]$`]: { pos: 1, deal: val => new RegExp(val) }, [`^[@]([^=].*)`]: { pos: 1, deal: val => ({ $gt: val }) }, [`^([@][=])(.*)`]: { pos: 1, deal: val => ({ $gte: val }) }, [`(.*[=])[@]$`]: { pos: 1, deal: val => ({ $lt: val }) }, [`(.*)([=][@])$`]: { pos: 2, deal: val => ({ $gte: val }) }, }; /** * 整理参数为查询可用 * 标识符号: * ${column}: 全等查询 eq = * %${column}%: 模糊查询 like 只有全模糊,开头/结尾自己写 * @${column}: 大于查询 * @=${column}: 大于等于 * ${column}@: 小于查询 * ${column}=@: 小于等于 * 如果涉及字段映射,函数内自己处理 * @param filter 前端传来的参数 */ export const QueryReset = (filter: object) => { const regList = Object.keys(signMappings); const nq = {}; for (const key in filter) { const val = filter[key]; let mappingOver = false; for (const regStr of regList) { const reg = new RegExp(regStr); const r = reg.test(key); if (!r) continue; const config = signMappings[regStr]; const er = reg.exec(key); const pos = get(config, 'pos'); const deal = get(config, 'deal'); const propKey = get(er, pos); const propValue = deal(val); nq[propKey] = propValue; mappingOver = true; break; } if (!mappingOver) { nq[key] = val; } } return nq; }; /** * 将查询的key根据映射换值 * @param filter 查询数据对象 * @param mapping 映射对象 */ export const QueryMapping = (filter: object, mapping: object = {}) => { const newFilter = {}; for (const key in filter) { const mkey = get(mapping, key); const val = get(filter, key); if (!mkey) { newFilter[key] = val; continue; } newFilter[mkey] = val; } return newFilter; };