本文摘要
泛微 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、配置项,可脱离流程上下文直接调用 |