diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormFieldVO.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormFieldVO.java index 65fb305..eff2a2a 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormFieldVO.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormFieldVO.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; import lombok.Data; +import java.util.List; + /** * 流程表单字段 VO */ @@ -20,5 +22,9 @@ public class BpmFormFieldVO { * 字段标题 */ private String title; + /** + * 子表单字段(处理布局组件) + */ + private List children; } diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmConditionOpCodeEnum.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmConditionOpCodeEnum.java new file mode 100644 index 0000000..71fc8ae --- /dev/null +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmConditionOpCodeEnum.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.bpm.enums.definition; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * BPM 条件表达式操作符枚举 + * + * @author Lesan + */ +@RequiredArgsConstructor +@Getter +public enum BpmConditionOpCodeEnum { + EQ("==", "等于", " var:getOrDefault(%s, null) == %s "), + NE("!=", "不等于", " var:getOrDefault(%s, null) != %s "), + GT(">", "大于", " var:getOrDefault(%s, null) > %s "), + GE(">=", "大于等于", " var:getOrDefault(%s, null) >= %s "), + LT("<", "小于", " var:getOrDefault(%s, null) < %s "), + LE("<=", "小于等于", " var:getOrDefault(%s, null) <= %s "), + CONTAINS("contain", "包含", " var:contains(%s, %s) "), + NOT_CONTAINS("!contain", "不包含", " !var:contains(%s, %s) "); + + private final String code; + private final String des; + private final String symbol; + + public static BpmConditionOpCodeEnum fromCode(String code) { + for (BpmConditionOpCodeEnum op : BpmConditionOpCodeEnum.values()) { + if (op.code.equalsIgnoreCase(code)) { + return op; + } + } + throw new IllegalArgumentException("未知操作符: " + code); + } + +} diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java index 67c24bb..b9c3d72 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.bpm.framework.flowable.core.util; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; @@ -247,9 +248,7 @@ public class FlowableUtils { Map formFieldsMap = new HashMap<>(); processDefinitionInfo.getFormFields().forEach(formFieldStr -> { BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); - if (formField != null) { - formFieldsMap.put(formField.getField(), formField); - } + parseFormField(formField, formFieldsMap); }); // 情况一:当自定义了摘要 @@ -273,6 +272,30 @@ public class FlowableUtils { .collect(Collectors.toList()); } + /** + * 递归解析表单字段 + */ + private static void parseFormField(BpmFormFieldVO formField, + Map formFieldsMap) { + + if (formField == null) { + return; + } + + // 如果存在 children -> 说明是布局组件 + if (formField.getChildren() != null && !formField.getChildren().isEmpty()) { + for (BpmFormFieldVO child : formField.getChildren()) { + parseFormField(child, formFieldsMap); + } + return; + } + + // 真实字段才加入 map + if (StrUtil.isNotBlank(formField.getField())) { + formFieldsMap.put(formField.getField(), formField); + } + } + // ========== Task 相关的工具方法 ========== /** diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index cfeb2c2..f11ab26 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -705,12 +705,12 @@ public class SimpleModelUtils { } // 构造规则表达式 List list = convertList(item.getRules(), (rule) -> { + // TODO @芋艿:官方文档中无convertByType方法,https://flowable.me/blog/2025/04/02/back-end-expressions/ String rightSide = NumberUtil.isNumber(rule.getRightSide()) ? rule.getRightSide() : "\"" + rule.getRightSide() + "\""; // 如果非数值类型加引号 - return String.format(" vars:getOrDefault(%s, null) %s var:convertByType(%s,%s) ", + return String.format(BpmConditionOpCodeEnum.fromCode(rule.getOpCode()).getSymbol(), rule.getLeftSide(), // 左侧:读取变量 - rule.getOpCode(), // 中间:操作符,比较 - rule.getLeftSide(), rightSide); // 右侧:转换变量,VariableConvertByTypeExpressionFunction + rightSide); // 右侧:取值变量 }); // 构造条件组的表达式 Boolean and = item.getAnd();