You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
1.9 KiB
80 lines
1.9 KiB
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
|
|
}
|
|
|
|
|