epic-designer
Version:
基于vue3的设计器,可视化开发页面表单
135 lines (134 loc) • 3.94 kB
JavaScript
var b = Object.defineProperty;
var N = (n, r, e) => r in n ? b(n, r, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[r] = e;
var h = (n, r, e) => N(n, typeof r != "symbol" ? r + "" : r, e);
import v from "../../../git/epic/epic-designer/node_modules/.pnpm/jsep@1.4.0/node_modules/jsep/dist/jsep.js";
const f = {
ABS: (n) => Math.abs(n),
AVERAGE: (...n) => f.SUM(...n) / (n.length || 1),
IF: (n, r, e) => n ? r : e,
MAX: (...n) => Math.max(...n),
MIN: (...n) => Math.min(...n),
// 你可以继续扩展,例如农业常用的:亩转平方米
MU_TO_SQM: (n) => n * 666.67,
SUM: (...n) => n.reduce((r, e) => (Number(r) || 0) + (Number(e) || 0), 0)
};
class d {
constructor(r = {}) {
h(this, "context");
this.context = r;
}
/**
* 执行主入口
* @param expression 表达式字符串
* @param runtimeContext 运行时实时数据(合并构造函数中的 context)
*/
calculate(r, e = {}) {
if (!r || typeof r != "string") return null;
const t = {
event: { ...this.context.event, ...e.event },
formData: { ...this.context.formData, ...e.formData },
vars: { ...this.context.vars, ...e.vars }
};
try {
const s = v(r);
return this._execute(s, t);
} catch (s) {
return console.error("[Epic: 公式解析错误]", s), null;
}
}
/**
* 运算符实现
*/
_applyOperator(r, e, t) {
switch (r) {
case "!=":
case "!==":
return e !== t;
case "*":
return e * t;
case "+":
return (Number(e) || 0) + (Number(t) || 0);
case "-":
return e - t;
case "/":
return t === 0 ? 0 : e / t;
case "<":
return e < t;
case "<=":
return e <= t;
case "==":
case "===":
return e === t;
case ">":
return e > t;
case ">=":
return e >= t;
default:
return 0;
}
}
/**
* 递归解析 AST 节点
*/
_execute(r, e) {
switch (r.type) {
// 3. 基础运算符: +, -, *, /
case "BinaryExpression": {
const t = r, s = this._execute(t.left, e), a = this._execute(t.right, e);
return this._applyOperator(t.operator, s, a);
}
// 4. 函数调用: SUM(...)
case "CallExpression": {
const t = r, a = t.callee.name.toUpperCase(), i = t.arguments.map((u) => this._execute(u, e)), o = f[a];
return o ? o(...i) : (console.warn(`Function not found: ${a}`), 0);
}
// 常量: 123, "abc"
case "Literal":
return r.value;
// 逻辑表达式: &&, ||
case "LogicalExpression": {
const t = r, s = this._execute(t.left, e), a = this._execute(t.right, e);
return t.operator === "&&" ? s && a : s || a;
}
// 带前缀的变量: $formData.qty 或 $formData.user.address.city
case "MemberExpression": {
const t = r, s = t.property, a = s.name || s.value, i = {
$event: e.event || {},
$formData: e.formData || {},
$vars: e.vars || {}
};
let o = t.object;
const u = [a];
let l = "";
for (; o; )
if (o.type === "Identifier") {
l = o.name;
break;
} else if (o.type === "MemberExpression") {
const p = o, m = p.property, y = m.name || m.value;
u.unshift(y), o = p.object;
} else
break;
let c = i[l] || {};
for (const p of u) {
if (c === null) {
c = 0;
break;
}
c = c[p];
}
return c;
}
// 5. 一元运算符: -5, !true
case "UnaryExpression": {
const t = r, s = this._execute(t.argument, e);
return t.operator === "-" ? -s : s;
}
default:
return console.warn(`Unsupported node type: ${r.type}`), 0;
}
}
}
export {
d as FormulaEngine
};