泛微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、配置项,可脱离流程上下文直接调用 |
[泛微 EC9] WorkflowToModeFormulaUtil 公式工具类使用指南 by https://oneszhang.com/archives/205.html