UNPKG

epic-designer

Version:

基于vue3的设计器,可视化开发页面表单

135 lines (134 loc) 3.94 kB
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 };