本文摘要
泛微 OA E9 的 WorkflowToModeFormulaUtil 是一个零外部依赖的纯 Java 公式工具类,可按包路径直接调用,用于脱离流程上下文完成日期、数值、文本三类字段的类型转换与计算。文章逐一说明 year、days、datedelta、sum、average、concatenate、replace 等方法的重载用法与返回 String 的特性,并给出合同到期提醒、费用汇总、编号生成等完整示例,还介绍了与 ExpressionEvaluator 组合做表达式计算的实践。使用时需注意 month 返回 1 至 12、replace 起始位置从 1 开始、average 可变参数分母异常等坑点。

泛微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"

🚨 坑点

startnum 从 1 开始,不是从 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、配置项,可脱离流程上下文直接调用