MENU

[泛微 EC9] WorkflowToModeFormulaUtil 公式工具类使用指南

• 2026 年 07 月 05 日 • 阅读: 1 • OA

泛微OA E9 中用于工作流字段公式转换的工具类,所有方法 public static,零外部依赖,可独立使用。

适用场景

向第三方系统动态传参时,字段类型不一致需要公式转换;脱离流程上下文做数值/日期/文本计算。

类信息

项目说明
包路径weaver.formmode.interfaces.action
类名WorkflowToModeFormulaUtil
依赖无外部依赖,纯 Java 工具类
返回值所有方法返回 String,异常返回 ""

方法一览

year — 提取年份

WorkflowToModeFormulaUtil.year("2025-06-01")   // → "2025"
WorkflowToModeFormulaUtil.year("2025/6/1")     // → "2025"
WorkflowToModeFormulaUtil.year("")              // → ""

month — 提取月份(1-12)

WorkflowToModeFormulaUtil.month("2025-06-01")  // → "6"
WorkflowToModeFormulaUtil.month("2025-12-31")  // → "12"

注意:返回 1-12,不是 Calendar 的 0-11。

day — 提取日

WorkflowToModeFormulaUtil.day("2025-06-15")    // → "15"
WorkflowToModeFormulaUtil.day("2025-06-05")    // → "5"

days — 两日期天数差

// 两个重载:String 参数 / List 参数
WorkflowToModeFormulaUtil.days("2025-01-01", "2025-06-01")  // → "151"
WorkflowToModeFormulaUtil.days("2025-06-01", "2025-01-01")  // → "-151"

// List 用法
List<String> dates = Arrays.asList("2025-01-01", "2025-06-01");
WorkflowToModeFormulaUtil.days(dates);  // → "151"

支持带时间格式:"2025-01-01 08:00:00",计算时只取日期部分。

datedelta — 日期加减天数

WorkflowToModeFormulaUtil.datedelta("2025-06-01", 10)   // → "2025-06-11"
WorkflowToModeFormulaUtil.datedelta("2025-06-01", -5)   // → "2025-05-27"
WorkflowToModeFormulaUtil.datedelta("2025-12-31", 1)    // → "2026-01-01"

sum — 求和

// 可变参数(至少2个)
WorkflowToModeFormulaUtil.sum(1.0, 2.0, 3.0)             // → "6.0"

// List 参数
List<Double> list = Arrays.asList(100.5, 200.3, 300.2);
WorkflowToModeFormulaUtil.sum(list);                       // → "601.0"

abs — 绝对值

WorkflowToModeFormulaUtil.abs(-123.45)    // → "123.45"
WorkflowToModeFormulaUtil.abs(123.45)     // → "123.45"

average — 平均值

// 可变参数(至少2个)
WorkflowToModeFormulaUtil.average(2.0, 4.0)               // → "3.0"

// List 参数
List<Double> list = Arrays.asList(100.0, 200.0, 300.0);
WorkflowToModeFormulaUtil.average(list);                    // → "200.0"

average 的可变参数版本计算分母是 num3.length + 2,传 2 个以上参数时注意。

concatenate — 字符串拼接

// 可变参数(至少2个)
WorkflowToModeFormulaUtil.concatenate("姓名:", "张三", " 工号:", "001")
// → "姓名:张三 工号:001"

// List 参数
List<String> list = Arrays.asList("A", "B", "C");
WorkflowToModeFormulaUtil.concatenate(list);  // → "ABC"

replace — 子串替换

// replace(原字符串, 起始位置, 替换长度, 新字符串)
WorkflowToModeFormulaUtil.replace("Hello World", 7, 5, "Java")
// → "Hello Java"

坑点

startnum1 开始,不是从 0 开始!"Hello World" 的第 7 个字符是 W

完整调用示例

示例1:日期计算 — 合同到期提醒

import weaver.formmode.interfaces.action.WorkflowToModeFormulaUtil;

// 计算合同剩余天数
String startDate = "2025-01-01";
String endDate = "2025-12-31";
String remainDays = WorkflowToModeFormulaUtil.days(
    new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date()),
    endDate
);

// 到期前30天的日期
String warnDate = WorkflowToModeFormulaUtil.datedelta(endDate, -30);

// 提取年份用于日志
String year = WorkflowToModeFormulaUtil.year(endDate);
System.out.println(year + "年合同,剩余" + remainDays + "天");

示例2:数值聚合 — 费用汇总

// 模拟从第三方获取的费用数据
double travelFee = 1500.0;
double hotelFee = 2800.0;
double mealFee = 600.0;

// 求和
String total = WorkflowToModeFormulaUtil.sum(travelFee, hotelFee, mealFee);
// → "4900.0"

// 取绝对值(退款场景)
String refund = WorkflowToModeFormulaUtil.abs(-350.5);
// → "350.5"

// 平均日均费用
int days = 5;
String dailyAvg = WorkflowToModeFormulaUtil.average(
    Double.parseDouble(total) / days, 
    Double.parseDouble(total) / days
);

示例3:文本拼接 — 生成编号

String prefix = "PO";
String year = WorkflowToModeFormulaUtil.year("2025-06-01");  // "2025"
String seq = "001";

String orderNo = WorkflowToModeFormulaUtil.concatenate(prefix, year, seq);
// → "PO2025001"

与 ExpressionEvaluator 组合使用

最佳实践

WorkflowToModeFormulaUtil 做类型转换,ExpressionEvaluator 做表达式计算,两者搭配覆盖大多数公式场景。

import org.wltea.expression.ExpressionEvaluator;
import org.wltea.expression.datameta.Variable;
import weaver.formmode.interfaces.action.WorkflowToModeFormulaUtil;

// 1. 用 FormulaUtil 做预处理
String yearStr = WorkflowToModeFormulaUtil.year("2025-06-15");   // "2025"
String daysStr = WorkflowToModeFormulaUtil.days("2025-01-01", "2025-06-15"); // "165"

// 2. 组装变量
List<Variable> vars = new ArrayList<>();
vars.add(Variable.createVariable("amount", 50000.0));
vars.add(Variable.createVariable("days", Integer.parseInt(daysStr)));
vars.add(Variable.createVariable("threshold", 10000));

// 3. 用 ExpressionEvaluator 计算表达式
Object result = ExpressionEvaluator.evaluate(
    "amount / days * 30 > threshold", vars
);
// → true(月均 > 1万)

注意事项

要点说明
返回类型全部返回 String,数值场景需手动 Double.parseDouble()
异常处理所有方法内部 try-catch,异常返回空字符串 ""
日期格式自动兼容 -/ 分隔符,可带 HH:mm:ss
month 返回值1-12,不是 Calendar 的 0-11
replace 起始位置从 1 开始,不是从 0
线程安全所有方法无状态,线程安全
独立使用不依赖流程ID、表单ID、配置项,可脱离流程上下文直接调用