/* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/no-unsafe-argument */ /* eslint-disable @typescript-eslint/no-unsafe-return */ import isEqual from 'lodash/isEqual' import intersection from 'lodash/intersection' import every from 'lodash/every' const isNull: (p: any) => boolean = (value: any) => { if (Array.isArray(value)) { return value.length === 0 } if (typeof value === 'object' && value !== null) { return every(Object.values(value), v => isNull(v)) } if (typeof value === 'number') { return false } return !value } export const getExpression: (p: string, l: any, r?: any) => boolean = ( condition, l, r ) => { if (condition === 'EQ') { if (Array.isArray(l) && Array.isArray(r)) { // 如果长度不想等,直接不想等 if (l.length !== r.length) return false // 长度相等,并且交集之后长度相等,一定是相等的 return intersection(l, r).length === l.length } return isEqual(l, r) } if (condition === 'GT') { return l > r } if (condition === 'GTE') { return l >= r } if (condition === 'LT') { return l < r } if (condition === 'LTE') { return l <= r } if (condition === 'IN') { return l?.includes(r) } if (condition === 'NE') { return !isEqual(l, r) } if (condition === 'LIKE') { return l?.includes(r) } if (condition === 'NIN') { const include = Array.isArray(l) ? intersection(r, l)?.length > 0 : intersection(r, [l])?.length > 0 return !include } if (condition === 'NON') { return isNull(l) } if (condition === 'ISNULL') { return isNull(l) } if (condition === 'NOTNULL') { return !isNull(l) } // 包含任一 if (condition === 'INCLUDE') { return Array.isArray(l) ? intersection(r, l)?.length > 0 : intersection(r, [l])?.length > 0 } return false }