Browse Source

fix(rule): 修复表单规则引擎执行和数值计算问题

- 修改 FormRuleEngine 中 executeRule 方法访问修饰符为 public 并新增 executeAction 方法
- 在 Jexl3Util 中添加数值参数归一化处理,解决整数除法截断问题
- 统一在线操作服务中文件列表返回格式为 JSON 字符串保持数据契约一致性
feature/2026-08/0812-ccc-dev
chenchuchuan 6 hours ago
parent
commit
59ed6c3057
  1. 12
      common/common-online/src/main/java/apelet/common/online/rule/FormRuleEngine.java
  2. 5
      common/common-online/src/main/java/apelet/common/online/service/impl/OnlineOperationServiceImpl.java
  3. 25
      common/common-online/src/main/java/apelet/common/online/util/Jexl3Util.java

12
common/common-online/src/main/java/apelet/common/online/rule/FormRuleEngine.java

@ -80,14 +80,20 @@ public class FormRuleEngine { @@ -80,14 +80,20 @@ public class FormRuleEngine {
if (rule == null) {
return null;
}
return executeAction(rule, null, values);
}
public List<Object> executeAction(FormRule rule, OnlineEventPluginExecuteDto dto, ObjectValue values) {
if (dto == null) {
dto = new OnlineEventPluginExecuteDto();
}
List<Object> result = new ArrayList<>();
executeRule(rule, null, values, null, new OnlineEventPluginExecuteDto(), result);
executeRule(rule, null, values, null, dto, result);
return result;
}
private void executeRule(FormRule rule, OnlineForm form, ObjectValue ov, String eventCode,
OnlineEventPluginExecuteDto dto, List<Object> result) {
public void executeRule(FormRule rule, OnlineForm form, ObjectValue ov, String eventCode, OnlineEventPluginExecuteDto dto, List<Object> result) {
if (!rule.isEnable()) {
return;
}

5
common/common-online/src/main/java/apelet/common/online/service/impl/OnlineOperationServiceImpl.java

@ -2595,6 +2595,8 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { @@ -2595,6 +2595,8 @@ public class OnlineOperationServiceImpl implements OnlineOperationService {
/**
* 查询结果回填将附件上传/图片上传字段对应的 zz_online_file 数据组装成文件JSON数组回填到字段上
* <p>统一返回文件JSON数组的字符串形式历史数据业务列直接存JSON字符串新数据从 zz_online_file 组装后也转成字符串
* 与保存侧 parseOnlineFileList 的字符串入参契约一致前端无需区分新旧数据</p>
*
* @param resultList 查询结果列表
* @param table 在线数据表对象
@ -2649,7 +2651,8 @@ public class OnlineOperationServiceImpl implements OnlineOperationService { @@ -2649,7 +2651,8 @@ public class OnlineOperationServiceImpl implements OnlineOperationService {
fileJson.put("uploadFailed", false);
fileArray.add(fileJson);
}
result.put(column.getColumnName(), fileArray);
// 统一返回文件JSON字符串,与历史数据(业务列直接存JSON字符串)及保存侧(parseOnlineFileList按字符串解析)契约一致。
result.put(column.getColumnName(), fileArray.toJSONString());
}
}
}

25
common/common-online/src/main/java/apelet/common/online/util/Jexl3Util.java

@ -12,6 +12,7 @@ import org.apache.commons.lang3.StringUtils; @@ -12,6 +12,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -46,8 +47,7 @@ public class Jexl3Util { @@ -46,8 +47,7 @@ public class Jexl3Util {
// 创建Context对象,为表达式中的未知数赋值
JexlContext context = new MapContext();
if (paramMap != null) {
paramMap.forEach((key, value) ->
context.set(key.toLowerCase(), value instanceof String ? ((String) value).toLowerCase() : value)
paramMap.forEach((key, value) -> context.set(key.toLowerCase(), normalize(value))
);
}
// 使用表达式引擎创建表达式对象
@ -59,6 +59,27 @@ public class Jexl3Util { @@ -59,6 +59,27 @@ public class Jexl3Util {
return evaluate;
}
/**
* 数值参数归一整型转 Double 避免 JEXL 整数除法截断 21/2=10 应为 10.5
* BigDecimal 保留精度避免大数转 Double 丢精度String 转小写与表达式归一一致其余原样
*/
private Object normalize(Object value) {
if (value instanceof Integer) {
return ((Integer) value).doubleValue();
}
if (value instanceof Long) {
return ((Long) value).doubleValue();
}
if (value instanceof BigDecimal) {
return value;
}
if (value instanceof String) {
return ((String) value).toLowerCase();
}
return value;
}
public Map<String, Object> getMapValue(JSONObject obj, ObjectValue objectValue) {
HashMap<String, Object> map = new HashMap<>();
for (String tab : obj.keySet()) {

Loading…
Cancel
Save