import _ from 'lodash' /** * 自定义表达式 */ const expressionOperator = { eq: function(v1, v2) { if (!v1) { return false } // 当type=CHECK_BOX时此处应为包含关系 return Array.isArray(v1) ? v1.includes(+v2) : v1 == v2 }, ne: function(v1, v2) { if (!v1) { return false } return v1 != v2 } } /** * 逻辑连接符 * @type {{'1': string, '2': string}} */ const LogicConnector = { 1: 'and', 2: 'or' } /** * 获取表达式 * @conditionList 条件列表 * @connector 连接符 ||或者 && */ export function getExpression(conditionList, connector) { let exList = conditionList.filter(item => { return (Object.keys(item).length != 0) }).map(item => { return `field${item.formItemId} ${item.expression} ${item.optionValue} ` }) return _.join(exList, LogicConnector[connector]) } /** * 执行表达式是否成立 */ export function evalExpression(context, expression) { let exArray = expression.split(/and|or/) // 获取是& 还是| let and = expression.indexOf('and') > -1 let flag = false console.log(exArray) for (let i = 0; i < exArray.length; i++) { let itemExpArr = exArray[i].split(' ') console.log(itemExpArr) // 截取字段名 let varName = itemExpArr[0] // 条件 等于 不等于 let sp = itemExpArr[1] // 值 let value = itemExpArr[2] // 比较是否成立 console.log(varName) let fieldValue = _.get(context, varName) console.log(fieldValue) flag = expressionOperator[sp](fieldValue, value) console.log(flag) // & 一个不成立直接调出循环 返回失败 if (and && !flag) { break // | 一个成立直接调出循环 返回成功 } else if (!and && flag) { break } } return flag }